RubyでGoogle Waveのロボットを作れるライブラリ作りました

http://github.com/technohippy/ruby-wave-robot-api

今年のGoogle I/OGoogle Waveのロボットプロトコルが公開されたので、ちょっと待ってればいろんな言語のライブラリが出てくるのかなーと思ったら全く出てこなくて*1、待ちきれずRuby版を自分で作ってみた。んで、考えて見ればv2対応した自家版ロボットライブラリって初かもしれないので「どやっ」って感じでGooge Waveのフォーラムで公開したらほぼ相手にされなかったから、ションボリしつつここで自分で紹介することにする。

サンプル

サンプルコードはいまのところこんな感じ。もうちょっと動いたら糖衣メソッド作って使いやすくするつもり。

require 'rubygems'
require 'sinatra'
require 'waveapi'

robot = Waveapi::Robot.new(
  'Ruby Tutorial', 
  :base_url => '/sample-robot', 
  :image_url => 'http://ruby-wave-robot.heroku.com/images/icon.png',
  :profile_url => 'http://ruby-wave-robot-api.heroku.com'
)

robot.register_handler(Waveapi::WaveletSelfAddedEvent) do |event, wavelet|
  wavelet.reply("\nHi everybody! I'm a Ruby robot!")
end

robot.register_handler(Waveapi::WaveletParticipantsChangedEvent) do |event, wavelet|
  new_participants = event.participants_added
  new_participants.each do |new_participant|
    wavelet.reply("\nHi : #{new_participant}")
  end 
end

robot.start

PythonでもJavaでもロボットAPI知ってればやってることは分かるだろうし、知らない人はこの記事に興味ないと思うので説明は省略。とにかくこれでロボットはWave上で参加者にあいさつしたりする。

サンプルを動かす

サンプルはどこで動かしてもいいけどHerokuを使うのが準備不要で一番手っ取り早いと思う。Herokuをインストールしてない人はgemでインストールしておく。

$ sudo gem install heroku

次にherokuコマンドで新しいアプリを作成。アプリ名は一意じゃないと叱られそうな予感。

$ heroku create 任意のアプリケーション名

んでライブラリ&サンプルをgithubから取ってくる。右上の「ダウンロード」から落としてくれば簡単なんじゃなかろうか。それをアプリケーションディレクトリに展開。

その時の気分次第では、gitの上がっているものは起動されるはずのサンプルが作成中だったりするので、先に書いたサンプルを実行するのであればconfig.ruを開いてrequire文を

require 'examples/ruby-tutorial'

だけにしておく。

GAE以外で動かすロボットはGoogleに登録しておく必要があるのでここで登録。まずは登録サイトを開いて必要な情報を入力。

ロボットのベースURLは先程Herokuで作成したアプリのURL+任意のディレクトリ。ディレクトリ名はデフォルトでは'/sample-robot'になってる。違うのを指定した場合はロボット初期化時の:base_urlパラメータを変更しておくこと。

robot = Waveapi::Robot.new('Ruby Tutorial', :base_url => '/指定したディレクトリ名')

あと、submitすると登録者がこのロボットのURLの管理者であることを確かめるためにverify tokenが示されるので、サンプルに次の行を追加。

robot.verify_token = '画面で指定されるトークン'

で、デプロイ。

$ git add .
$ git commit -m 'new'
$ git push heroku master

デプロイできたらロボットの登録を完了。完了時にコンシューマ・キーとコンシューマ・シークレットが表示されるので、使わないけど一応メモっとくこと。

あとはWavesandboxを開いて*2、登録したロボットIDをwaveの参加者として追加してやると普通に動く。

ちなみにwaveロボットライブラリを作るのは、JSONを受け取ってまたJSONを返すだけなので別に難しくはないんだけど、APIが多くて単純に面倒くさい。いまgithubに登録されてるものも多分まだ全体の3-4割しか実装されてないので注意。これ使ってなにか作りたいから優先して実装して欲しいAPIがある人がもしいれば検討するのでコメントをどうぞ。

*1:中の人(多分)が作ったGo言語版のライブラリはデモ専用みたいな適当すぎる作りだし・・・

*2:GAE外のロボットはいまのところサンドボックスでしか利用できません