首页 > 解决方案 > 带有 Tweetmode.Extended 的空全文属性 [5 月 30 日更新]

问题描述

我正在使用 L2T(5.0.0 beta 2)编写一个 .Net Core(2.1 预览版,C# 7.3)流控制台应用程序,但即使strm.TweetMode == TweetMode.Extended查询返回“compat”推文,全文属性也是空的。

您可以使用下面的 L2T 查询重现这一点。

我在网上搜索,我发现了类似的东西(使用“搜索”而不是“流媒体”)但没有答案,除了添加&& strm.TweetMode == TweetMode.Extended,我做了。

有任何想法吗?

        try
        {
            await
                (from strm in twitterCtx.Streaming
                        .WithCancellation(cancelTokenSrc.Token)
                 where
                    strm.Type == StreamingType.Filter
                    && strm.Track == "twitter"
                    && strm.Language == "nl"
                    && strm.TweetMode == TweetMode.Extended
                 select strm)
                .StartAsync(async strm =>
                {
                    await HandleStreamResponse(strm);
                    if (count++ >= 20)
                        cancelTokenSrc.Cancel();
                });
        }

[ 5月30日更新]

发现了一些东西。它在子程序“HandleStreamResponse”中(代码如下)。和都为所有推文返回“Compat” Status.TweetMode Status.ExtendedTweet.TweetMode但推文的全文在status.ExtendedTweet.FullText

但即使有此检查,转发也会被截断为最多 140 个字符。我的节目不需要转推,所以我将它们过滤掉。

我还不知道如何直接从流中过滤转推(可能吗?),所以我从流结果中检查状态的转推状态。它在下面的代码中。

仅供参考:在此子例程的 Linq To Twitter 示例中,Joe Mayo 使用以下代码行,但这不起作用:Console.WriteLine("{0}: {1} {2}", status.StatusID, status.User.ScreenNameResponse, status.Text ?? status.FullText);

即使&& strm.TweetMode == TweetMode.Extended在 L2T 查询中,status.FullText也是空的。

下面的示例中的代码比必要的要多,但为了清楚起见,我使用了它。

static async Task<int> HandleStreamResponse(StreamContent strm)
    {
        switch (strm.EntityType)
        {
            case StreamEntityType.Status:
                var status = strm.Entity as Status;

                if (status.RetweetedStatus.StatusID == 0)
                {
                    if (status.ExtendedTweet.FullText != null)
                    {
                        Console.WriteLine("Longer than 140 - \"@{0}\": {1} (TweetMode:{2})", 
                            status.User.ScreenNameResponse, status.ExtendedTweet.FullText, status.TweetMode);
                    }
                    else
                    {
                        Console.WriteLine("Shorter than 140 - \"@{0}\": {1} (TweetMode:{2})", 
                            status.User.ScreenNameResponse, status.Text, status.TweetMode);
                    }
                }

                // Console.WriteLine("{0}: {1} {2}", status.StatusID, status.User.ScreenNameResponse,  status.Text ?? status.FullText);
                break;
            default:
                Console.WriteLine("Unknown - " + strm.Content + "\n");
                break;
        }
        return await Task.FromResult(0);
    }
}

标签: twitterlinq-to-twitter

解决方案


以下是我的观察:

  1. status.ExtentendedTweet.FullText应该在正常情况下持有推文。
  2. 但是,如果推文被转发,status.RetweetedStatus.ExtendedTweet.FullText则应保留该推文。
  3. FullText如果在这两种情况下都找不到,请使用status.Text.

我正在使用以下内容更新示例:

    case StreamEntityType.Status:
        var status = strm.Entity as Status;
        string text = null;
        if (status.ExtendedTweet?.FullText != null)
            text = status.ExtendedTweet?.FullText;
        else if (status.RetweetedStatus?.ExtendedTweet?.FullText != null)
            text = status.RetweetedStatus?.ExtendedTweet?.FullText;
        else
            text = status.Text;

        Console.WriteLine("Status - @{0}: {1}", status.User.ScreenNameResponse, text);
        break;

注意:通过Twitter 文档(请参阅标准流)TweetMode不适用于流。此外,文档说ExtentedTweet应该始终与FullText. 正如我们所看到的,这并不是实践中的全部情况。我将Streaming.TweetMode在即将发布的版本中标记为已过时。


推荐阅读