GAE(のgateway・以下G/W)の全IPアドレスがTwitterのホワイトリストに登録されているわけじゃないんじゃないか、という推測です→【追記】どうも、違うっぽい、かな?(Google App Engine経由ならTwitterのタイムライン等が取得し放題…というわけでもない?(続き) - 風柳メモ)。
Twitter APIの回数制限をGAE上のプロキシで回避する方法 | Web Scratch
GAEのProxyでTwitterAPIを取得するPythonライブラリを書いた - /Users/mizchi/workplace/
あたりを読んでいて『あれ、確かGAE経由でもhourly_limitが150で返ってきた覚えが…』と思って確認してみたのですが、やはり返ってくる場合もあるみたいです。
『GAEをproxyにしているから安心』と思ってアクセスを続けた結果、知らない間にユーザリソースを喰いつくしてしまい、他の通常のアプリからアクセスできなくなる、というケースも発生しそうな気がするので、注意した方がいいかも知れません。
実験結果
GAE上の同一アプリケーションにて、Twitterに対しaccount/rate_limit_statusとstatuses/user_timelineを何回か実行してみたところ、
- hourly_limit(X-RateLimit-Limit)が150で返ってくる時と、20000で返ってくる場合がある*1。
- X-RateLimit-Limitに150が入ってきた場合は、ユーザ単位のX-RateLimit-Remainingが減算される(当然0になると次にリセットされるまでは当該ユーザは通常のGETリソース制限のあるAPIアクセスも出来なくなる)。20000が入ってきた場合は、ユーザ単位のリソースは減らない模様。
- どちらの結果が返ってくるかは、少なくとも試した範囲では予測出来ない*2。
- OAuth認証時/Basic認証時/認証なし(user_timelineなどは認証なしでも取得可)、いずれの場合でも上記のように不規則に変化する。
となりました。
なお、Twitterによれば、
IP whitelisting takes precedence to account rate limits. GET requests from a whitelisted IP address made on a user's behalf will be deducted from the whitelisted IP's limit, not the users. Therefore, IP-based whitelisting is a best practice for applications that request many users' data.
http://apiwiki.twitter.com/Rate-limiting
ということなので、少なくとも、IPアドレス単位でホワイトリスト化されているなら、ユーザ単位のリソースは減らないはずです(少なくともIP単位のリソースが無くなるまでは)。
それが減ることがあるということは、
- GAEの中にも、ホワイトリストに登録されているG/WとされていないG/Wがある。
- G/WはGAEのシステム内で割り振られるので、どちらに当たるかは運次第。
ということかな、と推測する次第。
推測が当っているとして、何か回避する方法ありますかねぇ?教えて偉い人。