Twitter API速率限制的解决方法

4
我已经收集了一堆用户并将它们放在变量“users”中。 我正在循环遍历它们,并尝试使用我的新Twitter帐户关注它们。 但是,在约15个用户之后,Twitter因超过速率限制而停止了我。 我想再次运行此操作,但不包括已经关注的用户。 如何在关注后从“users”数组中删除“i”,或以某种方式返回一个新数组,其中包含我尚未关注的用户? 我知道有像pop和unshift等方法,但我不确定“users”数组中的“i”来自哪里。 我是一个永久的新手,所以请尽可能详细地说明。
注意,实际上,“users”是一个“游标”,而不是数组,因此没有长度方法。
>> users.each do |i|
?> myuseraccount.twitter.follow(i)
>> end

Twitter::Error::TooManyRequests: 请求频率超限


@kyle 谢谢,那段代码有这一行 'sleep error.rate_limit.reset_in',我该如何将其设置为15分钟? - BrainLikeADullPencil
1
请确保标题反映出真正的问题,这个问题可能不是关于“删除一个项目”,而是关于“在尝试在Twitter上关注时出现了TooManyRequests”。 - user166390
@pst toomanyrequests 不是真正的问题。我想知道如何从数组中删除这些项,而不考虑上下文。 - BrainLikeADullPencil
那么请不要包含无关的内容或错误信息。 - user166390
一个光标是由Twitter API创建的某个对象。它类似于数组,但没有长度方法。这就是我所知道的全部。 - BrainLikeADullPencil
显示剩余3条评论
3个回答

7

一种简单的技巧可以利用对sleep(n)的调用:

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

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

通过速率限制可以解决这个问题。

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

编辑 - 正如Kyle指出的那样,有文档记录的解决方案

下面是这个解决方案的增强版:

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

我正在控制台中输入这个内容,但是它给了我一个动态常量赋值的错误。 - BrainLikeADullPencil
常量不能在 Ruby 方法内定义。 - BrainLikeADullPencil
你可以将它移动到标准变量中或在其他地方进行配置。无论哪种方式,我已经修复了错误。 - Adam Eberlin
“users” 实际上是一个游标(而不是数组),它没有长度方法... - BrainLikeADullPencil
2
@user1647484,那问题的标题为什么是关于从数组中删除元素呢? :) - Mark Reed
显示剩余4条评论

2

有很多解决方案,但在您的情况下最简单的可能是 shift

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

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

@markreed 'users' 实际上是一个游标(而不是数组),并且没有长度方法。 - BrainLikeADullPencil

1

Here is what I did

    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")}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接