让所有关注者使用Linq到Twitter

时间:2014-03-08 11:46:00

标签: c# linq-to-twitter

我正在尝试使用以下代码段获取所有关注者列表。每个调用得到200个follwers所以我在循环中结束以获得所有关注者。用户有23.1K粉丝,但是当它达到2800粉丝时,我的“速率限制”超出了错误。我发现twitter允许每个用户15个请求,有什么办法可以修改下面的代码来获取所有关注者吗?

private static async Task<List<User>> GetTwitterFollowersAsync(
         ulong twitterUserId, SingleUserAuthorizer auth, int? maxFollowers)
{
    var followerss = maxFollowers ?? 15000;
    long nextCursor = -1;
    var users = new List<User>();

    try
    {
        while (nextCursor != 0)
        {
            var twitterCtx = new TwitterContext(auth);              
            var friends = await twitterCtx.Friendship
                .Where(f => f.Type == FriendshipType.Show
                     && f.SourceScreenName == "John_Papa"
                     && f.Count == followerss && f.Cursor == nextCursor)
                .Select(f => new TwitterData()
                {
                     NewCursor = f.CursorMovement.Next,
                     Followers = f.Users.Where(t => !t.Protected)
                            .Take(followerss).Select(s => s).ToList()
                })
                .SingleOrDefaultAsync();

            nextCursor = friends.NewCursor;
            users.AddRange(friends.Followers);
        }
        return users;
    }
    catch (Exception ex)
    {
        return null;
    }
}

1 个答案:

答案 0 :(得分:3)

LINQ to Twitter在TwitterContext上具有RateLimitXxx属性,在每次查询后都会更新。它们反映了Twitter中此速率限制文档中描述的信息:

https://dev.twitter.com/docs/rate-limiting/1

对于每种查询类型的速率限制,每个查询数有15分钟的窗口。您可以使用以下逻辑将代码括在一个循环中:

  1. 执行查询
  2. 如果您拥有所需的所有结果,则打破循环。
  3. 检查费率限制
  4. 如果超出了速率限制,请等到15分钟的间隔到期。
  5. 如果未超过速率限制,请保持循环。