最短 Twitter bot OAuth化対応 (Python編)

Twitterは2010/06/30まででBASIC認証への対応を終了してしまいます。そのため既存のbotもOAuth対応が必要です。ここにきてOAuth対応をするために、いちいちOAuthの仕組みやら何やらを調べている暇がない方に、最短手順でbotをOAuth対応させる方法をご紹介します(※ python-twitterなどのライブラリがOAuth対応していない場合については考慮していません。ごめんなさい)。

アプリケーションの登録

OAuthを使用する場合は、事前にアプリケーションをTwitterに登録しておく必要があります。登録は以下の手順で行います。

  1. Twitterにログインしておく。作者自身のアカウントでもbotのアカウントでもどちらでもよいです。
  2. http://twitter.com/oauth_clients にアクセス。
  3. 「新しいアプリケーションを追加」する。
  4. 必須項目を埋め、「アプリケーションの種類」は「クライアントアプリケーション」に、「Default Access type」は「Read & Write」に設定します。画面下のCAPTCHAを入力して登録すれば完了。
  5. 登録完了画面に「Consumer Key」と「Consumer Secret」が記載されているので控えておく(Consumer Secretはパスワードに当たるものなので公開しないよう気をつけてください)。

ここまでで登録は完了です。次はアクセストークンの取得です。

アクセストークンの取得

アクセストークンというのは、OAuthで使用するユーザーID/パスワードのようなものです。認証が必要なリソースへのアクセスは、このアクセストークンを渡す必要がありますが、これを取得するのが以下のステップです。

まず事前準備。使用するモジュールを入手します。これらのモジュールはbot自体からも使用します。

  1. http://code.google.com/p/httplib2/downloads/list からhttplib2モジュールをダウンロードする。このモジュールはpython-oauth2モジュールが依存しているものです。すでにインストール済みであればスキップしてください。
  2. http://github.com/simplegeo/python-oauth2/downloads からpython-oauth2モジュールをダウンロードする。すでにインストール済みで(以下略

必要なモジュールがそろったら、アクセストークンを取得します。Pythonスクリプトを使います。

  1. 後述のコードを上述2モジュールが使用できる状態で、Pythonにて実行してください(変数consumer_key, consumer_secretは先ほど控えた値に書き換えてください)。
  2. コンソールに表示されるアドレスにWebブラウザでアクセスすると、拒否/承諾を選択する画面が出るので、承諾します。すると7桁の数値(PIN)が表示されるので、それをコンソールに打ち込みます。
  3. 結果としてUser keyとUser secretが表示されるので、これも控えてください。

アクセストークン取得に使用するコード

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モジュールを使用します。

  1. oauth2.Consumerのインスタンスを作成します。このとき、keyにはConsumer keyを、secretにはConsumer secretを指定します。
  2. oauth2.Tokenのインスタンスを作成します。このとき、keyにはUser keyを、secretにはUser secretを指定します。
  3. Consumerインスタンス、Tokenインスタンスをわたして、Clientインスタンスを作成します。
  4. Clientインスタンスのrequestメソッドを、Twitter APIのURLとメソッド('GET'、'POST'など)、必要であればリクエストパラメータ(URLエンコード済みのもの。ex: status=test&in_reply_to_status_id=10000)を引数として実行します。
  5. 必要に応じて戻り値を処理します。戻り値はhttplib2.Http.requestメソッドの戻り値です。これは2要素のタプルで0番目にはhttplib2.Responseのインスタンス(処理のステータスコードなどを持つオブジェクトです)、1番目にはレスポンスbody(xmljsonの中身)が設定されています。

たとえば、「こんにちは」とポストするコードは以下のようになります。

# -*- 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':'こんにちは'}))