如何使用LinqToTwitter获取Hashtag上的所有推文

我试图让所有推文(计数总推文数)属于主题标签。 我的function在这里,如何使用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(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(tweet.ID.ToString(), tweet.Text)); tweetcount++; } catch { } } } } 

这是一个例子。 请记住, 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(); List 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的exception。 盲目阅读N条推文的任何其他技术都可能会迫使您浪费速率限制并降低应用程序的可扩展性。

  • 提示:请记住为给定的搜索字词保存SinceID ,如果您要保存推文,则在下次使用该搜索字词进行搜索时,不要重读相同的推文。

有关此机制的更多信息,请阅读Twitter文档中的使用时间轴 。

只想用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 }); 

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

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