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

C# LinqToTwitter - Empty media entities returned for most tweets

这是我的第一个问题,所以如果我做的不正确,我想道歉。

描述

我正在为 Mac 使用 Visual Studio 开发 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 文档中,我发现了有关媒体对象的以下内容:

The entities section will contain a media array containing a single media object if any media object has been ‘attached’ to the Tweet. If no native media has been attached, there will be no media array in the entities. For the following reasons the extended_entities section should be used to process Tweet native media: + Media type will always indicate ‘photo’ even in cases of a video and GIF being attached to Tweet. + Even though up to four photos can be attached, only the first one will be listed in the entities section. (https://developer.twitter.com/en/docs/tweets/data-dictionary/overview/entities-object.html)

所以我首先做的是查看扩展实体内部,但结果是一样的(它们是空的)。

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

Try adding the tweet_mode=extended parameter to your API call. (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. 也许我遗漏了什么,推文应该以特定方式创建? (顺便说一下,我查看了推特页面中该帐户的推文,它们都包含媒体)

    The entities section will contain a media array containing a single media object if any media object has been ‘attached’ to the Tweet

  3. 解决方法是使用TweetMode.Extendend吗?如果是,怎么解决上面显示的异常?

提前感谢所有会研究这个问题的人。

经过大量时间努力解决这个问题后,终于在 Joe Mayo (GitHub) 的帮助下找到了答案。解决方案是:

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

    tweet.TweetMode == TweetMode.Extended

    tweet.IncludeEntities == true

此后媒体实体返回成功;允许访问推文的附加媒体。

有关尝试的更多信息,请关注 link。那里解释了 Joe Mayo (GitHub) 建议的解决方案。感谢所有花时间审阅并帮助解决此问题的人。