Twitter api表示速率限制为180(由user-auth),但使用twitter gem仅限于15个呼叫

时间:2014-05-01 19:11:20

标签: ruby rest twitter twitter-oauth twitter-gem

我正在使用twitter gem与twitter API进行交互。我正在使用single user authentication(不是仅应用程序身份验证),如https://github.com/sferik/twitter/blob/master/examples/Configuration.md#single-user-authentication

所示

我有一个页面,用户点击以使用Twitter登录(我正在使用http://sign-in-with-twitter.herokuapp.com/

用户通过身份验证后,我会获得tokensecret,然后使用我的应用consumer_keyconsumer_secret以及用户token登录并secret初始化Twitter::REST::Client,如下所示

module Ktwitter
  class Manager
    attr_accessor :client
    def initialize token, token_secret
      @client = Twitter::REST::Client.new do |config|
        config.consumer_key        = XXXXXXXXXXXXX
        config.consumer_secret     = ZZZZZZZZZZZZZ
        config.access_token        = token
        config.access_token_secret = token_secret
      end
    end

    def user
      @client.user
    end
  end
end


obj = Ktwitter::Manager.new request.env['omniauth.auth']['credentials']['token'], request.env['omniauth.auth']['credentials']['secret']

我有一个(撬)断点,在那里我运行obj.client.user 15次(不到1分钟 - 只是继续击打)然后我得到rate_limit警告

[1] pry(#<T>)> obj.client.user
=> #<Twitter::User id=177777>
[2] pry(#<T>)> obj.client.user
=> #<Twitter::User id=177777>
[3] pry(#<T>)> obj.client.user
=> #<Twitter::User id=177777>
[4] pry(#<T>)> obj.client.user
=> #<Twitter::User id=177777>
[5] pry(#<T>)> obj.client.user
=> #<Twitter::User id=177777>
[6] pry(#<T>)> obj.client.user
=> #<Twitter::User id=177777>
[7] pry(#<T>)> obj.client.user
=> #<Twitter::User id=177777>
[8] pry(#<T>)> obj.client.user
=> #<Twitter::User id=177777>
[9] pry(#<T>)> obj.client.user
=> #<Twitter::User id=177777>
[10] pry(#<T>)> obj.client.user
=> #<Twitter::User id=177777>
[11] pry(#<T>)> obj.client.user
=> #<Twitter::User id=177777>
[12] pry(#<T>)> obj.client.user
=> #<Twitter::User id=177777>
[13] pry(#<T>)> obj.client.user
=> #<Twitter::User id=177777>
[14] pry(#<T>)> obj.client.user
=> #<Twitter::User id=177777>
[15] pry(#<T>)> obj.client.user
=> #<Twitter::User id=177777>
[16] pry(#<T>)> obj.client.user
Twitter::Error::TooManyRequests: Rate limit exceeded
from /Users/xyz/.rvm/gems/ruby-2.1.1/gems/twitter-5.8.0/lib/twitter/rest/response/raise_error.rb:17:in `on_complete'

我认为twitter gem client.user拨打/1.1/users/show.json https://github.com/sferik/twitter/blob/master/lib/twitter/rest/users.rb#L257

这意味着twitter api在15分钟的窗口内获得了15个电话的限制率限制?但是根据API文档https://dev.twitter.com/docs/api/1.1/get/users/show它是180,而不是15.那么为什么我在15次调用后受到限制?

当我使用Twitter API控制台https://dev.twitter.com/console时,我会调用/1.1/get/users/show并显示180作为速率限制。所以我不确定为什么twitter gem仅在15次通话后才能获得限制。

enter image description here

无论如何,我可以在twitter gem中获取整个响应标头,以便调试易于阅读x-rate-limit-limitx-rate-limit-remaining

任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:1)

如果有人发出同样的问题,

使用 /1.1/users/show/{user_id}.json 请求格式代替/1.1/users/show.json

我通过检查apigee的请求找到了这个问题。

答案 1 :(得分:1)

这是访问速率限制的更具体方式:

@client = Twitter::REST::Client.new do |config|
  config.consumer_key        = XXXXXXXXXXXXX
  config.consumer_secret     = ZZZZZZZZZZZZZ
  config.access_token        = token
  config.access_token_secret = token_secret
end
response = @client.get('/1.1/application/rate_limit_status.json')

然后你可以检查response哈希。

我希望这有助于某人。目前版本的ruby gem是5.14.0。

答案 2 :(得分:0)

我有类似的情况,但在Twitter上有另一个终点。

15限制来自每次拨打电话时新客户端的创建。

确保只创建一次客户端,然后使用该客户端进行api调用。