2010-04-18

Google App EngineからTwitterにつぶやく

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
Google App EngineからTwitterにつぶやく方法です。

まず用意するのは、
TwitterのOauthサイトに飛ぶための機能
TwitterのOauthからCallbackされるところ
が必要です。

これがつぶやくための情報が取得できたことになるので
これではじめてつぶやけます。

まずTwitterのAPIを利用するための登録をTwitterに行います。
http://www.msng.info/archives/2010/01/twitter_api_oauth_with_php.php
がとても参考になります。

そしてGoogle App EngineからTwitterのAPIを利用するには、
AppEngine-OAuth-Library
が大変便利です。
使い方は、
http://blog.mudaimemo.com/2010/02/google-app-engine-twitter-oauth.html
が大変参考になります。

ざっくり使うならば以下のような感じになります。
# -*- coding: utf_8 -*-

import os
import sys
import logging

from google.appengine.ext.webapp import template
from google.appengine.ext import webapp
from google.appengine.api import urlfetch
from django.utils import simplejson as json
import traceback
import urllib
#AppEngine-OAuth-Libraryを読み込みます。
import oauth

import wsgiref.handlers

#登録した値を使います
CONSUMER_KEY = 'アプリのConsumer key'
CONSUMER_SECRET = 'アプリのConsumer secret'

class Top(webapp.RequestHandler):
  def get(self):
    template_values = {}
    path = os.path.join(os.path.dirname(__file__), 'top.html')
    self.response.out.write(template.render(path, template_values))

class TwitSignin(webapp.RequestHandler):
  def get(self):
        callback_url = '%s/twitter/callback' % (request.host_url)
        client = oauth.TwitterClient(CONSUMER_KEY, CONSUMER_SECRET,callback_url)
        self.redirect(client.get_authorization_url())

class TwitCallback(webapp.RequestHandler):
  def get(self):
    #つぶやくために必要なのは以下の二つではありません
    token = request.get('oauth_token')
    verifier = request.get('oauth_verifier')
    client = oauth.TwitterClient(CONSUMER_KEY, CONSUMER_SECRET,None)
    #以下の部分で肝心な情報を取得します
    user_info = client.get_user_info(token, verifier)
    #この下で取得する2つの情報がつぶやくために必要になります
    oauth_token  = user_info['token']
    oauth_secret = user_info['secret']

    #重要な情報がとれたところでついでにつぶやきサンプルです。
    msg = "oauthテスト なう"
    additional_params = {'status': msg}
    try:
        response = client.make_request('http://twitter.com/statuses/update.json',
                                       token=oauth_token,
                                       secret=oauth_secret,
                                       additional_params=additional_params,
                                       protected=True,
                                       method='POST')
        data = json.loads(response.content)
        if data.has_key('error'):
            logging.error(data['error'])
    except Exception, e:
        logging.error(traceback.format_exc())
        
    self.redirect("/")


def main():
  application = webapp.WSGIApplication([
                                        ('/', Top),
                                        ('/twitter/signin', TwitSignin),
                                        ('/twitter/callback', TwitCallback),
                                        ],
                                       debug=True)
  wsgiref.handlers.CGIHandler().run(application)

if __name__ == "__main__":
  main()

ちなみにtop.htmlは
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
    "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>test</title>
</head>
<body>
<a href="/twitter/signin">auth twitter</a>
</body>
</html>
コメントを投稿