Google Wave Robotを作ってみる

以下を参考にしつつ、何かやってみる。
第2回 ロボットAPI:最速!Google Wave API解説|gihyo.jp … 技術評論社
誰も知らない夜のwaveのrobot - When it’s ready.

ライブラリの入手

Python版はこちら。
Google Code Archive - Long-term storage for Google Code Project Hosting.

$ mkdir svn
$ svn checkout http://wave-robot-python-client.googlecode.com/svn/trunk/ wave-robot-python-client-read-only

Java版は無いと思ってたけど、ちゃんとあるのね。知らなかったw

Google App Engineのアプリケーションの作成

普通のGAEアプリケーションを作るときと同じように作る。
app.yamlは以下のようにwaveから叩かれるURLに対応するようにする。

application: sugi1982
version: wave-robot
runtime: python
api_version: 1

handlers:
- url: /_wave/.*
  script: robot.py

Robotのコードを書く

Wave APIについての情報はこちらから。
http://code.google.com/intl/ja/apis/wave/
API Documentもちゃんとある。
http://wave-robot-python-client.googlecode.com/svn/trunk/pydocs/index.html


とりあえず書いてみた。

#/usr/bin/env python

from waveapi import events 
from waveapi import robot 

def blipSubmitted(properties, context):
    root_wavelet = context.GetRootWavelet()
    root_wavelet.CreateBlip().GetDocument().SetText('hoge')

if __name__ == '__main__':
    sugyan_robot = robot.Robot('sugyan_robot', 1.0)
    sugyan_robot.RegisterHandler(events.BLIP_SUBMITTED, blipSubmitted)
    sugyan_robot.Run()

ドキュメントにはrobot.Robotのコンストラクタにはnameだけ指定すれば良い的なことが書いてあるんだけど、
http://wave-robot-python-client.googlecode.com/svn/trunk/pydocs/waveapi.robot_abstract.Robot-class.html#__init__
最新のライブラリのコードをみると、versionの指定もしないとダメらしい。
Google Code Archive - Long-term storage for Google Code Project Hosting.
そもそもどこに使われるパラメータなのかもよく分からないけど。


とりあえずevent.BLIP_SUBMITTEDだけ受け取ってblipSubmittedで処理するよう登録し、blipSubmitted()内では新規にBlipを作成して'hoge'と呟くだけにした。

試しにローカル実行してみる

$ python robot.py
Traceback (most recent call last):
  File "robot.py", line 3, in <module>
    from waveapi import events 
ImportError: No module named waveapi

当然怒られます。シンボリックリンクでチェックアウトしてきたライブラリをもってくる。

$ ln -s ~/svn/wave-robot-python-client-read-only/src/waveapi 
$ ls
app.yaml robot.py waveapi

これでどうだ。

$ python robot.py
Traceback (most recent call last):
  File "robot.py", line 4, in <module>
    from waveapi import robot 
  File "/Users/sugyan/svn/wave-robot-python-client-read-only/src/waveapi/robot.py", line 25, in <module>
    from google.appengine.ext import webapp
ImportError: No module named google.appengine.ext

そうか、waveapiでは内部でGoogle App Engineのコードを呼んでるのか。

$ PYTHONPATH=/usr/local/google_appengine python robot.py
Traceback (most recent call last):
  File "robot.py", line 4, in <module>
    from waveapi import robot 
  File "/Users/sugyan/svn/wave-robot-python-client-read-only/src/waveapi/robot.py", line 25, in <module>
    from google.appengine.ext import webapp
  File "/Users/sugyan/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/ext/webapp/__init__.py", line 68, in <module>
    import webob
ImportError: No module named webob
$ PYTHONPATH=/usr/local/google_appengine:/usr/local/google_appengine/lib/webob python robot.py 
Status: 404 Not Found
Content-Type: text/html; charset=utf-8
Cache-Control: no-cache
Content-Length: 0

お。とりあえずエラーなく実行は成功したっぽい。大丈夫そうだ。デプロイする。

$ appcfg.py update .

デプロイしないと動作確認できないみたいなので、ローカルでデバッグできるのはここが限界なのかな…

動作確認

Google Wave Sandboxにログイン、デプロイしたアプリケーションIDを使って"******@appspot.com"をContactsに追加、New Waveを開始する。

何か書いて「Done」を押すたびに'hoge'と新規に呟いてくるだけのウザいRobotが完成!