4

多数のユーザーを収集し、それらを変数「users」に入れました。私はそれらをループして、新しい Twitter アカウントでフォローしようとしています。しかし、約15時以降、レート制限を超えているため、Twitterに停止されています。これをもう一度実行したいのですが、すでにフォローしているユーザーは除きます。フォローされた後に「ユーザー」の配列から「i」を削除するにはどうすればよいですか? または、まだフォローしていないユーザーを含む新しい配列を返すにはどうすればよいですか? pop や unshift などのメソッドは知っていますが、「users」配列内のどこから「i」が来ているのかわかりません。初心者なので出来るだけ詳しく教えてください

いいえ、ユーザーは実際には「カーソル」であり、配列ではないため、長さメソッドはありません

>> users.each do |i|
?> myuseraccount.twitter.follow(i)
>> end

Twitter::エラー::TooManyRequests: レート制限を超えました

4

3 に答える 3

7

単純なハックでは、次の呼び出しを利用できますsleep(n)

>> users.each do |i|
?>   myuseraccount.twitter.follow(i)
?>   sleep(3)
>> end

twitter-apiエラーのスローが停止するまでスリープカウントを増やします。

この問題の適切な解決策は、を介して達成されrate-limitingます。

メソッド呼び出しのレート制限の可能なルビーソリューションは、glutton_ratelimitです。

編集-そして、カイルが指摘したように、この問題に対する文書化された解決策があります。

以下は、そのソリューションの拡張バージョンです。

def rate_limited_follow (account, user)
  num_attempts = 0
  begin
    num_attempts += 1
    account.twitter.follow(user)
  rescue Twitter::Error::TooManyRequests => error
    if num_attempts % 3 == 0
      sleep(15*60) # minutes * 60 seconds
      retry
    else
      retry
    end
  end
end

>> users.each do |i|
?>   rate_limited_follow(myuseraccount, i)
>> end
于 2012-10-14T02:57:42.867 に答える
2

いくつかの解決策がありますが、あなたのケースで最も簡単なのはおそらくshift次のとおりです。

while users.length > 0 do
  myuseraccount.twitter.follow(users.first)
  users.shift
end

これにより、各ユーザーが処理されるたびにアレイから削除されます。

于 2012-10-14T02:55:29.777 に答える