Twitter API を Python ライブラリの Tweepy でがんがん実行していると API を受け付けてくれなくなるときがある。
API は各エンドポイントで単位時間あたりの受付回数を制限されているので、それを超えるとエラーとなる。
Tweepy では、API 認証をセットする時のオプションを加えることで、
- レート制限が補充されるまで自動的に待つ
- レート制限の補充を待っている時の通知をする
を制御できる。
- wait_on_rate_limit:レート制限が補充されるのを自動的に待つかどうか
- wait_on_rate_limit_notify:Tweepyがレート制限の補充を待っているときに通知を出力するかどうか
具体的には以下のように書く。
import tweepy CONSUMER_KEY="XXXXXXXXXXX" CONSUMER_SECRET="XXXXXXXXXXX" ACCESS_TOKEN="XXXXXXXXXXX-XXXXXXXXX" ACCESS_SECERET="XXXXXXXXXXXXXXXXXXX" auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET) auth.set_access_token(ACCESS_TOKEN, ACCESS_SECERET) # wait_on_rate_limit、wait_on_rate_limit_notify のセット api = tweepy.API(auth, wait_on_rate_limit=True, wait_on_rate_limit_notify=True)
レート補充に待たされると以下のように補充を待っている情報とあわせて、あと何秒で補充が完了するかの応答が返ってくる。
bash-3.2$ python twitter_followBack_hiro_businessX.py Rate limit reached. Sleeping for: 172 hiro_businessX :---------------------------------------- hiro_businessX : amano@人生これから🐾をフォローします。
各レートの規定の詳細はこちらを参照
Rate limits | Docs | Twitter Developer
Standard API v1.1 rate limits per window
POST endpoints
Endpoint | Rate limit window | Rate limit per user | Rate limit per app |
---|---|---|---|
POST statuses/update | 3 hours* | 300* | 300* |
POST statuses/retweet/:id | 3 hours* | 300* | 300* |
POST favorites/create | 24 hours | 1000 | 1000 |
POST friendships/create | 24 hours | 400 | 1000 |
POST direct_messages/events/new | 24 hours | 1000 | 15000 |
GET endpoints
Endpoint | Requests / window per user | Requests / window per app |
---|---|---|
GET account/verify_credentials | 75 | 0 |
GET application/rate_limit_status | 180 | 180 |
GET favorites/list | 75 | 75 |
GET followers/ids | 15 | 15 |
GET followers/list | 15 | 15 |
GET friends/ids | 15 | 15 |
GET friends/list | 15 | 15 |
GET friendships/show | 180 | 15 |
GET geo/id/:place_id | 75 | 0 |
GET help/configuration | 15 | 15 |
GET help/languages | 15 | 15 |
GET help/privacy | 15 | 15 |
GET help/tos | 15 | 15 |
GET lists/list | 15 | 15 |
GET lists/members | 900 | 75 |
GET lists/members/show | 15 | 15 |
GET lists/memberships | 75 | 75 |
GET lists/ownerships | 15 | 15 |
GET lists/show | 75 | 75 |
GET lists/statuses | 900 | 900 |
GET lists/subscribers | 180 | 15 |
GET lists/subscribers/show | 15 | 15 |
GET lists/subscriptions | 15 | 15 |
GET search/tweets | 180 | 450 |
GET statuses/lookup | 900 | 300 |
GET statuses/mentions_timeline | 75 | 0 |
GET statuses/retweeters/ids | 75 | 300 |
GET statuses/retweets_of_me | 75 | 0 |
GET statuses/retweets/:id | 75 | 300 |
GET statuses/show/:id | 900 | 900 |
GET statuses/user_timeline | 900 | 1500 |
GET trends/available | 75 | 75 |
GET trends/closest | 75 | 75 |
GET trends/place | 75 | 75 |
GET users/lookup | 900 | 300 |
GET users/search | 900 | 0 |
GET users/show | 900 | 900 |
GET users/suggestions | 15 | 15 |
GET users/suggestions/:slug | 15 | 15 |
GET users/suggestions/:slug/members | 15 | 15 |