最近 GAE こと Google App Engine + python で遊んでます。
なかなかマゾくて楽しいかもしれません。
で、GAE の標準機能から
・URL Fetch API … URL をフェッチして Web 上の他のリソースにアクセス
・Mail API … メールを送信
・Datastore API … DBみたいな感じ
・cron … 指定した日時などでコマンドを実行
と、twitter API の mentions を利用して、自分宛のリプライまたは言及があるポストを任意のメールアドレスに転送するサンプルを書いてみました。
python の文化がまだいまいちよくわからんので
なんか記法とか違うかもしれませんが、とりあえず全部貼ってみようかと。
数あるサンプルの足しにでもなればいいなーと。
ちなみに、”new_project_template” からなるべく構成はいじっていません。
#!/usr/bin/env python # -*- coding: utf-8 -*- import wsgiref.handlers from google.appengine.ext import webapp from google.appengine.ext import db from google.appengine.api import urlfetch from google.appengine.api import mail from xml.etree.ElementTree import fromstring import base64 import datetime Config = { 'TwitterUser' : 'monicchi', 'TwitterPass' : 'xxxxxxxx', # 自分のに変更 'Sender' : 'monicchi@gmail.com', 'ToAddr' : 'xxxxxxxx@docomo.ne.jp', # 自分のに変更 } class TStatus(db.Model): id = db.StringProperty(required=True) text = db.TextProperty() created = db.DateTimeProperty() in_reply_to_user_id = db.StringProperty() in_reply_to_status_id = db.StringProperty() in_reply_to_screen_name = db.StringProperty() user_id = db.StringProperty() user_screen_name = db.StringProperty() class MainHandler(webapp.RequestHandler): def get(self): base64string = base64.encodestring('%s:%s' % (Config['TwitterUser'], Config['TwitterPass']))[:-1] headers = {'Authorization': "Basic %s" % base64string} obj = TStatus.all().order('-created').get() if obj: url = 'http://twitter.com/statuses/mentions.xml?count=40&since_id=%s' % obj.id isFirst = False else: url = 'http://twitter.com/statuses/mentions.xml?count=3' isFirst = True result = urlfetch.fetch(url, '', urlfetch.GET, headers) elem = fromstring(result.content) for s in elem.findall('.//status'): created = s.findtext('./created_at') created = datetime.datetime.strptime(created, '%a %b %d %H:%M:%S +0000 %Y') \ + datetime.timedelta(hours=9) p = TStatus( id = s.findtext('./id'), text = s.findtext('./text'), created = created, in_reply_to_user_id = s.findtext('./in_reply_to_user_id'), in_reply_to_status_id = s.findtext('./in_reply_to_status_id'), in_reply_to_screen_name = s.findtext('./in_reply_to_screen_name'), user_id = s.findtext('./user/id'), user_screen_name = s.findtext('./user/screen_name'), ) p.put() if not isFirst: subject_text = '[twitter新着リプライ] %sさん (%s)' % \ (p.user_screen_name, p.created.strftime('%H:%M:%S') ) body_text = '%s \n\n http://twitter.com/%s/status/%s' % \ ( p.text.encode('utf-8'), p.user_screen_name, p.id) mail.send_mail(sender = Config['Sender'], to = Config['ToAddr'], subject = subject_text, body = body_text, ) # 後始末 deleteCount = TStatus.all().count() - 3 db.delete(TStatus.all().order('created').fetch(deleteCount)) def main(): application = webapp.WSGIApplication([('/check', MainHandler)], debug=True) wsgiref.handlers.CGIHandler().run(application) if __name__ == '__main__': main() |
utf-8 で保存します。
時差変換ってなにか美しい方法あるんでしょうか。
やってることは、自分宛のポストをデータストアに3件だけ保存しています。
これは削除が結構めんどくさいからです。
GAE での日本語メールは utf-8 にしとけば勝手に日本語対応してくれてます。
ちなみに、subject はファイル自体が utf-8 にしてるので何もしてません。
body は twitter API のレスポンスをそのままデータストアに入れてしまっているので、utf-8 にエンコードしています。
application: hoge-hoge-application # 自分のに変更 version: 2 runtime: python api_version: 1 handlers: - url: .* script: main.py login: admin |
version: は 2 にしてます
これは、今のところサーバにインストールしたGAEアプリは削除できないようなので
一度空っぽのものを version 1 でインストールしてるからです。
※GAE にはバージョン管理機能がついていて、バージョンを削除することは可能です。
あと、 login: admin の行を足しています。
cron:
- description: fetch twitter
url: /check
schedule: every 10 minutes |
こいつは丸ごと作成します。
10 分間隔で /check を叩いて(アクセスして)くれます。
/check は “app.yaml” で定義してある通り main.py に転送されます。
また、admin 権限で無いと実行できないようになってます。
※GAE の cron 機能からだと admin 権限がつくそうです。
と、ここまでを丸ごとアップロードすると、自分の twitter を 10分間隔で勝手にチェックしてリプライもしくは言及があればメールで転送してくれます。
cron の間隔は twitter API の使用制限と相談して調整するといいと思います。
まー、なかなか情報が無いというか、
検索するのにいちいち Google App Engine と入力するのがおっくうなので
GAE って略称?がメジャーになるといいなと思います。
2009.06.12 @ 1:11 AM
なんか reply のスペルが replay と恥ずかしいことになってたので修正しました 笑