GAEとpythonでbotを作る
このエントリの和訳です。http://d.hatena.ne.jp/takahirox/20110424/1303652584
はじめに
GAE(Google App engine)とpython(とLinux)を使ってtwitterのbotを作ってみました。そのときのメモを残しておきます。
botを作ってみようと思っている人の参考になれば。
twitterアカウントを取得してtwitter applicationを設定する
twitterアカウントの取得
今回は @forecasthoge というアカウントを取得しました.
twitter applicationを設定する
次にtwitter applicationを設定します。以下でtwitter applicationの設定を行えます。
先ほど取得したtwitterアカウントでサインインします。今回は先ほど取得した @forecasthoge でサインインしました。
「Your apps」メニューをクリックし、「Register a new app」で新しくtwitter applicationを追加します。
- メモ
- アプリケーションの種類 : クライアントアプリケーション
- 標準のアクセスタイプ : read & write
登録後、Consumer key, Consumer secret, Access token, Access token secretを取得します。これらはbotプログラムで使用します。
Consumer keyとConsumer secretは「application detail」で取得できます。
pythonでtwitterのクライアントを作る
http://d.hatena.ne.jp/Number6/20100116/1263631863 を参考にしました。
tweepyをインストールする
tweepyというpythonライブラリを使用します。これを使うと簡単にtwitterに読み書きできます。
tweepyはeasy_installでインストールできます。まだeasy_installをインストールしていなければ、先にeasy_installをインストールします。
% sudo apt-get install easy_install
その後、tweepyをインストールします。
% sudo easy_install tweepy
tweepyを使ったテストスクリプトを作る
tweepyのテストスクリプトとして「try.py」というスクリプトを作成しました。Consumer key, Consumer secret, access token, access token secretは先ほどtwitter applicationのところで取得した値を設定します。
# try.py import tweepy consumer_key = 'your consumer key' consumer_secret = 'your consumer secret' access_token = 'your access token' access_token_secret = 'your access token secret' auth = tweepy.OAuthHandler(consumer_key, consumer_secret) auth.set_access_token(access_token, access_token_secret) api = tweepy.API(auth_handler=auth) api.update_status('test with tweepy')
これを実行します。
% python try.py
成功していればtwitterにポストされているはずです。
botを作る
try.pyを基にbotを作ります。
今回作ったbotの特徴は以下です。
# main.py from xml.dom import minidom import urllib2 import re import tweepy consumer_key = 'your consumer key' consumer_secret = 'your consumer secret' access_token = 'your access token' access_token_secret = 'your access token secret' auth = tweepy.OAuthHandler(consumer_key, consumer_secret) auth.set_access_token(access_token, access_token_secret) api = tweepy.API(auth_handler=auth) xdoc = minidom.parse( urllib2.urlopen( 'http://weather.livedoor.com/forecast/webservice/re st/v1?city=63&day=today' ) ) telop = xdoc.getElementsByTagName( 'telop' )[ 0 ].firstChild.data date = xdoc.getElementsByTagName( 'forecastdate' )[ 0 ].firstChild.data description = re.sub( '\.\.\..*$', '...', xdoc.getElementsByTagName( 'description' )[ 0 ]. firstChild.data ) result = telop + ' ' + date + ' ' + description api.update_status(result)
これを実行します。
% python main.py
成功していれば天気予報が呟かれているはずです。
botをGAEにデプロイする
botを作ったら、これをGAEにデプロイします。そしてcronを使って定期的にbotプログラム(main.py)を実行させます。
SDKをダウンロードしてセットする
最初にSDKをダウンロードします。SDKはここでダウンロードできます。
次に、それを解凍して/usr/localに置きます。
% unzip google_appengine_1.4.3.zip % mv google_appengine /usr/local/google_appengine
念のためSDKツールにパスが通っていることをwhichコマンドで確認します。
% which appcfg.py
/usr/local/google_appengine/appcfg.py
bot用に新しくアプリケーションを登録する
bot用に新しくアプリケーションを登録します。
「Create Application」をクリックします。「Application Identifier」と「Application Title」は好きなものでokです。今回はどちらも「forecasthoge」と入力しました。
新しいアプリケーションの設定を行う
bot用にLinux上にディレクトリを作ります。ディレクトリの名前は先ほど取得したGAE applicationの名前と同じものにします。作ったbotプログラム(main.py)をこのディレクトリに置きます。
% mkdir ~/work/forecasthoge % cd ~/work/forecasthoge % mv ~/work/main.py .
app.yamlとcron.yamlを作ります。app.yamlはGAE applicationの設定ファイルです。cron.yamlはcronの設定ファイルです。
これらのファイルの詳細の説明は省略します。詳細を知りたければドキュメントを確認してください。
- http://code.google.com/intl/ja/appengine/docs/python/config/appconfig.html
- http://code.google.com/intl/ja/appengine/docs/python/config/cron.html
今回はこのような内容のファイルを作りました。
app.yaml
application: forecasthoge version: 1 runtime: python api_version: 1 handlers: - url: /.* script: main.py
cron.yaml
cron: - description: cron job name url: /.* schedule: every 1 hours
これでbotプログラムは1時間ごとに実行されます。
多重ポスト(同じ内容のポストを二回以上連続で行うこと)はtwitterによってはじかれます。これにより(bot側で制御しなくても)「Weather hacks」が更新されるとすぐに(ほぼ)最新の天気予報が呟かれます。これは悪いやり方なので真似しないほうがいいです。きちんと「Weather hacks」が更新されたかチェックするようにしましょう。
そして「tweepy」をGAE用にも用意する必要があります。
(たぶんtweepyをデプロイしなくても使える方法がありそうなのですが、やり方がわからなかったのでデプロイすることにしました)
「tweepy」を取得する方法はたくさんあります。今回はgitでcloneを取得しました。tweepy内のtweepyディレクトリのみをデプロイすればokです。なのでtweepy/tweepyディレクトリのみをGAE applicationディレクトリにコピーしました。
% cd ~/work % git clone git://github.com/joshthecoder/tweepy.git % cp -r ./tweepy/tweepy ~/work/forecasthoge/
恐らくeasy_installでインストールしたtweepyをコピーしても動くと思います(今回の環境だと/usr/local/lib/python2.6/dist-packages/tweepy-1.7.1-py2.6.egg/tweepy)。まだ試していないのでわかりませんが。
この段階で、GAE applicationディレクトリ下は以下のようになっているはずです。
必要なファイルを全て用意したら、デプロイを行います。「appcfg.py」を実行します。
% cd ~/work/forecasthoge
% appcfg.py update .
GAEアカウントを作るときに登録したメールアドレスとパスワードが聞かれるので入力します。
デプロイ後、デプロイされたアプリケーションは以下で確認できます。
- you can confirm deployed application at https://appengine.google.com/ .
これで完成です! 成功していれば定期的にbotプログラムが起動されるはずです!
その他のヒント
rubyでbotを作ったときcronの実現方法で悩んだことがありました。
恐らく「urllib2を使ったGAE python application」と「別のサーバにアップロードし、rubyや他の言語で作成した、CGIで起動するbotプログラム」を使えば、cronの問題が解決できるはずです。
python GAE applicationはこんな感じになるでしょう。
import urllib2 urllib2.urlopen( 'your bot URL' )
そしてcron.yamlを設定してこれを定期的に実行すればok。
これでrubyなどでも気軽にbotを作成することができるでしょう。
まだ試していないので、正しく動くかわかりませんが。