【问题标题】:How To Get All Tweets on Hashtag using LinqToTwitter如何使用 LinqToTwitter 获取 Hashtag 上的所有推文
【发布时间】:2016-04-28 20:52:38
【问题描述】:

我正在尝试让所有推文(计算推文总数)属于主题标签。我的功能在这里,我如何使用 maxID 和 sinceID 来获取所有推文。什么是代替“计数”?我不知道。

if (maxid != null)
        {
            var searchResponse =
                await
                (from search in ctx.Search
                 where search.Type == SearchType.Search &&
                 search.Query == "#karne" &&
                 search.Count == Convert.ToInt32(count)
                 select search)
                 .SingleOrDefaultAsync();

            maxid = Convert.ToString(searchResponse.SearchMetaData.MaxID);

            foreach (var tweet in searchResponse.Statuses)
            {
                try
                {
                    ResultSearch.Add(new KeyValuePair<String, String>(tweet.ID.ToString(), tweet.Text));
                    tweetcount++;
                }
                catch {}
            }

            while (maxid != null && tweetcount < Convert.ToInt32(count))
            {
                maxid = Convert.ToString(searchResponse.SearchMetaData.MaxID);
                searchResponse =
                    await
                    (from search in ctx.Search
                     where search.Type == SearchType.Search &&
                     search.Query == "#karne" &&
                     search.Count == Convert.ToInt32(count) && 
                     search.MaxID == Convert.ToUInt64(maxid)
                     select search)
                     .SingleOrDefaultAsync();
                foreach (var tweet in searchResponse.Statuses)
                {
                    try
                    {
                        ResultSearch.Add(new KeyValuePair<String, String>(tweet.ID.ToString(), tweet.Text));
                        tweetcount++;
                    }
                    catch { }
                }
            }

        }

【问题讨论】:

    标签: c# linq twitter linq-to-twitter


    【解决方案1】:

    这是一个例子。请记住,MaxID 用于当前会话,并防止重新阅读您已在当前会话中处理的推文。 SinceID 是您为此搜索词收到的最旧的推文,可帮助您避免重新阅读您在之前的会话中已针对此搜索词处理过的推文。本质上,您正在创建一个窗口,其中MaxID 是下一个要获取的最新推文,SinceID 是您不想阅读过去的最旧推文。在给定搜索词的第一个会话中,您可以将 SinceID 设置为 1,因为您还没有最旧的推文。会话结束后,保存SinceID,以免您不小心重新阅读推文。

        static async Task DoPagedSearchAsync(TwitterContext twitterCtx)
        {
            const int MaxSearchEntriesToReturn = 100;
    
            string searchTerm = "twitter";
    
            // oldest id you already have for this search term
            ulong sinceID = 1;
    
            // used after the first query to track current session
            ulong maxID; 
    
            var combinedSearchResults = new List<Status>();
    
            List<Status> searchResponse =
                await
                (from search in twitterCtx.Search
                 where search.Type == SearchType.Search &&
                       search.Query == searchTerm &&
                       search.Count == MaxSearchEntriesToReturn &&
                       search.SinceID == sinceID
                 select search.Statuses)
                .SingleOrDefaultAsync();
    
            combinedSearchResults.AddRange(searchResponse);
            ulong previousMaxID = ulong.MaxValue;
            do
            {
                // one less than the newest id you've just queried
                maxID = searchResponse.Min(status => status.StatusID) - 1;
    
                Debug.Assert(maxID < previousMaxID);
                previousMaxID = maxID;
    
                searchResponse =
                    await
                    (from search in twitterCtx.Search
                     where search.Type == SearchType.Search &&
                           search.Query == searchTerm &&
                           search.Count == MaxSearchEntriesToReturn &&
                           search.MaxID == maxID &&
                           search.SinceID == sinceID
                     select search.Statuses)
                    .SingleOrDefaultAsync();
    
                combinedSearchResults.AddRange(searchResponse);
            } while (searchResponse.Any());
    
            combinedSearchResults.ForEach(tweet =>
                Console.WriteLine(
                    "\n  User: {0} ({1})\n  Tweet: {2}",
                    tweet.User.ScreenNameResponse,
                    tweet.User.UserIDResponse,
                    tweet.Text));
        }
    

    这种方法看起来像很多代码,但确实让您可以更好地控制搜索。例如您可以检查推文并根据推文的内容确定查询的次数(如CreatedAt)。您可以将查询包装在 try/catch 块中,以在您超过速率限制或 twitter 出现问题时监视 HTTP 429,从而让您记住您所在的位置并继续。您还可以监视 twitterContext RateLimit 属性以查看您是否接近并提前避免 HTTP 429 异常。任何其他盲目阅读 N 条推文的技术都可能迫使您浪费速率限制并降低您的应用程序的可扩展性。

    • 提示:请记住为给定的搜索字词保存SinceID,如果您 保存推文,以防止下次重新阅读相同的推文 您使用该搜索词进行搜索。

    有关此机制的更多信息,请阅读 Twitter 文档中的 Working with Timelines

    【讨论】:

    • 这段代码真的不起作用。它进入一个无限循环,吃掉设备上的内存。达到超过 1.3 GB 的 RAM,然后崩溃。一直在使用互联网。我究竟做错了什么?我使用了完全相同的代码
    • @Everyone 搜索词“twitter”带来了很多推文。因此,您可以将其更改为“LINQ to Twitter”之类的内容,这样不会获得太多流量。您还可以检查“创建日期”以确保您只能及时回溯这么久。另一种选择是设置要停止的推文数量。另外,请注意,SinceID 设置为 1,这意味着搜索将继续,直到 Twitter 停止生成结果或您到达 sinceID。为后续调用保存您最近的 sinceID 有助于避免请求重复的推文。阅读使用时间线链接了解更多信息。
    • 是的,我意识到了这一点。它不会停止,直到条件告诉它这样做。有趣的方法。 +1 :)
    【解决方案2】:

    只是想说,使用 Tweetinvi 会很简单:

    // If you want to handle RateLimits
    RateLimit.RateLimitTrackerOption = RateLimitTrackerOptions.TrackAndAwait;
    
    var tweets = Search.SearchTweets(new TweetSearchParameters("#karne")
    {
        MaximumNumberOfResults = 10000
        MaxId = 243982 // If you want to start at a specific point
    });
    

    【讨论】:

    • 真的能得到所有的推文吗?
    • 这在简单的场景中可能没问题。但是,这可能是一种浪费,因为您可以在后续搜索中轻松阅读重复的推文,并且可能会超过大量推文的速率限制,从而导致降低性能和可扩展性的异常。
    • 真的能得到所有的推文吗?是的,它在某个时间点发生。但正如乔给你的解决方案一样,我很高兴它解决了它。
    • 我已经为有兴趣的用户添加了 RateLimits 和 MaxId 的示例!
    【解决方案3】:

    TweetInvi 现在更简单了。您需要做的就是:

    var matchingTweets = Search.SearchTweets("#AutismAwareness");
    

    【讨论】:

    • 详细说明你的答案
    猜你喜欢
    • 1970-01-01
    • 2017-07-21
    • 2018-11-05
    • 2014-10-26
    • 1970-01-01
    • 2015-08-05
    • 2019-09-08
    • 2013-01-28
    • 2015-08-14
    相关资源
    最近更新 更多