2016-01-22 24 views
5

我试图让所有推文(计数总推特数)属于hashtag。我的功能在这里,如何使用maxID和sinceID获取所有推文。什么是而不是“数”?我不知道。如何使用LinqToTwitter获取所有关于Hashtag的推文

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 { } 
       } 
      } 

     } 

回答

9

下面是一个例子。请记住,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,从而让您记住自己的位置并恢复。您还可以监视twitterContextRateLimit属性,以查看您是否正在接近并提前避免HTTP 429出现异常。任何其他盲目阅读N个推文的技术都可能会迫使您浪费速度限制,并使您的应用程序缩小规模。

  • 提示:记得保存SinceID对于给定的搜索词,如果你 节省鸣叫,从读重相同鸣叫下一次 你与搜索项的搜索继续。

欲了解更多关于此机制的信息,请在Twitter文档中阅读Working with Timelines

+0

这段代码并不真正起作用。它进入了一个无限循环,即设备上的EATS内存。达到超过1.3 GB的RAM,然后崩溃。一直在使用互联网。我究竟做错了什么?我使用了相同的代码 – Everyone

+0

@Everyone搜索字词“twitter”正在带回很多推文。因此,您可以将其更改为“LINQ to Twitter”之类的内容,但不会获得尽可能多的流量。您也可以检查Created At的日期,以确保您只能回溯到目前为止。另一个选择是设置一些推文停止在。此外,请注意,SinceID设置为1,这意味着搜索将继续,直到Twitter停止生成结果或您到达SinceID。为后续呼叫保存最新的SinceID有助于避免请求重复的推文。阅读使用时间表链接了解更多信息。 –

+0

是的,我意识到这一点。它不会停止,直到条件告诉它这样做。有趣的方法。 +1 :) – Everyone

0

只想说,随着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 
}); 
+0

它真的得到所有的推文? –

+0

这可能在简单的情况下可以。但是,这可能会造成浪费,因为您可以轻松地在后续搜索中读取重复的推文,并且可能会超过大量推文的速率限制,从而导致异常,从而降低性能和可伸缩性。 –

+0

它是否真的获得了所有的推文?是的,它在一个时间点。 但是,乔给你一个解决方案,我很高兴它解决了它。 – Linvi

0

TweetInvi现在更简单了。所有你需要做的是:

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

详细说明你的答案 – Billa

相关问题