Rubotyが代わりに「ちょっとHerokuの様子みてくる」ruboty-heroku_statusを公開した
Rubotyが代わりにちょっとHerokuの様子みてきてくれる。
くふうしたところ
気持ちのぶん人間らしい受け答えをさせるようにした。
さくっと作れて実用度が高くなるようにした。
Heroku Statusは簡単なjsonのapiなのでRuby標準ライブラリだけで扱える。
ChatOpsを意識
改めてRubotyの記事を読むと次のようなことが書いてあった。 実用度低いもの作っても使わなくてもったいないのでChatOpsに使えそうなものを作った。 作者の意思を尊重。
元々DevOpsのOpsの部分を任せる用途(=ChatOps)で開発をはじめたので、 その辺を便利にするプラグインをつくってBotと仲良くやっていきたいという気持ち。
まとめ
私のRubotyはHerokuで動いてる。 なので「ちょっとHerokuの様子見てくる」までもなくHerokuに何かあるといち早く姿を消す。 予想外に実用度が低いプラグインになったぞ、、、
rubotyにウェブサイトのスクショを撮らせるプラグインruboty-ssを公開した。
デフォルトだと画像はGyazoに保存される。Dropboxに保存することも出来る。
試したもの
json-collectionとjsonism
GistのAPIを叩くために使った。 画像の添付などmultipartでpostしようとして少し時間がかかった。 ほんとはもっと楽な方法あるのかもしれないけどやり方がわからなかったので内部のfaradayのconnection差し替えたりしてそこが面倒だった。
phantomjs-gem
今まではHerokuでPhantomJSを動かしたい場合、phantomjsのビルドパックを使っていた。
今回はphantomjs-gem
を使うことにした。あまり何も考えていなくてもHerokuでphantomjsが動かせて便利。
こういうバイナリダウンロード系のgem、Herokuで雑に動かしたいときにすごく役に立つ。
dropbox api
公式のクライアントを使った。 access tokenさえ取れれば比較的なんでも出来る。
gyazo api
どうでもいい画像はるときに便利。消せないのが残念だけど画像を貼るだけに特化しているのですごく扱いやすい。
ハマったところ
Gistに画像が貼れない
画像の保存先としてGistを使おうとしたがGistはAPIから画像を保存することはできない。 もしも保存したいのならば
- APIを使いGistを作る
- GistをcloneしてきてGitでimageを追加したコミットをpushする
の2ステップが必要なのであきらめた
反省
結局画像の保存先選びが一番苦労した。 Gist/Dropbox/Gyazoの順で試していったが最初からGyazoればよかった。
スクリーンショットを撮るサービスは探せばありそうだ。
- PhantomJS使ってウェブサイトをキャプチャする処理
- 画像を保存する処理
どちらもやってくれるサービスを探せばよかった。
次に向けて
RubyのライブラリがないAPIを叩くとRubotyのプラグインをつくるついでにライブラリのgemが1個できるのでよさそう。 既存のgemを使うだけだと書いててお得感が無い。
rubotyが電話をかけて返事を聞いてくれるruboty-callを公開した。
Twilioを使ってrubotyが電話をかけてくれるプラグインを公開した。
使い方
くふうしたところ
rubotyがやってくれるとうれしいことを考える
私は電話がにがてなのでrubotyに代わりにしゃべってもらうことにした。 rubotyに何かたのんだ結果がなるべく現実世界に反映されるようなものをつくっていきたい。
誰かがやってくれてることは自分でやらない
Twilioでは通話の際の指示をTwiMLの形式で書く。 通話 を発信するAPIではTwiMLのURLをパラメータとして渡す。
動的にTwiMLを組み立てたい場合、自分でTwiMLを返すサーバーを書くのもめんどくさいときはhttp://twimlets.com/echoを使うと、パラメータで渡したTwiMLをそのまま返してくれる。使い方はドキュメントに書いてある。
これからやりたいこと
会話のstatsを@ruboty twilio stats
のような感じで取れるようにしたい。
本格的に運用する際は料金が気になる。
まとめ
Twilioは今回はじめて使ってみたけど、ライブラリが整っており、しゃべらせるぐらいなら簡単にはじめることができた。他のAPIもためしていきたい。
本格的におしゃべりしたいからruboty-twilio
のruboty adapterがほしいな。
RubotyでHubotスクリプトが使えるruboty-hubotを公開した
TL; DR;
ruboty-hubot
を使うとscripts
ディレクトリ以下に置いた単純なHubotスクリプトをRubotyで実行出来る。
経緯
以前、Hubotスクリプトのhubot-sushiyukiをruboty-yasyとして移植した記事のまとめで、HubotスクリプトをRubotyで動かせるのではないかと書いた。
今回はHubotスクリプトを人間が読んで解釈してRubotyにわかるように翻訳した。 Hubotのプラグインのインターフェイスはある程度決まっている。 RubotyとHubotスクリプトの間をつなぐようなハンドラーがあれば、HubotスクリプトをそのままRubotyのスクリプトとして動かすことも出来るのではないかと考えている。
実際に可能なのか実験してみた。
くふうしたところ
RubotyとHubotスクリプトをつなぐ
lib/ruboty/hubot/robot.rbでHubotのAPIを実装し、Rubotyから結果を取れるようにした。
Herokuでも動く
heroku/heroku-buildpack-rubyではexecjs
が入っている場合、JSの実行環境としてnode
をインストールしてくれる。
ちなみにnpmは入らない。Rubyのビルドパックに加えてnpmも欲しい場合はddollar/heroku-buildpack-multiを使うとよい。
もんだい
npm
パッケージとして公開されているhubotスクリプト、external-scripts.json
に書かれているようなものが実行できない。hubot-scripts.json
が読み込めない。.coffee
で書かれたhubotスクリプトが実行できない。- インターフェイスの互換性が
robot.respond
しか実装できていない。(robot.hear
やrobot.http
がない` require
などCommonJSっぽい機能はexecjs
で使えない。なので外部パッケージに依存するスクリプトは実質動かせない。- Hubotのrobotと同じように互換層を
ruboty-hubot
側で用意してあげると実行できるようになりそう。
- Hubotのrobotと同じように互換層を
まとめ
思ったよりも簡単にHubotが動いてしまった。ただし実用するには問題が多々ある。 JSとRubyの境界線に小さい穴をあけて通り抜けるのは簡単だけど自由に行き来できる大きな穴をあけるのは難しい。
西暦を和暦の元号に変換してくれるruboty-gengoを公開した
1日1Hubotスクリプトのネタをパクることにした。
Usage
@ruboty gengo <year>
くふうしたところ
自分で何も書かずgemに頼った。
まとめ
毎日実用的なものやAPIを叩くなど重そうなものを書くのはちからがいる。 重め軽めのgemを交互に挟むことで燃え尽きないようにしたい。
Rubotyすしゆきプラグインruboty-yasyを公開した
すしゆきを表示してくれる。 naoyaさんのhubot-sushiyukiをRubotyに移植した。
TL; DR
Rubotyプラグインをつくるのを楽にして、みんなに面白いスクリプトいっぱい公開してほしい。
ハマったところ
gemの名前被り
ruboty-sushiyukiが存在するのに気づかずに作り始めてしまい、別の名前にリネームしたりで手間どった。
部屋全体に流れているメッセージの受け取り方がわからなかった
Rubotyのハンドラーでon
を使うと、デフォルトだと@ruboty
で自分宛にきたメッセージにしか反応しない。
全体の発言に反応するためにはall
オプションをtrue
に設定する。
module Ruboty module Handlers class Yasy < Base on /寿司|鮨|スシ|:sushi:|🍣/, name: 'gossip', description: ':sushi: | 壁 | :ear:', all: true end end end
元々がhubotのプロジェクトなのでgemを公開するのに必要なファイル群がない
bundle gem
などでgemのプロジェクトを作成するとrubygemsに公開するために必要なものが一通りそろっていて便利。
Rubotyで何かしらハンドラーとアクションを作る場合、lib/ruboty/handlers/your_handler.rb
やlib/ruboty/your_gem/actions/your_action.rb
が必要になる。
それらのファイルを作成するための補助的なコマンドが欲しい。 例えば、以下のようなイメージです。
ruboty gem your_gem
ruboty generate handler your_handler
ruboty generate action your_action
元々がhubotのプロジェクトなのでrubyじゃない
Hubotのスクリプトを移植するだけだがそれなりに手間がかかる。 HubotのスクリプトをRubotyのhandlerとして実行できるようなプラグインが求められている。 sstephenson/execjsなどを使って実現できないだろうか。
まとめ
Rubotyプラグインをつくるのを楽にして、みんなに面白いスクリプトいっぱい公開してほしい。
自分のプラグイン作成の体験から以下のようなことをやるともっと楽にプラグインつくれるんじゃないかなと考えます。
rubotyプラグインの作成の障壁を下げたい
毎日rubotyのプラグインを公開し続けて4日目になった。
私が一からrubotyのプラグインを作るお作法は以下の通りだった。
3の部分が以外と手間がかかる感触で、そこが無ければプラグイン作成の障壁が下がると思う。
上の方であげたruboty gem
コマンドがあれば1や3を自動で作れるのではないだろうか。
- 既存のプラグインがないかrubygems.orgで確認する
bundle gem ruboty-yo
でgemを作る- 会話に反応してリアクションをとるには
lib/ruboty/handlers/yo
とlib/ruboty/your_plugin/actions/yo.rb
のファイルが必要 rake release
で公開
HubotスクリプトをRubotyで動かす
今回はHubotスクリプトを人間が読んで解釈してRubotyにわかるように翻訳した。 Hubotのプラグインのインターフェイスはある程度決まっている。 RubotyとHubotスクリプトの間をつなぐようなハンドラーがあれば、HubotスクリプトをそのままRubotyのスクリプトとして動かすことも出来るのではないかと考えている。