先にはっきりいっておきます。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側での処理はまったくないです。
流れとしては、
- 認証用クライアント作ってリクエストトークンを作る。ここで一度リクエストトークン作成用URLにアクセス。
- リクエストトークンに書かれた文字列をくっつけて認証用画面に遷移(ここはTwitter側の画面)。
- 「許可」をクリックすると、リクエストトークンで指定したURLに帰って来る。
- 帰ってきたときには認証用のベリファイ文字列が着いてくるので、それらを使ってアクセストークン作成。
ここはアクセストークン作成用のURLにアクセスする。 - 帰ってきたアクセストークンに「oauth_token」と「oauth_token_secret」 があり、以降はこれつかってアクセスする。
サンプルはXMLで受信してます。ヘッダとボディに分かれているので、ボディだけXMLとして扱ってパースしました。サンプルはつぶやいた内容だけを書き出しています。