GAEとpythonでbotを作る

このエントリの和訳です。http://d.hatena.ne.jp/takahirox/20110424/1303652584

はじめに

GAE(Google App engine)とpython(とLinux)を使ってtwitterbotを作ってみました。そのときのメモを残しておきます。
botを作ってみようと思っている人の参考になれば。

作ったbot


東京の天気予報を呟きます。

twitterアカウントを取得してtwitter applicationを設定する

twitterアカウントの取得

最初にbot用の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」で取得できます。

Access tokenとAccess token secretは「my access token」で取得できます。

pythontwitterのクライアントを作る

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)を実行させます。

GAEアカウントを取得する

GAEアカウントの取得方法の説明は省略します。既に色んな説明ページがあるので。

googleで検索してください。

SDKをダウンロードしてセットする

最初にSDKをダウンロードします。SDKはここでダウンロードできます。


今回はLinux用の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の設定ファイルです。

これらのファイルの詳細の説明は省略します。詳細を知りたければドキュメントを確認してください。


今回はこのような内容のファイルを作りました。

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ディレクトリ下は以下のようになっているはずです。

  • ~/work/forecasthoge/


必要なファイルを全て用意したら、デプロイを行います。「appcfg.py」を実行します。

% cd ~/work/forecasthoge
% appcfg.py update .

GAEアカウントを作るときに登録したメールアドレスとパスワードが聞かれるので入力します。

デプロイ後、デプロイされたアプリケーションは以下で確認できます。


これで完成です! 成功していれば定期的にbotプログラムが起動されるはずです!

他に作ったbot

同じような流れで作ったbotです。

その他のヒント

rubybotを作ったときcronの実現方法で悩んだことがありました。


恐らく「urllib2を使ったGAE python application」と「別のサーバにアップロードし、rubyや他の言語で作成した、CGIで起動するbotプログラム」を使えば、cronの問題が解決できるはずです。

python GAE applicationはこんな感じになるでしょう。

import urllib2

urllib2.urlopen( 'your bot URL' )

そしてcron.yamlを設定してこれを定期的に実行すればok。

これでrubyなどでも気軽にbotを作成することができるでしょう。

まだ試していないので、正しく動くかわかりませんが。

アイコン

Windowsのペイントを使ってアイコンを簡単に作ってみました。

終わりに

GAEとpythonを使ったbotの作り方が理解できました。かなり簡単です。

今回買いた内容はbot作成のために最小限必要なことだけです。

他のtweepyの機能(timelineを読んだり検索したり、返信を取得したり)や、他のGAEの機能(データストアやメール送信機能)を使えばもっと色々なbotを作ることができるでしょう。