如何在linqtotwitter v2.1中使用since_id和max_id处理分页?

时间:2014-12-05 19:01:25

标签: c#-4.0 twitter linq-to-twitter

我曾使用linqtotwitter从twitter获取推文。
但是,如果我尝试使用sinceid拉取推文并且maxid返回空,我也可以一次只推送一个推文,我也会在查询中执行范围日期。 使用下面的代码我只能得到100条推文。我做错了什么 感谢

我的代码

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);

1 个答案:

答案 0 :(得分:1)

您可以通过更改初始化SinceID的方式来解决此问题,该ID表示要检索的最旧的推文。请记住,您在列表中向后工作,直至到达SinceID。

  1. 在数据存储中为SinceID创建一个字段,该字段与screenname(或UserID)所代表的用户相关联。
  2. 将该字段初始化为1.不要将其设置为0,因为推文ID#0不存在,Twitter将返回错误。
  3. 在您的代码中,使用该用户的数据存储中的值初始化sinceID,该值首次为1。
  4. 删除代码中对sinceID的任何其他更改,包括if(statusResponse.Count&gt; 0)块内的更改。
  5. 当您的算法完成后,使用刚从if块中删除的那一行来获取下一个SinceID应该是什么。
  6. 在此数据存储中为此用户保存sinceID的值,以便下次为该用户运行此算法时再次读取该值。
  7. 有关详细信息,请访问我的博客文章使用Timelines with LINQ to Twitter