DjangoでOauth認証を経由してTwitterAPIを叩く方法

先にはっきりいっておきます。tweepyみたいなパッケージ使った方がずっと楽だとおもいます。自分でもそう思っていたのですが、後々Facebook等々への応用もあったのでOAuthの流れを理解しておくためにOauth2だけで書いてみました。以前Railsで書いた「RubyonRailsでOAuth経由でTwitterのタイムラインを取得する」のDjango版です。Djangoというか、Python版ですね。

「Oauth2も使わないで書けよ」というツッコミは覚悟の上です。w

# -*- coding: utf-8 -*-
from django.shortcuts import render_to_response
from django.http import *
from xml.etree.ElementTree import *
import urllib
import oauth2 as oauth

request_token_url = 'http://twitter.com/oauth/request_token'
access_token_url = 'http://twitter.com/oauth/access_token'
authorize_url = 'http://twitter.com/oauth/authorize'

timeline_url = "http://api.twitter.com/1/statuses/user_timeline.xml"

consumer_key = 'consumer_key '
consumer_secret = 'consumer_secret '

consumer = oauth.Consumer(key=consumer_key, secret=consumer_secret)

def index(request):

    client = oauth.Client(consumer)
    resp, content = client.request(
                    request_token_url,
                    'POST',
                    body=urllib.urlencode(
                    	{
                    		'oauth_callback':
                    		'http://127.0.0.1:8000/callback/'
                    	}
                    )
               )

    request_token = {}
    for item in content.split('&'):
        _data = item.split('=')
        request_token.update({_data[0]: _data[1]})

    request.session['request_token'] = request_token
    return HttpResponseRedirect("%s?oauth_token=%s"
                                % (authorize_url, request_token['oauth_token']))

def callback(request):
    request_token = request.session['request_token']
    token = oauth.Token(request_token['oauth_token'],
                        request_token['oauth_token_secret'])
    client = oauth.Client(consumer, token)

    _dict = {
            'oauth_token': request.GET['oauth_token'],
            'oauth_verifier': request.GET['oauth_verifier'],
        }

    resp, content = client.request(
    					access_token_url,
    					"POST",
    					body=urllib.urlencode(_dict)
    				)

    access_token = {}
    for item in content.split('&'):
        _data = item.split('=')
        access_token.update({_data[0]: _data[1]})

    request.session['access_token'] = access_token

    return HttpResponseRedirect('/timeline/')

def timeline(request):

    access_token = request.session['access_token']

    token = oauth.Token(access_token['oauth_token'],
    		access_token['oauth_token_secret'])
    client = oauth.Client(consumer, token)
    _result = client.request(timeline_url, 'GET')

    _statuses = _result[1]
    xmlString = urllib.unquote_plus(_statuses.encode('utf-8'))
    elem = fromstring(xmlString)
    for element in elem.findall("status"):
        print element.find('text').text

    return render_to_response('index.html')
DjangoのViewだけ書きました。template側での処理はまったくないです。
流れとしては、
  1. 認証用クライアント作ってリクエストトークンを作る。ここで一度リクエストトークン作成用URLにアクセス。
  2. リクエストトークンに書かれた文字列をくっつけて認証用画面に遷移(ここはTwitter側の画面)。
  3. 「許可」をクリックすると、リクエストトークンで指定したURLに帰って来る。
  4. 帰ってきたときには認証用のベリファイ文字列が着いてくるので、それらを使ってアクセストークン作成。
    ここはアクセストークン作成用のURLにアクセスする。
  5. 帰ってきたアクセストークンに「oauth_token」と「oauth_token_secret」 があり、以降はこれつかってアクセスする。

サンプルはXMLで受信してます。ヘッダとボディに分かれているので、ボディだけXMLとして扱ってパースしました。サンプルはつぶやいた内容だけを書き出しています。