API Twitter говорит, что ограничение скорости составляет 180 (пользователь-аутентификатор), но использование твиттера ограничено только 15 вызовами.

Я использую Twitter Gem для взаимодействия с Twitter API. я использую single user authentication (не только для аутентификации приложения), как показано здесь https://github.com/sferik/twitter/blob/master/examples/Configuration.md#single-user-authentication

У меня есть страница, на которой пользователь нажимает, чтобы войти через твиттер (я использую http://sign-in-with-twitter.herokuapp.com/)

Как только пользователь проходит аутентификацию, я получаю token а также secret а затем использовать мое приложение consumer_key а также consumer_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']

У меня есть (pry) точка останова, и я бегу 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'

Я полагаю, твиттер драгоценный камень client.user делает звонок /1.1/users/show.json https://github.com/sferik/twitter/blob/master/lib/twitter/rest/users.rb#L257?

Это означает, что твиттер 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 звонков.

Кроме того, в любом случае, я могу получить весь заголовок ответа в twitter драгоценный камень, так что отладка будет легко читать x-rate-limit-limit а также x-rate-limit-remaining

Любая помощь будет оценена.

3 ответа

Вот более конкретный способ доступа к ограничениям скорости:

@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.

В случае, если кто-то выдаст такую ​​же проблему,

использование /1.1/users/show/{user_id}.json формат запроса вместо /1.1/users/show.json

Я нашел решение, изучив запросы Апиджея.

У меня была похожая ситуация, но с другой конечной точкой в ​​твиттере.

Предел 15 определяется новым клиентом при каждом вызове.

Убедитесь, что вы создали клиент только один раз, а затем выполняете вызовы API с использованием этого единственного клиента.

Другие вопросы по тегам