先日横浜みなとみらいのパシフィコ横浜においてGoogle Developer Day 2009
嬉しいことにその基調講演の中でGDD参加者には数週間以内にGoogle Waveのアカウントが発行されるという発表がありました。GDDに参加してもうしばらくすればアカウントが手に入るという予定の方は、
また、
ロボットとは
Google Waveでいう
ロボットがどういうものか理解するには、実際にロボットを使ってみるのが早いでしょう。ロボットをWaveに追加するには、


ここではGoogle API Expertの松尾さんが作ったKayという赤ん坊ロボットを試してみることにします。アイコンからもプロフィールからも通常の参加者と全く区別がつきませんが

残念ながらKayは赤ん坊なので、
ロボットが処理するイベント
ロボットはWave上でイベントが発生したときに、
Wave | グローバルで一意なIDを持つエンティティ。複数のWaveletからなる。Playback機構はこの内部で動作する |
---|---|
Wavelet | Waveに含まれ、 |
Document | Waveletに含まれ、Wavelet内で一意なIDを持つエンティティ。一つのXMLドキュメントと、 |
Blip | ドキュメントの一種でリッチテキスト形式のもの |
上記のエンティティのうちイベントを発生するのはWaveを除く3つです。
そこから発生するイベントの一覧は、
- wavelet_
blip_ created - wavelet内でblipが新しく作成された場合に発生するイベント
- wavelet_
participants_ changed - 参加者
(ロボットも含む) がwaveletに追加またはwaveから削除された場合に発生するイベント - wavelet_
title_ changed - waveletのタイトルが変更された場合に発生するイベント
- blip_
contributors_ changed - blipの編集者が変更された場合に発生するイベント
- blip_
deleted - blipがwaveletから削除された場合に発生するイベント
- blip_
submitted - blipが確定された場合に発生するイベント。このイベントはユーザーがDoneボタンをクリックするか、
他のblipにフォーカスを移動したときに一度だけ発生します - document_
changed - blipにコンテンツが追加された場合にさまざまな間隔で発生するイベント
もちろんロボットがこれらのイベント全てに反応するわけではありません。ロボットが反応するイベントはロボットと同じサーバー上に置かれたXMLファイル
<?xml version="1.0"?>
<w:robot xmlns:w="http://wave.google.com/extensions/robots/1.0">
<w:version>1.0</w:version>
<w:capabilities>
<w:capability name="BLIP_SUBMITTED"/>
<w:capability name="WAVELET_SELF_ADDED"/>
</w:capabilities>
<w:profile name="Kay" imageurl="http://nikkeisoftware.appspot.com/icon.png"
profileurl="http://nikkeisoftware.appspot.com/_wave/robot/profile"/>
</w:robot>
二つの<capability>タグで指定されているイベント、
一点注意事項ですが、
ロボットを作成
それでは実際にAPIを使用して簡単なロボットを作ってみましょう。
ただしここで一つ、
本稿ではサンプルは全てPythonで記述しますので、
またGAEは本連載の主題ではないためGAE開発環境の構築についても省略しています。この先に進む前に
それでは以下、
ロボット名を取得
WaveロボットはグローバルなURIを持つ必要があり、
アプリケーションIDを取得するためにはGAE管理コンソールにアクセスします。

「Create an Application」

Python Client Libraryをインストール
ロボットの名前が決まりましたので、
$ mkdir gihyo-robot $ cd gihyo-robot $ svn checkout http://wave-robot-python-client.googlecode.com/svn/trunk/src/waveapi waveapi
アプリケーションの設定ファイルを作成
GAEの設定ファイルであるapp.
application: gihyo-robot
version: 1
runtime: python
api_version: 1
handlers:
- url: /image
static_dir: image
- url: /_wave/.*
script: gihyo-robot.py
内容は上記と同じで構いませんが、
- http://
applicationURL/ _wave/ capabilities. xml - http://
applicationURL/ _wave/ robot/ jsonrpc - http://
applicationURL/ _wave/ robot/ profile
したがってPythonの場合は、
ロボット本体のPythonコードを記述
それでは、
リスト4 gihyo-robot.
from waveapi import events
from waveapi import model
from waveapi import robot
# ロボット自身が追加されたときに呼び出される関数を定義
def OnSelfAdded(properties, context):
# ルートのWaveletをコンテキストから取得
root_wavelet = context.GetRootWavelet()
# ルートWaveletに新しくBlipを作成して挨拶を書き込む
root_wavelet.CreateBlip().GetDocument().SetText("Hi, I'm Gihyo Robo.")
# 最初に実行される処理
if __name__ == '__main__':
# 名前、バージョン、アイコン、プロフィールURLを指定してロボットを作成
gihyo = robot.Robot('Gihyo Robo', version='1.0',
image_url='http://gihyo-robot.appspot.com/image/icon.png ',
profile_url='http://gihyo-robot.appspot.com/ ')
# WAVELET_SELF_ADDEDイベントのハンドラとしてOnSelfAdded関数を登録
gihyo.RegisterHandler(events.WAVELET_SELF_ADDED, OnSelfAdded)
# ロボットの処理を開始
gihyo.Run()
処理の詳細についてはソースコード内のコメントを読んでいただくとして、
- イベントのハンドラ関数を定義
- 各種パラメータを指定してロボットをインスタンス化
- ロボットインスタンスに処理するイベントとそのハンドラを登録
- ロボットを起動
とりたてて難しいところはありませんが、
ロボットのデプロイ
これで必要なファイルの作成が終わりました。この時点でディレクトリの構成は次のようになっています。
- gihyo-robot/
- image/
- icon.
png
- icon.
- waveapi/
- app.
yaml - gihyo-robot.
py
- image/
GAEを利用しているため、
$ appcfg.py update .
初めてのデプロイでは、
ロボットの動作確認
ロボットを動かしてみる前に、
<?xml version="1.0"?>
<w:robot xmlns:w="http://wave.google.com/extensions/robots/1.0">
<w:version>1.0</w:version>
<w:capabilities>
<w:capability name="WAVELET_SELF_ADDED"/>
</w:capabilities>
<w:profile name="Gihyo Robo"
imageurl="http://wave-instruments.appspot.com/image/icon.png"
profileurl="http://wave-instruments.appspot.com/"/>
</w:robot>
<w:profile>の属性はgihyo-robot.
では、

gihyo-robot.

ロボットの動きに不具合があったときには、

まとめ
今回はロボットAPIについて説明しました。ここで作成したロボットは、
ロボットは処理の流れが単純で、
Wave自体を拡張するExtensionsについては今回で終了です。次回はWaveの機能をWaveの外で利用するEmbed APIについて説明します。お楽しみに。
- 注:
- なおGoogle Waveは現在も急ピッチで開発が進められているプロダクトであり、
本連載に掲載する画面遷移・ ソースコードなどは最新版とは異なる可能性があります。記事に沿って作業していて違和感を覚えた場合にはGoogleの公開しているドキュメントを適宜参照するようにしてください。