gae + python で 現在の時間を呟くtwitter bot を作ってみた

特に bot に興味があるわけではないんですが、cron の練習に作ってみました。
基本的な操作(鯖起動、デプロイ等)は http://d.hatena.ne.jp/alpha_neet/20110917/1316268585 を参考にしてください。

環境

Mac OS X 10.7.1
gae 1.5.4
python 2.5.5

プロジェクト作成

http://blog.mudaimemo.com/2010/03/google-app-engine-twitteroauth.html を参考に


https://dev.twitter.com/apps/new から twitter に登録する。アプリのアクセスタイプを「read and write」にしておく。


参考サイトだとアクセストークンを取得するのが難しそうですが、現在の twitter では自分のアカウントのアクセストークンはアプリページの下の方にある「create my access token」で簡単に生成出来ます。


次に https://github.com/mikeknapp/AppEngine-OAuth-Library を落として解凍して中の oauth.py を作業ディレクトリに移す。

  • main.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import oauth
import datetime                                                                         
application_key = '自分の application key'
application_secret = '自分の application secret'
user_token = '自分の user token'
user_secret = '自分の user sercret'

client = oauth.TwitterClient(application_key, application_secret, None)
url = 'http://twitter.com/statuses/update.xml'
now = datetime.datetime.now().strftime('%Y/%m/%d %H:%M:%S')
params = { 'status': "おっぱい " + now }
result = client.make_request(url,
                             token = user_token,
                             secret = user_secret,
                             additional_params = params,
                             method = 'POST')

print 'Content-Type: text/plain'
print ''
print result.content
application: twitter-bobobo
version: 1
runtime: python
api_version: 1

handlers:
- url: /.*
  script: main.py
cron:
- description: Post to Twitter
  url: /
  schedule: every 15 minutes

ローカルで鯖を立ち上げて http://localhost:8080 にアクセスして変な xml がずらずらずらと表示されて、ツイッターに投稿出来てたら成功。


デプロイをすれば 15 分ごとに現在の時間を呟く bot がでけますた。自分のは http://twitter.com/#!/alphaneetdev です。

おまけ

結局何がしたかったの?

物が出来る前にこういうの作る予定です(キリッ というのはあまり自分の主義じゃないんですが、
今回はちょっと色々手間がかかりそうだと判明したので、Google App Engine弄りはここで一旦中止してゲーム作りに戻ることにしました。。。。
なのでお前は一体何がしたかったんだ?だけでもメモ代わりに書いておきます。


最近ダイエットしてまして、体重履歴を gooからだログ(http://karada.goo.ne.jp/) に残そうかな?と思いました。
しかし毎回ログインしてフォームに入力するのはあまりに原始人なので(しかもガラケー(笑))
適当な捨てGMailに今日の体重をメールで送って、どっかの鯖からそれを読みこんで gooからだログ を自動的に更新でけたら便利だなーと思いました。


最初は jruby で gmail4j と hpricot と Mechanize を使って実装して、vps上でデーモンにすればいいんかいな?と思ってたんですが、
google app engine に cron という機能があったので「インフラを全部無料にできる><わーい」と思ってやってみました。


しかし、これからさらに gmail api for python を学ぶのと python で html をパースするライブラリを見つける作業が重いので止めました。
あんまりお金になることに繋がりそうにないですし。。。長くてすいません三行で説明しますと

  1. 30分ごとにbotGMail を見にいく
  2. 数値データのメールが来ていたら gooからだログ を更新する。
  3. を作りたかったけど思いのほか時間かかるわwwwもういいやー\(^o^)/
ターミナルで全て完結させたい場合
  • local.py
# (注)動かないんであんまり意味ないです。
import sys
import os

# $GAE_HOME is '/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/'
DIR_PATH    = os.environ['GAE_HOME'] 
EXTRA_PATHS = [
  DIR_PATH,
  os.path.join(DIR_PATH, 'lib', 'antlr3'),
  os.path.join(DIR_PATH, 'lib', 'django_0_96'),
  os.path.join(DIR_PATH, 'lib', 'fancy_urllib'),
  os.path.join(DIR_PATH, 'lib', 'ipaddr'),
  os.path.join(DIR_PATH, 'lib', 'protorpc'),
  os.path.join(DIR_PATH, 'lib', 'webob'),
  os.path.join(DIR_PATH, 'lib', 'whoosh'),
  os.path.join(DIR_PATH, 'lib', 'yaml', 'lib'),
  os.path.join(DIR_PATH, 'lib', 'simplejson'),
  os.path.join(DIR_PATH, 'lib', 'google.appengine._internal.graphy'),
]

if __name__ == '__main__':
  sys.path = EXTRA_PATHS + sys.path
  #execfile('main.py', globals())
  execfile('main.py')

python2.5 local.py

最初こんな感じで gae のライブラリパスを追加してやれば動くかな?と思ったんですが、
ターミナルから直接 python を走らせたら動かないっぽいです。url_fetch がうんたらかんたら言われます。


http://d.hatena.ne.jp/Yoshiori/20100929/1285727199 を参考に

oauth を gae のライブラリを使わないで直接叩けば動くっぽいです。
bot作るだけの場合わざわざブラウザに移動して F5 押すのがめんどいと思ったらこっちも選択肢の一つとしていいかもしれません。