2014-12-05 94 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