最短 Twitter bot OAuth化対応 (Python編)
Twitterは2010/06/30まででBASIC認証への対応を終了してしまいます。そのため既存のbotもOAuth対応が必要です。ここにきてOAuth対応をするために、いちいちOAuthの仕組みやら何やらを調べている暇がない方に、最短手順でbotをOAuth対応させる方法をご紹介します(※ python-twitterなどのライブラリがOAuth対応していない場合については考慮していません。ごめんなさい)。
アプリケーションの登録
OAuthを使用する場合は、事前にアプリケーションをTwitterに登録しておく必要があります。登録は以下の手順で行います。
- Twitterにログインしておく。作者自身のアカウントでもbotのアカウントでもどちらでもよいです。
- http://twitter.com/oauth_clients にアクセス。
- 「新しいアプリケーションを追加」する。
- 必須項目を埋め、「アプリケーションの種類」は「クライアントアプリケーション」に、「Default Access type」は「Read & Write」に設定します。画面下のCAPTCHAを入力して登録すれば完了。
- 登録完了画面に「Consumer Key」と「Consumer Secret」が記載されているので控えておく(Consumer Secretはパスワードに当たるものなので公開しないよう気をつけてください)。
ここまでで登録は完了です。次はアクセストークンの取得です。
アクセストークンの取得
アクセストークンというのは、OAuthで使用するユーザーID/パスワードのようなものです。認証が必要なリソースへのアクセスは、このアクセストークンを渡す必要がありますが、これを取得するのが以下のステップです。
まず事前準備。使用するモジュールを入手します。これらのモジュールはbot自体からも使用します。
- http://code.google.com/p/httplib2/downloads/list からhttplib2モジュールをダウンロードする。このモジュールはpython-oauth2モジュールが依存しているものです。すでにインストール済みであればスキップしてください。
- http://github.com/simplegeo/python-oauth2/downloads からpython-oauth2モジュールをダウンロードする。すでにインストール済みで(以下略
アクセストークン取得に使用するコード
from oauth2 import Client, Token, Consumer consumer_key = '' consumer_secret = '' def split_parameter(parameters): result_list = [tuple(parameter.split('=')) for parameter in parameters.split('&')] return dict(result_list) consumer = Consumer(consumer_key, consumer_secret) client = Client(consumer, None) result = client.request('http://api.twitter.com/oauth/request_token', 'GET') request_token_map = split_parameter(result[1]) request_token = Token(request_token_map['oauth_token'], request_token_map['oauth_token_secret']) print 'Please access "http://api.twitter.com/oauth/authorize?oauth_token='+request_token.key+'".' pin = raw_input('PIN:') request_token.set_verifier(pin) client.token = request_token result = client.request('http://api.twitter.com/oauth/access_token', 'POST') access_token_map = split_parameter(result[1]) print result[1] print 'User key: '+access_token_map['oauth_token'] print 'User secret: '+access_token_map['oauth_token_secret'] raw_input('Push any key to quit.')
Botスクリプトから、Twitterにアクセスする。
アクセストークンを取得できたら、これを用いて早速アクセスします。TwitterへのOAuthアクセスには上述のとおり、python-oauth2モジュールを使用します。
- oauth2.Consumerのインスタンスを作成します。このとき、keyにはConsumer keyを、secretにはConsumer secretを指定します。
- oauth2.Tokenのインスタンスを作成します。このとき、keyにはUser keyを、secretにはUser secretを指定します。
- Consumerインスタンス、Tokenインスタンスをわたして、Clientインスタンスを作成します。
- Clientインスタンスのrequestメソッドを、Twitter APIのURLとメソッド('GET'、'POST'など)、必要であればリクエストパラメータ(URLエンコード済みのもの。ex: status=test&in_reply_to_status_id=10000)を引数として実行します。
- 必要に応じて戻り値を処理します。戻り値はhttplib2.Http.requestメソッドの戻り値です。これは2要素のタプルで0番目にはhttplib2.Responseのインスタンス(処理のステータスコードなどを持つオブジェクトです)、1番目にはレスポンスbody(xmlやjsonの中身)が設定されています。
たとえば、「こんにちは」とポストするコードは以下のようになります。
# -*- coding: utf-8 -*- from urllib import urlencode from oauth2 import Client, Consumer, Token consumer_key = '' consumer_secret = '' user_key = '' user_secret = '' client = Client(Consumer(consumer_key, consumer_secret), Token(user_key, user_secret)) client.request('http://api.twitter.com/1/statuses/update.xml', 'POST', urlencode({'status':'こんにちは'}))