trash-area.com ≫ blog ≫ GAEGoogle App Engine – GAE で twitter のリプライをチェックしてメールでお知らせ

2009年05月19日 1

最近 GAE こと Google App Engine + python で遊んでます。
なかなかマゾくて楽しいかもしれません。

で、GAE の標準機能から
・URL Fetch API … URL をフェッチして Web 上の他のリソースにアクセス
・Mail API … メールを送信
・Datastore API … DBみたいな感じ
・cron … 指定した日時などでコマンドを実行
と、twitter API の mentions を利用して、自分宛のリプライまたは言及があるポストを任意のメールアドレスに転送するサンプルを書いてみました。

python の文化がまだいまいちよくわからんので
なんか記法とか違うかもしれませんが、とりあえず全部貼ってみようかと。

数あるサンプルの足しにでもなればいいなーと。
ちなみに、”new_project_template” からなるべく構成はいじっていません。

“main.py”

#!/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 にエンコードしています。

“app.yaml”

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.yaml”

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 って略称?がメジャーになるといいなと思います。

ソーシャルブックマーク
はてな Livedoor del.icio.us
関連してそうな記事
同じカテゴリーの別の記事
タグ
, , ,
トラックバックURL
コメント
1件のコメント
  1. admin

    2009.06.12 @ 1:11 AM

    なんか reply のスペルが replay と恥ずかしいことになってたので修正しました 笑

Comment RSS

コメントをどうぞ

*反映されるまでに時間がかかることがあります。
*メールアドレスはアバターの使用に使います。