gae + python で 現在の時間を呟くtwitter bot を作ってみた
特に bot に興味があるわけではないんですが、cron の練習に作ってみました。
基本的な操作(鯖起動、デプロイ等)は http://d.hatena.ne.jp/alpha_neet/20110917/1316268585 を参考にしてください。
プロジェクト作成
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
- app.yaml
application: twitter-bobobo version: 1 runtime: python api_version: 1 handlers: - url: /.* script: main.py
- cron.yaml
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 をパースするライブラリを見つける作業が重いので止めました。
あんまりお金になることに繋がりそうにないですし。。。長くてすいません三行で説明しますと
ターミナルで全て完結させたい場合
- 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 押すのがめんどいと思ったらこっちも選択肢の一つとしていいかもしれません。