Twitter APIのレートリミット情報を取得する(Rubyで)
2021/09/12
Twitter APIを使った機能の開発をしている時、何度もAPIを叩くのであとどれくらい叩けるのか気になる
しかし、レートリミット情報を取得できるエンドポイントは用意されているが、使っているtwitter gemにはそのメソッドが用意されてないので自前で用意するしかない
Why was Twitter::API#rate_limit_status removed? · Issue #430 · sferik/twitter
ちゃんと経緯を全て読んだわけではないけど、「Twitter::Error:TooManyRequestsでrescueしてあげればよくない?」らしい
メソッドを用意しない理由にはなっていないような。。。
実装
任意のエンドポイントが叩けるTwitter::REST::Request
クラスが用意されているので実装は簡単
見やすいようにformatador gemを使ってテーブルフォーマットで出力する
app.rb
require 'bundler/inline'
gemfile do
source 'https://rubygems.org'
gem 'twitter'
gem 'formatador'
end
client = Twitter::REST::Client.new do |config|
config.consumer_key = "YOUR_CONSUMER_KEY"
config.consumer_secret = "YOUR_CONSUMER_SECRET"
config.access_token = "YOUR_ACCESS_TOKEN"
config.access_token_secret = "YOUR_ACCESS_SECRET"
end
response = Twitter::REST::Request.new(client, :get, '/1.1/application/rate_limit_status.json').perform
rate_limit_status = response[:resources].values.each_with_object([]) do |endpoints, array|
endpoints.each do |endpoint, values|
array.push(
endpoint: endpoint,
limit: values[:limit],
remaining: values[:remaining],
reset: Time.at(values[:reset])
)
end
end
Formatador.display_table(rate_limit_status)
$ ruby app.rb
+-------------------------+--------+-----------+---------------------------+
| endpoint | limit | remaining | reset |
+-------------------------+--------+-----------+---------------------------+
| /lists/list | 15 | 15 | 2021-09-11 19:37:14 +0900 |
+-------------------------+--------+-----------+---------------------------+
| /lists/memberships | 75 | 75 | 2021-09-11 19:37:14 +0900 |
+-------------------------+--------+-----------+---------------------------+
| /lists/subscribers/show | 15 | 15 | 2021-09-11 19:37:14 +0900 |
+-------------------------+--------+-----------+---------------------------+
...
+-------------------------+--------+-----------+---------------------------+
| /trends/place | 75 | 75 | 2021-09-11 19:37:14 +0900 |
+-------------------------+--------+-----------+---------------------------+
| /live_pipeline/events | 180 | 180 | 2021-09-11 19:37:14 +0900 |
+-------------------------+--------+-----------+---------------------------+
| /graphql | 15 | 15 | 2021-09-11 19:37:14 +0900 |
+-------------------------+--------+-----------+---------------------------+
消費されているエンドポイントのみ表示
全エンドポイントが出力されても見づらいので、消費されているエンドポイントだけ出力させる
Formatador.display_table(rate_limit_status.select { |v| v[:limit] != v[:remaining] })
$ ruby app.rb
+-----------------------------+-------+-----------+---------------------------+
| endpoint | limit | remaining | reset |
+-----------------------------+-------+-----------+---------------------------+
| /users/:id | 900 | 887 | 2021-09-11 19:18:10 +0900 |
+-----------------------------+-------+-----------+---------------------------+
| /users/lookup | 900 | 895 | 2021-09-11 19:30:28 +0900 |
+-----------------------------+-------+-----------+---------------------------+
| /followers/list | 15 | 12 | 2021-09-11 19:30:50 +0900 |
+-----------------------------+-------+-----------+---------------------------+
| /account/verify_credentials | 75 | 72 | 2021-09-11 19:30:49 +0900 |
+-----------------------------+-------+-----------+---------------------------+
定期実行
開発中はwatchコマンドで定期実行させておく
レートリミット情報の取得するエンドポイントは15分間に180回まで叩けるので、5秒間隔であれば問題なさそう
$ watch -n 5 ruby app.rb