2013-05-17 30 views
7

twitter apiからユーザーのフォロワーを取得するために、ルビーの宝石Twitter(https://github.com/sferik/twitter)を使用しようとしています。Ruby Twitter Gem、レート制限を超えました

ドキュメント(https://dev.twitter.com/docs/api/1/get/followers/ids)によると、twitterは1回のリクエストで5000人のユーザーを返します。レート制限の設定のさえずりごとに15分(https://dev.twitter.com/docs/rate-limiting/1.1/limits

問題につき15本の電話をかけることが私にできます

私は以上75000人のフォロワー(* 15 5000)を持つユーザーのフォロワーを取得するとき、私は "取得レート制限を超過しました。 '

私がgemメソッドTwitter.followers_id(user)を使用しているとき、私はすべてのフォロワーを自動的に取得し、カーソル付き5000のバケットではありません。私はこの宝石が内部的に世話していると思うので、私はこれらの要求を管理したり、遅らせることができません。

宝石のドキュメントには、レート制限(https://github.com/sferik/twitter#rate-limiting)の例がありますが、既に検索されたユーザーの世話をするのか、新鮮なものから再開するのかは分かりません。

私の質問はどのように、いつ、どのフォロワーを得るためにこれにスロットリングメカニズムを適用しますか?

よろしく

+0

これはあなたがこれを理解しましたか?私はまた困惑しています:( – Gregology

+0

@Gregologyいいえ、私はできませんでした私は作っていたアプリケーションのためにRoRからPHPに切り替えました。PHPはとても簡単です –

答えて

0

各カーソル応答/ libに配置されているTwitterの宝石でcursor_from_response_with_user方法にさえずり/ API/utils.rb

https://github.com/sferik/twitter/blob/master/lib/twitter/api/utils.rb

def cursor_from_response_with_user(collection_name, klass, request_method, path, args, method_name) 
    puts "sleeping 60" 
    sleep 60 
    arguments = Twitter::API::Arguments.new(args) 
    merge_user!(arguments.options, arguments.pop || screen_name) unless arguments.options[:user_id] || arguments.options[:screen_name] 
    cursor_from_response(collection_name, klass, request_method, path, arguments.options, method_name) 
end 

をスリープコマンドが追加されます最低でも60秒かかるので、15分ごとに15件のリクエストを処理しません。これはちょっとしたハックですが、この問題が75K + follower_idsのためにソートされるまではうまくいくでしょう。

6

この問題の回避策は非常によく説明されていますhere

MAX_ATTEMPTS = 3 
num_attempts = 0 
begin 
    num_attempts += 1 
    retweets = Twitter.retweeted_by_user("sferik") 
rescue Twitter::Error::TooManyRequests => error 
    if num_attempts <= MAX_ATTEMPTS 
    # NOTE: Your process could go to sleep for up to 15 minutes but if you 
    # retry any sooner, it will almost certainly fail with the same exception. 
     sleep error.rate_limit.reset_in 
    retry 
    else 
    raise 
    end 
end 
+0

これは実際にレート制限に当たるそれがあまりにも多くなった場合、Twitterで[ブラックリストに登録]する危険性があります(https://dev.twitter.com/rest/public/rate-limiting#Blacklisting)。より良いアプローチは[作品中](https: /github.com/sferik/twitter/pull/626)。 –

関連する問題