風柳メモ

ソフトウェア・プログラミング関連の覚書が中心

Google App Engine経由ならTwitterのタイムライン等が取得し放題…というわけでもない?

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のシステム内で割り振られるので、どちらに当たるかは運次第。

ということかな、と推測する次第。
推測が当っているとして、何か回避する方法ありますかねぇ?教えて偉い人。

*1:20000で返ってくる場合はHTTPヘッダのX-RateLimit-Classが"api_whitelisted"となっている。通常は"api"

*2:同一処理中で、"GET"リクエストを発行する度に結果が違う場合もある。account/rate_limit_status methodの結果が150だった直後に、HTTP-Headerで20000が返ったり。またその逆もありうる