<目次>
(1) Twitter APIのRate Limit Exceedエラー(code – 88)の意味について
(1-1) APIコールのリミット(Rate Limit)について
(1-2) RateLimitのモニタリングについて
(1-3) Rate Limit Exceedエラー(code – 88)の対策について
(1) Twitter APIのRate Limit Exceedエラー(code – 88)の意味について
Twitter APIを使っていると、多くの方は次のエラーメッセージに遭遇した事があるのでは?と思います。本記事ではこのエラーの内容や原因についてご紹介致します(対処方法は下記の別記事をご参照ください)。
⇒(参考)Rate Limit Exceedエラー(code – 88)を回避するための簡易的な対策について
(エラーメッセージ)
429:Returned in API v1.1 when a request cannot be served due to the application's rate limit having been exhausted for the resource. See Rate Limiting in API v1.1.(https://dev.twitter.com/docs/rate-limiting/1.1) message - Rate limit exceeded code - 88
(図111)
(1-1) APIコールのリミット(Rate Limit)について
区分 | Twitter4jメソッド名 | コールするAPI名 | リクエスト数上限/15分 | 標準件数/ページ | 最大件数/ページ | クエリ可能件数/15分 |
共通 | showUser | GET users/:id | 900 | 1 | 1 | 900 |
ツイート検索 | search | GET search/tweets | 180 | ヒットした数による | ? | 180 |
ツイート検索 | searchUsers | GET users/search | 900 | 20 | ? | 900 |
ツイート検索 | getUserTimeline | GET statuses/user_timeline | 900 | 20 | 20 | 900 |
フォロワー系 | getFollowersList | GET followers/list | 15 | 20 | 200 | 3000 |
フォロワー系 | getFollowersIDs | GET followers/ids | 15 | ? | 5000 | 75000 |
フォロー系 | getFriendsList | GET friends/list | 15 | 20 | 200 | 3000 |
フォロー系 | getFriendsIDs | GET friends/ids | 15 | ? | 5000 | 75000 |
リツイート者一覧 | getRetweets | GET statuses/retweets/:id | 75 | 100 | 100 | 7500 |
リツイートID一覧 | getRetweeterIDs | GET statuses/retweeters/ids | 75 | ? | 200 | 15000 |
(1-2) RateLimitのモニタリングについて
ratelimits = [Twitter型インスタンス].getRateLimitStatus();
返却されるデータは次のようなイメージです↓。
あとは、このMapの各キーをループするなりして、欲しいエンドポイントの情報を抜き出す事で、現在の状況をリアルタイムに把握する事ができます。以下はそのコードのイメージです。
//# RateLimit情報をMapに格納 Map<String,RateLimitStatus> ratelimits = new TreeMap<>(); ratelimits = [Twitter型インスタンス].getRateLimitStatus(); //# 探したいエンドポイントの残数を取得していく for(String endpoint : ratelimits.keySet()) { if(endpoint.equals(RoutingTable.ep_showUser)) { RateLimitStatus status = ratelimits.get(endpoint); remain_showuser = status.getRemaining(); total_showuser = status.getLimit(); }else if(endpoint.equals(RoutingTable.ep_search)) { RateLimitStatus status = ratelimits.get(endpoint); remain_search = status.getRemaining(); total_search = status.getLimit(); }else if・・・ //~エンドポイントの数だけ続く~