「Python + Tweepy」で、Twitterからのレスポンスの、HTTPヘッダを見たい。

Tweepyを使って、TwitterAPIを使ってみると、TwitterからのレスポンスとしてJSON形式データの内容を取得できます。
HTTPヘッダの内容もみたいんだけど、どこにあるのかわからない。

なぜ、HTTPヘッダの内容を見たいのかというと、アクセス制限の値をみたいから。
こちらのマニュアルによると、「HTTPヘッダにアクセスしたAPIに対するLimitが入ってる」、とのこと。
(参考)REST API Rate Limiting in v1.1 | Twitter Developers

X-Rate-Limit-Limit: the rate limit ceiling for that given request
X-Rate-Limit-Remaining: the number of requests left for the 15 minute window
X-Rate-Limit-Reset: the remaining window before the rate limit resets in UTC epoch seconds

APIの「GET application/rate_limit_status」を使えば、現状のLimitがわかるみたいなので、こちらを使ってもいい。
ただ、アプリのリトライ回数の制御とかを実装するときに、いちいち「GET application/rate_limit_status」を呼ぶのは、無駄にアクセス回数が増えてしまいイマイチよくない。

というわけで、Tweepyのソースを少しいじって、HTTPヘッダを取得してみた。

僕が使っている環境
Windows7(64Bit)
Python 2.7.3
Tweepy 2.0
Google App Engine SDK for Python 1.7.1
Aptana Studio 3.2.2


Tweepyのbinder.pyの中に「def bind_api」があります。
その中のメソッド(?)、def execute(self):の中で、最終的にresultが返却(179行目)されています。

このresultには、resp.read()をparseした結果が入っており、レスポンスの本文が抜き出されている模様です。なので、この中にはHTTPヘッダは含まれていません。
レスポンスの内容の全体は、147行目の「resp = conn.getresponse() 」にあるrespに入っています。

なので、def execute(self):の最後のreturnのところ(179行目)で、resultといっしょにrespも返却するようにしてみました。

            #return result
            return result,resp

実際に使うときは、こんな感じ。

以下は、フォローしている一覧を取得して、そのときのHTTPヘッダを取得してみた内容です。
screen_name=’******’ のところは、自分の名前に置き換えてください。
resp.getheaders()のところで、HTTPヘッダを表示しています。
(3/10追記 僕はGoogleAppEngine上で開発しているので、self.response.write()でWebブラウザにHTMLを返却して表示しています)

        auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
        auth.set_access_token(access_token, access_token_secret)
        api = tweepy.API(auth)

        (results,resp) = api.friends_ids(screen_name='******')

        self.response.write('resp.getheaders=%s<br>' % resp.getheaders())

HTTPヘッダを表示してみるとこんな感じになる。

resp.getheaders=[('status', '200 OK'), ('x-rate-limit-remaining', '10'), ('content-length', '141'), ('x-transaction', 'b709c8aa5837b816'), ('set-cookie', 'lang=ja, guest_id=v1%3A136255494281906933; Domain=.twitter.com; Path=/; Expires=Fri, 06-Mar-2015 07:29:02 UTC'), ('expires', 'Tue, 31 Mar 1981 05:00:00 GMT'), ('x-access-level', 'read-write'), ('server', 'tfe'), ('last-modified', 'Wed, 06 Mar 2013 07:29:02 GMT'), ('x-rate-limit-reset', '1362555233'), ('pragma', 'no-cache'), ('cache-control', 'no-cache, no-store, must-revalidate, pre-check=0, post-check=0'), ('date', 'Wed, 06 Mar 2013 07:29:02 GMT'), ('x-rate-limit-limit', '15'), ('x-frame-options', 'SAMEORIGIN'), ('content-type', 'application/json;charset=utf-8')]

きちんと、X-Rate-Limit-Limit、X-Rate-Limit-Remaining、X-Rate-Limit-Resetが取得できています。


3/10追記
個別の値を表示させるときは、
resp.getheader(‘x-rate-limit-limit‘)
といった感じ。

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s