【问题标题】:how to work with pagination using since_id and max_id in linqtotwitter v2.1?如何在 linqtotwitter v2.1 中使用 since_id 和 max_id 进行分页?
【发布时间】:2014-12-06 05:52:43
【问题描述】:

我曾使用 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);

【问题讨论】:

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


【解决方案1】:

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

  1. 在您的数据存储中为SinceID 创建一个字段,与由屏幕名称(或UserID)表示的用户相关联。
  2. 将该字段初始化为 1。不要将其设置为 0,因为 Tweet ID #0 不存在,Twitter 会返回错误。
  3. 在您的代码中,使用该用户的数据存储中的值初始化sinceID,第一次时该值为1。
  4. 删除代码中对 sinceID 的任何其他更改,包括 if (statusResponse.Count > 0) 块内的更改。
  5. 当您的算法完成后,使用您刚刚从 if 块中删除的那一行来获取下一个 sinceID 应该是什么。
  6. 在您的数据存储中为该用户保存 sinceID 的值,以便下次为该用户运行此算法时可以再次读取它。

如需更多信息,请访问我的博客文章与Timelines with LINQ to Twitter合作。

【讨论】:

  • 是否可以使用查询中的条件 (tweet.CreatedAt >= dateFrom && tweet.CreatedAt
  • 那不是输入参数,所以不能在查询中使用。但是,您可以进行查询,然后在 Twitter 数据返回给您之后使用 LINQ to Objects 查询来过滤它。 LINQ to Twitter 文档解释了什么是有效的输入查询。
猜你喜欢
  • 2012-03-31
  • 1970-01-01
  • 1970-01-01
  • 2015-12-07
  • 2012-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多