2014-12-05 95 views
1

我曾使用linqtotwitter從Twitter獲取推文。
但是,如果我嘗試使用sinceid和maxid將推文拉回空,並且我還在查詢中使用範圍日期執行,我一次只能從一個推文中獲取推文。 與下面的代碼我只能夠得到只有100 tweets.what我做錯了
感謝如何使用linqtotwitter v2.1中的since_id和max_id進行分頁處理?

我的代碼

var auth = new SingleUserAuthorizer 
     { 
      Credentials = new InMemoryCredentials 
      { 
       ConsumerKey = "xxxxx", 
       ConsumerSecret = "xxxxx", 
       OAuthToken = "xxxxx", 
       AccessToken = "xxxxxxx" 
      } 
     }; 
     var twitterCtx = new TwitterContext(auth); 
     var ownTweets = new List<Status>(); 
     ulong sinceId = 0; 
     ulong maxID = 0; 
     int lastStatusCount = 0; 
     var dateFrom = DateTime.Now.AddDays(-20); 
     bool flag = true; 
     var statusResponse = new List<Status>(); 

     statusResponse = (from tweet in twitterCtx.Status 
           where tweet.Type == StatusType.User 
            && tweet.ScreenName == screenname 
            && tweet.Count == 100 
            && (tweet.CreatedAt >= dateFrom && tweet.CreatedAt <= DateTime.Now) 
           select tweet).ToList(); 

     if (statusResponse.Count > 0) 
     { 
      maxID = statusResponse.Min(status => ulong.Parse(status.StatusID)) - 1; 
      ownTweets.AddRange(statusResponse); 
      sinceId = Convert.ToUInt64(ownTweets.Last().StatusID); 
     } 
     do 
     { 
      int rateLimitStatus = twitterCtx.RateLimitRemaining; 
      if (rateLimitStatus != 0) 
      { 
       statusResponse = (from tweet in twitterCtx.Status 
          where tweet.Type == StatusType.User 
            && tweet.ScreenName == screenname 
            && tweet.SinceID == sinceId && tweet.MaxID == maxID 
            && tweet.Count == 100 
            && (tweet.CreatedAt >= dateFrom && tweet.CreatedAt <= DateTime.Now) 
          select tweet).ToList(); 


         lastStatusCount = statusResponse.Count; 

         if (lastStatusCount != 0) 
         { 
          maxID = statusResponse.Min(status => ulong.Parse(status.StatusID)) - 1; 

          ownTweets.AddRange(statusResponse); 
         } 
         else 
         { 
          flag = false; 
         } 
      } 
      else 
      { 
       flag = false; 
      } 

     } 
     while (flag); 
+0

可能的重複[如何使用LinqToTwitter獲取所有關於Hashtag的推文](http://stackoverflow.com/questions/34943598/how-to-get-all-tweets-on-hashtag-using-linqtotwitter) – 2016-10-24 08:12:33

回答

1

你可以通過改變解決這個問題,你如何初始化SinceID ,它代表了要檢索的最古老的推文。請記住,您正在向列表中反向工作,直到您到達SinceID。

  1. 在您的數據存儲中創建一個與屏幕名稱(或用戶ID)所代表的用戶關聯的SinceID字段。
  2. 將該字段初始化爲1.不要將其設置爲0,因爲Tweet ID#0不存在,Twitter將返回錯誤。
  3. 在您的代碼中,使用來自該用戶的數據存儲的值初始化sinceID,這將在第一次通過時爲1。
  4. 刪除代碼中對sinceID的任何其他更改,包括if(statusResponse.Count> 0)塊內的一個更改。
  5. 當你的算法完成後,使用你剛剛從if塊中移除的那一行來得到下一個自然標識應該是的。
  6. 在您的數據存儲中爲該用戶保存該值的sinceID,以便在下次爲該用戶運行此算法時再次讀取它。

欲瞭解更多信息,請訪問我的博客文章與Timelines with LINQ to Twitter一起工作。

+0

i會嘗試ñ讓你知道..感謝 – 2014-12-06 05:08:49

+0

是否有可能使用像查詢條件(tweet.CreatedAt> = dateFrom && tweet.CreatedAt <= DateTime.Now)。當我使用這個時,我變空了 – 2014-12-06 06:10:05

+0

這不是輸入參數,所以你不能在查詢中使用它。但是,您可以執行查詢,然後使用LINQ to Objects查詢在Twitter數據返回給您之後過濾該查詢。 LINQ to Twitter文檔解釋什麼是有效的輸入查詢。 – 2014-12-06 20:03:28