【问题标题】:Twitter API 1 to 1.1 Rss to Json Conversion--WPF Application using C#Twitter API 1 to 1.1 Rss to Json Conversion--WPF Application using C#
【发布时间】:2013-05-01 12:33:45
【问题描述】:

由于 twitter 很快就会贬低 API 版本 1,我决定转换旧的应用程序以允许它与新的 1.1 API 一起使用。根据我对 1.1 的了解,我知道您必须在拨打电话之前进行身份验证,并使用 JSON 而不是 RSS 来序列化数据。该应用程序是使用 xmal 和 c# 进行 WPF 编码的

我能够使用 LINQ to Twitter 库成功进行身份验证,但在使用 JSON 时我迷失了方向。这是我用于 API v1 的代码

 else if (auth.IsAuthorized && i == 2)
        {
            SyndicationClient client = new SyndicationClient();
            SyndicationFeed feed = await client.RetrieveFeedAsync(new Uri("https://api.twitter.com/1/statuses/user_timeline.rss?screen_name=ScreenName"));
            {
                _model.Tweets.Clear();
                foreach (var item in feed.Items)
                {
                    _model.Tweets.Add(new Tweet
                    {
                        Name = "@ExampleHandle",
                        Message = item.Title.Text,
                        Image = new BitmapImage(new Uri("ms-appx:Assets/test_image", UriKind.RelativeOrAbsolute)),
                    });
                }
            }

        }
    }

这是推文类的代码

 public class Tweet
{
    public String Name { get; set; }
    public String Message { get; set; }
    public ImageSource Image { get; set; }
}

我想知道是否有人可以指出我编写 JSON 等价物的正确方向。提前致谢!

【问题讨论】:

    标签: c# wpf xaml twitter json-deserialization


    【解决方案1】:

    对于那些您稍后阅读此问题的人,我能够解决此问题。以下是我根据您的情况给出的答案。

    如果你只是想使用 Json 而不是 RSS,你可以这样做:

       HttpClient client = new HttpClient();
                HttpResponseMessage response = await client.GetAsync(new Uri("https://api.twitter.com/1/statuses/user_timeline.json?screen_name=ScreenName"));
                string ApiResponse = await response.Content.ReadAsStringAsync();
    
                List<Tweet> tweets = await JsonConvert.DeserializeObjectAsync<List<Tweet>>(ApiResponse);
                _model.Tweets.Clear();
                foreach (var item in tweets)
                {
                    _model.Tweets.Add(new Tweet
                    {
                        Name = "@UserName",
                        Message = item.Text,
                        Image = new BitmapImage(new Uri("ms-appx:Assets/sampleLocalImage", UriKind.RelativeOrAbsolute)),
                    });
    

    但是,由于 API 1.1,您必须在每次调用 API 之前进行身份验证,以便使用 Linq to Twitter。授权代码如下:

       var auth = new SingleUserAuthorizer
            {
                Credentials = new InMemoryCredentials
                {
                    ConsumerKey = TwitterSettings.ConsumerKey,
                    ConsumerSecret = TwitterSettings.ConsumerKeySecret,
                    OAuthToken = TwitterSettings.AccessToken,
                    AccessToken = TwitterSettings.AccessTokenSecret,
                }
            };
            auth.Authorize();
    

    以及执行搜索的代码(如果使用 Twitter API 1.1,这是您要使用的代码):

     var twitterCtx = new TwitterContext(auth);
    
                var statusTweets =
               from tweet in twitterCtx.Status
               where tweet.Type == StatusType.User
                     && tweet.ScreenName == "ScreenName"
               select tweet;
    
    
                _model.Tweets.Clear();
                foreach (var item in statusTweets)
                {
                    _model.Tweets.Add(new Tweet
                 {
                     Name = item.User.Name,
                     Message = item.Text,
                     Image = new BitmapImage(new Uri(item.User.ProfileImageUrl)),
                 });
    

    【讨论】:

      【解决方案2】:

      我不熟悉 Twitter API,但我认为HttpClient(如果您使用的是 .NET 4.0,则可以使用here)和Newtonsoft.Json 的某种组合是合适的。

      Newtonsoft.Json 不是 Microsoft 创作的,但它是每个人都使用的包(包括 Microsoft 的默认 Web 模板)。在这一点上,旧的 Microsoft JSON 序列化的东西几乎已经死了。

      【讨论】:

      • 斯蒂芬,感谢您的帮助。我能够让它工作,但是,我后来发现如果你使用 LinqToTwitter,你需要以不同的方式执行对 API 的调用。我将在下面发布我的答案
      猜你喜欢
      • 2022-11-09
      • 2015-01-07
      • 2011-08-19
      • 2013-10-15
      • 2022-12-27
      • 1970-01-01
      • 2012-07-02
      • 2017-11-29
      • 2022-12-28
      相关资源
      最近更新 更多