2008年6月8日日曜日

Google App Engine: Twitter送信機能付き掲示板

このブログ記事をはてなブックマークに追加

先日、Google App Engineで簡易掲示板を作成したが、ほとんどの書き込みが自分自身の“つぶやき”であることに気がついて、これだったらTwitterにそのまま送信してもよさそうだと考え、作ることに。しかし、思ったよりも苦労したのだった。

まず最初、Twitter APIを使って以下のような実装を考えた。

import urllib, urllib2 def main(): top_url = "twitter.com" url = "twitter.com/statuses/update.xml" username = "username" password = "password" passman = urllib2.HTTPPasswordMgrWithDefaultRealm() passman.add_password(None, top_url, username, password) authhandler = urllib2.HTTPBasicAuthHandler(passman) opener = urllib2.build_opener(authhandler) urllib2.install_opener(opener) params = urllib.urlencode({"status": "つぶやき".encode("utf-8")}) pagehandle = urllib2.urlopen("http://" + url, params) if __name__ == "__main__": main()

しかし、これはurllib2でsocketを使うのでGAEの制限に引っ掛かりアウト。そこで次はネットなどで情報を集め、以下のようなurlfetchを使った実装を試みた。

url = "http://twitter.com/statuses/update.xml" payload = urllib.urlencode({"status": "つぶやき".encode("utf-8")}) base64string = base64.encodestring("%s:%s" % ("username", "password"))[:-1] headers = {"Authorization": "Basic %s" % base64string} result = urlfetch.fetch(url, payload=payload, method=urlfetch.POST, headers=headers)

これは、ローカル環境ではばっちり動作したので、そのままアップロード。だがしかし、ここで落とし穴が。実はGAEからのTwitterへの送信はすべて遮断されているらしい。がっくし。リファラ回りをいじってもダメだった。

しかし、ここまで来ては諦めきれないので、自分の持っている別のサーバに最初に挙げたコードをCGIとして実装し、GAEからそのサーバにデータを飛ばすことでTwitterへの送信を行うことにした。まあ、これで何とかなりはしたが、あまりすっきりしないなぁ。

最後に、Twitter送信機能付き掲示板の簡単な説明をする。メッセージボードにGoogleアカウントでログインすると、名前の横に[Twitter]のリンクが出る。そこからTwitterのアカウント情報を入力。この情報はサーバには送信されず、ローカルのクッキーに保存される。情報を入力すると、書き込みボタンの横の「Twitterに送信」チェックボックスがアクティブになるのでそれをチェックする。これで、掲示板への投稿と同時にTwitterにも送信される。ただし、全体で160バイト以内で[link]や[code]タグを含まないようにしなければならない。また、正しく送信されると書き込み記事の名前の横に水色のTの文字が表示される。

0 コメント: