我收集了很多用户并将它们放在变量'users'中。我正在遍历它们并尝试使用我的新Twitter帐户关注它们。然而,在大约15岁之后,我因为超出限制而被Twitter拦截。我想再次运行它,但没有我已经关注的用户。如何跟踪“用户”数组中的“i”,或以某种方式从我尚未关注的用户那里返回一个新数组?我知道像pop和unshift等方法,但我不确定'i'来自'users'数组。我是一个永久的新手,所以请尽可能多地包含细节
不是,用户实际上是'游标'而不是数组,因此,它没有长度方法
>> users.each do |i|
?> myuseraccount.twitter.follow(i)
>> end
Twitter ::错误:: TooManyRequests:超出了速率限制
答案 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")}