Google App Engine で Twitter に投稿する

認証とか難しいことなしに、データベースが更新された旨などを Twitter に投稿するための方法です。
はじめに、Twitter開発者ページで Web サイトを登録してください。

今回、使用するのは Consumer key, Consumer secret と My Access Token ページにある Access Token (oauth_token), Access Token Secret (oauth_token_secret) です。


PythonTwitter に投稿するためのライブラリとして python-twitter 等が存在しますが、Google App Engine で同様のことを行うなら AppEngine-OAuth-Library が容易です。 ファイル一つを追加するだけで済みます。
AppEngine-OAuth-Library から oauth.py をプロジェクトに追加します。
Twitter 投稿用のソースコードは以下を参考にしてください。

import oauth
import logging

consumer_key = 'xxx'
consumer_secret = 'xxx'
access_token_key = 'xxx'
access_token_secret = 'xxx'

def post(message):
    client = oauth.TwitterClient(consumer_key, consumer_secret, None)
    params = {
        'status': message.encode('utf-8')
    }
    try:
        response = client.make_request(url='http://twitter.com/statuses/update.xml', 
                                       token=access_token_key, 
                                       secret=access_token_secret,
                                       additional_params=params,
                                       protected=True,
                                       method='POST')
    except Exception, e:
        logging.error(e)

    if response.status_code != 200:
        logging.warning('Failed to post a message to twitter. status_code: %d' \
                        % response.status_code)

参考:無題メモランダム: Google App Engine + Twitter + OAuthでTwitterにつぶやくためのメモ


投稿に用いる URL はレスポンス・コンテンツの形式に応じて http://twitter.com/statuses/update.xmlhttp://twitter.com/statuses/update.json が選択できます。
詳細は Twitter API 仕様書 日本語訳 第五十版 (2010年8月12日版) をご覧下さい。 以下、抜粋。

  update
     自分のステータスを更新(update)する。引数 status は必須。
     この API は必ず POST を使って発行すること。update が成功した場合は、format で指定した形式で応答が返る

     URL: http://api.twitter.com/1/statuses/update.format
       (format は xml, json のうちのいずれかを指定)

     引数:
        status=ステータス  (必須)
          ステータス(発言、投稿内容)を指定する。必ず URL エンコードすること。
          ステータスは 140文字以内におさめること。
          140文字を超えるステータスを投稿しようとした場合は、単純に無視される(エラーコードは返らない。代わりに、最後に投稿することに成功したステータスのIDが返る。将来、エラーコードを返すようにする予定 → [2010年2月25日更新] 403エラーを返す)

(中略)

     メソッド: POST
     API制限:  適用対象外
               ただし、一定時間辺りの実行回数上限が設定されている
                 1日辺り  1000回まで (API による実行以外に、Web での投稿、モバイルでの投稿、SMSでの投稿もカウント対象)
               上限に到達すると、それ以降は 403 エラーが返るようになる

     注記: Twitter では同一内容のステータスを連続して投稿しようとした場合、最初の投稿以外は無視するようにしている。
           同一内容のステータスを投稿しようとした場合、その応答として status 要素に最初のステータス投稿時のステータスIDが格納されたものが返る。
           (当分の間) 位置情報は、投稿から7日経過した時点で削除される。

     訳者による注記:
        2007年4月はじめごろまでは GET でも構わなかった。現在は、GET は使えなくなっている
  • 同じ内容のメッセージは投稿できない

ステータスコード 403 が返され、Status is a duplicate. となっていたら、同一内容のメッセージによる投稿ブロックです。
投稿日時をメッセージに追加するなどして回避します。

import datetime

d = datetime.datetime.now() + datetime.timedelta(hours=9)  # 日本時間にシフト
time_string = u'%s月%s日%s時%s分' % (d.month, d.day, d.hour, d.minute)