2010年2月7日日曜日

Google App Engine + Twitter + OAuthでTwitterにつぶやくためのメモ

TwiVoxからTwitterにつぶやくためにOAuthを利用してみました。

認証して投稿するという部分をメモしておきます。


TwitterでOAuthを扱うためのライブラリはいろいろあるのですが
(Twitter APIのWikiでも紹介されています)、
今回はAppEngine-OAuth-Libraryを利用してみます。
ちなみに、フレームワークとしてDjangoを利用します。


0. 準備

TwitterでOAuthを利用したアプリを作るためにはアプリを登録する必要があるので、はじめに下のURLからアプリを登録してください。
https://twitter.com/apps


1. 認証

from django.http import HttpResponseRedirect
import oauth

CONSUMER_KEY = 'アプリのConsumer key'
CONSUMER_SECRET = 'アプリのConsumer secret'

'''
認証を実行
'''
def signin(request):
# Twitterの認証が成功された場合にコールバックするURLを指定
callback_url = 'http://%s/twitter/callback/' % request.get_host()

client = oauth.TwitterClient(CONSUMER_KEY, CONSUMER_SECRET, callback_url)

return HttpResponseRedirect(client.get_authorization_url())

'''
コールバック
'''
def callback(request):
# Twitterからoauth_token, oauth_verifierというパラメータが返ってきます。
oauth_token = request.GET.get('oauth_token')
oauth_verifier = request.GET.get('oauth_verifier')

client = oauth.TwitterClient(CONSUMER_KEY, CONSUMER_SECRET, None)
user_info = client.get_user_info(oauth_token, oauth_verifier)

# ユーザー情報を保存
from model import TwitterUser
twitteruser = TwitterUser.all().filter('twitter_id =', user_info['id']).get()
if not twitterusr:
twitteruser = TwitterUser()
twitteruser.twitter_id = user_info['id']
twitteruser.username = user_info['username']
twitteruser.picture = user_info['picture']
twitteruser.token = user_info['token']
twitteruser.secret = user_info['secret']
twitteruser.oauth_verifier = oauth_verifier
twitteruser.save()

return HttpResponseRedirect('/u/%s/' % user_info['username'])


2. 投稿
from django.http import Http404
from django.shortcuts import render_to_response

def post(request):
if request.method != 'POST': raise Http404;

# つぶやき
status = request.POST.get('status')

# 140文字以上だと反映されないので弾く
if len(status) > 140 or len(status) == 0:
return render_to_response('post.html',
{'error': 'Your Twitter message cannot be blank and cannot be longer than 140 characters.'},
context_instance=RequestContext(request))

# パラメータにつぶやきをセット
additional_params = {'status': status.encode('utf-8')}

# 返信の場合
in_reply_to_status_id = request.POST.get('in_reply_to_status_id')
if in_reply_to_status_id:
additional_params['in_reply_to_status_id'] = in_reply_to_status_id

client = oauth.TwitterClient(CONSUMER_KEY, CONSUMER_SECRET, None)

try:
# リクエストを投げる
# request.twitter_userに認証時に保存したユーザー情報が格納されているとします。
response = client.make_request('http://twitter.com/statuses/update.json',
token=request.twitter_user.token,
secret=request.twitter_user.secret,
additional_params=additional_params,
protected=True,
method='POST')
# JSONをパースする
from django.utils import simplejson as json
data = json.loads(response.content)
if data.has_key('error'):
logging.error(data['error'])
return render_to_response('post.html',
{'error': data['error']},
context_instance=RequestContext(request))
except Exception, e:
import traceback
logging.error(traceback.format_exc())
return render_to_response('index.html', context_instance=RequestContext(request))

0 件のコメント: