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 с использованием этого единственного клиента.