Google App Engine で Twitter に投稿する
認証とか難しいことなしに、データベースが更新された旨などを Twitter に投稿するための方法です。
はじめに、Twitter の開発者ページで Web サイトを登録してください。
今回、使用するのは Consumer key, Consumer secret と My Access Token ページにある Access Token (oauth_token), Access Token Secret (oauth_token_secret) です。
Python で Twitter に投稿するためのライブラリとして 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.xml か http://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)