2

以下のコード スニペットを使用して、すべてのフォロワー リストを取得しようとしています。呼び出しごとに 200 人のフォロワーが得られるので、ループをまとめてすべてのフォロワーを取得します。ユーザーのフォロワー数は 23.1K ですが、フォロワー数が 2800 に達すると "Rate Limit" Exceed エラーが発生します。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;
    }
}
4

1 に答える 1

3

LINQ to Twitter には、クエリのたびに更新される TwitterContext の RateLimitXxx プロパティがあります。これらは、Twitter のレート制限に関する次のドキュメントに記載されている情報を反映しています。

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

クエリの種類ごとのレート制限で、クエリの数ごとに 15 分のウィンドウがあります。次のロジックを使用して、コードをループで囲むことができます。

  1. クエリを実行
  2. 必要な結果がすべて得られたら、ループを中断します。
  3. レート制限を確認する
  4. レート制限を超えた場合は、15 分の間隔が満了するまで待ちます。
  5. レート制限を超えていない場合は、ループを続けます。
于 2014-03-21T01:47:44.767 に答える