2011年2月24日

Python の Twitter ライブラリ

Python で import twitter と記述して 2, 3 行書いたら、クラスが見つからない、というエラーに遭遇してしょんぼりしました。 ちょっと検索したら、Python の Twitter ライブラリには python-twittertwitter があり、これらが別々でしたのでメモしておきます。

なお、 httplib2oauth2 はインストールしてあるか PYTHONPATH が通っているものとします。 Google App Engine などで使う場合 (開発環境以外に配布する必要がある場合) には適当な buildout のレシピを探すか、 google-api-python-client のパッケージからコピーすれば良いと思います。 ちょっと前の記事 (Google API Python Client) のように Mercurial でローカルマシンに持っておくと便利かもしれませんね。 JSON を扱う必要がありますが、 simplejson を単体で必要とする場合は少なくなってきていると思いますので、 何なら Django をインストールしておいた方が良いかもしれません。

きほん

ライブラリを使わなくても、Twitter API は XML か JSON でデータを返してくれますので、 たとえば次のリクエストで返ってくる JSON を解析すれば良いだけです。

$ wget -qO- "http://search.twitter.com/search.json?q=fctokyo&rpp=2"

自前でデータ構造を解析するのも悪くはありませんが、特別なこだわりがなければ何らかのライブラリを使った方が効率的です。 認証が必要な場合には OAuth を使いますが、最近はたいがいのプログラミング言語でライブラリが充実してきましたので、 無理なく使い始められますね。 Twitter 用のライブラリを使うと、 依存するライブラリ (oauth2) さえ準備できていれば認証に関する部分も隠蔽してくれます。 あと、リクエストを発行するドメインが違う部分も気にしなくて良いかもしれません。

その他に tips として、 Twitter のサーバの時間は HEAD で取得できるそうです。 A couple of API fixes and changes (2010/12/01) で実装されたらしいです。 OAuth は動作しているマシンのタイムスタンプを参照しますので、そもそも時間が正確でないと認証に失敗します。 "Timestamp out of bounds" というエラーメッセージが返ってくるのは親切ですね。

python-twitter

python-twittertwitter.py という単一のファイルしかありません。 何を見れば良いか?という点に迷う必要がありませんので、ちょっと使ってみるには良いと思います。 カレントディレクトリに配置すれば import を間違えることもありませんし、 pydoc での確認も簡単です。

ソースパッケージには get_access_token.py というスクリプトが含まれており、 コンシューマートークン/シークレットを設定してから実行すると、OAuth のフローを実行してアクセストークンを取得できます。 フローを実行して... とはいえ、全自動化できる代物ではありませんので、コンソールに表示される URL を手動で Web ブラウザに打ち込んでから、認可後の PIN コードを与えてあげる必要があります。

Python の中で使う場合は Api クラスのメソッドを呼び出すことでリクエストを発行します。 クラスコメントのままですが、次のようにして使います。

>>> import twitter
>>> api = twitter.Api()
>>> api.GetPublicTimeline()
>>> api.GetUserTimeline("fctokyo_express")

認証が必要な操作を実行する場合は、 Api クラスのコンストラクタで指定します。

>>> api = twitter.Api(consumer_key='twitter consumer key',
                      consumer_secret='twitter consumer secret',
                      access_token_key='the_key_given',
                      access_token_secret='the_key_secret')
>>> api.GetFriends()
>>> api.PostUpdate('I love python-twitter!')

PostUpdate() ではなく、 PostUpdates() を使うと、連続した投稿にしてくれるそうです。 この辺りは自前で実装するのではなく、ライブラリを使うメリットと言えそうです。

twitter

twitter パッケージはディレクトリ内に複数のファイルが含まれており、コマンドライン用のスクリプトもあります。 easy_install などを使ってインストールすると、 twitter コマンドと twitterbot コマンドがインストールされます。 twitter コマンドは CUI 環境で使うためのもので、 twitterbot は IRC にメッセージを送るボットだそうです。 設定情報、認証情報は外部の .ini ファイルなりホームディレクトリのドットファイルなりを使います。

Python の中で使う場合は Twitter クラスのメソッドを呼び出すことでリクエストを発行します。 API Documentation に記載されているパスをそのまま反映したスタイルで記述できます。 最初は、何をいってるんだ?? と思いましたが、使ってみると納得できました。 スラッシュをドットに脳内変換するだけで良いはずです。 パラメータもドキュメントに記載されているままのはずです。

>>> from twitter import Twitter
>>> tw1 = Twitter()
>>> tw1.statuses.public_timeline()
>>> tw2 = Twitter(domain="search.twitter.com")
>>> tw2.search(q="#fctokyo")

認証が必要な操作を実行する場合は、 authOAuth インスタンスを与えます。 このコンストラクタの引数の順番が python-twitterApi とは異なりますが、その辺はまぁまぁ、、と。

>>> from twitter.oauth import OAuth
>>> auth = OAuth('the_key_given', 'the_key_secret',
                 'twitter consumer key', 'twitter consumer secret')
>>> tw3 = Twitter(auth=auth)
>>> tw3.statuses.update(status="Post using twitter library.")

ライブラリ自体の API をどうこうというよりは、公式の API Documentation を見れば良いので、 パラメータに関する注意なども合わせて検討できるのは嬉しいですね。

まとめ

python-twittertwitter というふたつのライブラリに目を通しました。 どちらも PyPI に登録されていますので簡単に導入できると思いますが、 両方ともが import twitter になります。 システム全体に渡ってインストールする場合には注意が必要です。

個人的には twitter パッケージの方が良いんじゃないかなーと思いました。 ここでは紹介していませんが、 twitter.oauth_dance を使うことで、認証フローも簡単にカバーできます。

いずれにしても、使っているライブラリがどっちなのか、という基本的な確認が必要ですね。。

2 件のコメント:

Unknown さんのコメント...

tweepyが楽でいいよ。oauth認証もやってくれる。oauth2は対応してたっけな?

Shigeru さんのコメント...

さんくす。
認証用のライブラリは oauth みたいね。
Dependencies:
Python-OAuth
**Bundled with this library

少なくとも import して「あっれー??」ってことがないのは嬉しいw