Twitter api速率限制的解决方法

时间:2012-10-14 02:48:17

标签: ruby twitter

我收集了很多用户并将它们放在变量'users'中。我正在遍历它们并尝试使用我的新Twitter帐户关注它们。然而,在大约15岁之后,我因为超出限制而被Twitter拦截。我想再次运行它,但没有我已经关注的用户。如何跟踪“用户”数组中的“i”,或以某种方式从我尚未关注的用户那里返回一个新数组?我知道像pop和unshift等方法,但我不确定'i'来自'users'数组。我是一个永久的新手,所以请尽可能多地包含细节

不是,用户实际上是'游标'而不是数组,因此,它没有长度方法

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

Twitter ::错误:: TooManyRequests:超出了速率限制

3 个答案:

答案 0 :(得分:7)

一个简单的黑客可以使用对sleep(n)的调用:

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

增加睡眠次数,直到twitter-api停止投掷错误。

通过rate-limiting实现此问题的正确解决方案。

方法调用率限制的可能ruby解决方案是glutton_ratelimit

编辑 - 并且,正如Kyle指出的那样,有a documented solution to this problem

以下是该解决方案的增强版本:

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

答案 1 :(得分:2)

有许多解决方案,但最简单的可能是shift

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

这将在处理数组时从数组中删除每个用户。

答案 2 :(得分:1)

这就是我做的事情

    def self.careful(&block)

    begin
        client = get_current_client()
        yield client

    rescue Twitter::Error::TooManyRequests => error

        current_user= User.find_by_token(client.instance_variable_get("@oauth_token"))
        current_user.update_attribute(:rate_limit_at, Time.now)
        change_current_client()
        retry

    end
end

此块使用当前客户端执行api调用。如果它达到速率限制,它会使用change_current_client()方法将客户端更改为另一个客户端,然后使用新客户端重试该调用。你可以在那里添加一个sleep()。

这可以像

一样使用
careful{|client| client.search("#something")}