2016-01-22 73 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

相關問題