【问题标题】:workaround for Twitter api rate limitingTwitter api 速率限制的解决方法
【发布时间】:2013-08-02 02:03:14
【问题描述】:

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

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

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

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

【问题讨论】:

  • @kyle 谢谢,那个代码有这行 'sleep error.rate_limit.reset_in' 我该如何设置 15 分钟?
  • 请让标题反映真正的问题,这可能不是关于“删除项目”,而是“尝试在推特上关注时的TooManyRequests”..
  • @pst toomanyrequests 不是真正的问题。我想知道如何从数组中删除这些项目,无论上下文如何。
  • 那么不要包含不相关的内容/错误消息..
  • @pst 提供上下文并非无关紧要

标签: ruby twitter


【解决方案1】:

一个简单的黑客可以利用对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

【讨论】:

  • 谢谢,但我对 Kyle 的解决方案有一个疑问……该代码有 'sleep error.rate_limit.reset_in' 这一行,你知道我是如何将它设置为 15 分钟的,这是推荐的时间再试一次?
  • 用一个函数示例更新了我的答案,该函数在超过速率限制时实现了 Kyle 的解决方案,等待时间为 15 分钟。
  • 但是当它重试时,它会从中断的地方继续吗?还是从头开始?
  • 在我展示的两个示例中,它将从中断处继续。
  • @user1647484 那么为什么问题的标题是指从数组中删除东西? :)
【解决方案2】:

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

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

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

【讨论】:

  • @markreed 'users' 实际上是一个游标(不是数组)并且没有长度方法..
【解决方案3】:

这就是我所做的

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

【讨论】:

    猜你喜欢
    • 2016-04-21
    • 2014-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-22
    • 1970-01-01
    • 2022-11-10
    相关资源
    最近更新 更多