4

我收集了一堆用户并将它们放入变量“用户”中。我正在循环浏览它们并尝试使用我的新 Twitter 帐户关注它们。但是,大约 15 点后,我因超出速率限制而被 Twitter 阻止。我想再次运行它,但没有我已经关注的用户。在他们被关注后,如何从“用户”数组中删除“我”,或者以某种方式从我尚未关注的用户中返回一个新数组?我知道诸如 pop 和 unshift 等方法,但我不确定 'i' 来自 'users' 数组中的哪个位置。我是一个永远的新手,所以请包括尽可能多的细节

不,用户实际上是一个“光标”而不是一个数组,因此,它没有长度方法

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

Twitter::Error::TooManyRequests:超出速率限制

4

3 回答 3

7

一个简单的黑客可以利用调用sleep(n)

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

增加睡眠计数,直到twitter-api停止抛出错误。

这个问题的适当解决方案是通过rate-limiting.

方法调用速率限制的一个可能的 ruby​​ 解决方案是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 回答
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")}
于 2013-05-03T01:54:43.837 回答