C#LinqToTwitter - 为大多数推文返回空媒体实体

时间:2018-06-06 17:46:40

标签: c# twitter nuget-package visual-studio-mac linq-to-twitter

这是我的第一个问题,所以如果我没有正确地做这件事,我想道歉。

描述

我正在使用Visual Studio for Mac开发一个C#移动应用程序,并且已经安装了LinqToTwitter nuget包(版本4.2.1)。我需要从帐户中检索所有推文(我已经拥有凭据)。我正在使用的代码如下:

var auth = new ApplicationOnlyAuthorizer()
{
    CredentialStore = new InMemoryCredentialStore {
      ConsumerKey = socialMedia.twt_consumer_key,
      ConsumerSecret = socialMedia.twt_consumer_secret
    }
};

await auth.AuthorizeAsync();

var ctx = new TwitterContext(auth);

var tweets = 
    await
    (from tweet in ctx.Status
     where tweet.Type == StatusType.User && 
          tweet.ScreenName == socialMedia.twt_screen_name && 
          tweet.Count == 30
     select tweet)
    .ToListAsync();

List<Tweet> list = (from tweet in tweets
    select new Tweet
    {
        StatusID = tweet.StatusID,
        ScreenName = tweet.User.ScreenNameResponse,
        Text = tweet.Text,
        ImageUrl = tweet.User.ProfileImageUrl,
        MediaUrl = tweet?.Entities?.MediaEntities?.FirstOrDefault()?.MediaUrl
    })
    .ToList();

问题

拨打此电话后,我会收到返回的推文列表。所有这些都与所需的帐户相关联,并包含我将在应用程序中使用的几乎所有必要信息。尝试访问MediaEntities时会出现此问题;从返回的30条推文中,只有2条包含信息,其中大多数是空的;这就是这条线的原因:

MediaUrl = tweet?.Entities?.MediaEntities?.FirstOrDefault()?.MediaUrl

已尝试的内容

我一直在寻找这个问题的解决方案,但不幸的是我找不到合适的解决方案。

在Twitter文档中,我找到了关于Media对象的以下内容:

  

实体部分将包含媒体数组   包含单个媒体对象(如果有任何媒体对象)   '附加'到推文。如果没有附加本地媒体,那里   将不是实体中的媒体数组。由于以下原因   extended_entities部分应该用于处理Tweet native   媒体:   +即使在视频和GIF附加到Tweet的情况下,媒体类型也将始终显示“照片”。   +即使最多可以附加四张照片,也只会在实体部分列出第一张照片。   (https://developer.twitter.com/en/docs/tweets/data-dictionary/overview/entities-object.html

所以我最初做的是查看扩展实体,但结果是相同的(它们是空的)。

查看其他类似问题的帖子,我发现了以下内容:

  

尝试将tweet_mode =扩展参数添加到API调用中。   (https://twittercommunity.com/t/media-entities-not-showing-on-most-returned-tweets/77375

所以我在查询中添加了以下代码:

&& tweet.TweetMode == TweetMode.Extended

但后来我得到了一个我无法解决的例外:

Captured Exception

我的猜测是它与LinqToTwitter的问题有关(但不能保证这一点)。

最后我尝试在查询中包含一些其他行(没有解决问题):

&& tweet.IncludeEntities == true
&& tweet.IncludeRetweets == true

问题

  1. 代码中有问题吗?身份验证过程是否错误,是否需要包含所有4个字段(ConsumerKey,ConsumerSecret,OAuthToken,AccessToken)以实现我想要实现的目标? (请注意,连接成功,因为排除媒体实体后正确返回推文列表)。

  2. 也许我错过了一些内容,推文应该以特定的方式创建? (顺便说一下,我在推特页面上查看了帐户中的推文,它们都包含媒体)

      

    实体部分将包含一个包含单个的媒体数组   媒体对象,如果任何媒体对象已“附加”到推文

  3. 使用TweetMode.Extendend的解决方法是什么?如果是这样,如何解决上面显示的异常?

  4. 提前感谢所有想要研究这个问题的人。

1 个答案:

答案 0 :(得分:0)

最后,经过大量时间解决此问题,在Joe Mayo (GitHub)的帮助下找到了答案。解决方案是:

  1. 将nuget更新为5.0.0-beta3版本。
  2. 从nuget更新所有dependencies(如上述版本链接所建议)。
  3. 在推文查询中添加以下属性:

    tweet.TweetMode == TweetMode.Extended

    tweet.IncludeEntities == true

此后,媒体实体成功返回;启用对推文附加媒体的访问。

有关尝试过的内容的更多信息,请访问this链接。在那里,说明了Joe Mayo (GitHub)建议的解决方案。感谢所有抽出宝贵时间审查并帮助解决此问题的人。