高木のブログ

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

参考


Written by ytkg, Twitter, GitHub

Pixela