$shibayu36->blog;

クラスター株式会社のソフトウェアエンジニアです。エンジニアリングや読書などについて書いています。

hubotにikachan的な役割を担わせる

最近Hubotの導入をしている。今回はHubotを導入したらikachanというツールの代替も出来たのでそのメモ。

ikachanとは

ikachanとは、HTTPのAPI経由でIRCに対してメッセージを送るように出来るようになるPerl製ツール。ikachanはdaemonとして動き、特定portでLISTENされるので、そこにcurlなどを使ってPOSTすると簡単にIRCにメッセージを送れる。これまで様々な人がIRC botを作って、投稿する部分を実装していたのだけど、ikachanがproxyとしてHTTP APIを提供してくれるので、それを起動しておいてHTTP APIを叩くだけでひとまずメッセージを送る部分のbot実装は作る必要が無くなった。

IRC -> Slackへ

最近IRCからSlackに移行した。それにより、ikachanはIRC投稿のproxyだったため、使えなくなってしまった。もちろんSlackにはIncoming webhookというのが存在し、HTTP APIを使って投稿も出来るのだけど、発行されるtokenをPOSTの情報に含めないといけないため、少し手軽さにかけていた。

そこでHubot導入もしたので、今度はHubotを使ってikachanとほぼ同様のことが出来ないか考えた。

Hubotでikachan的なことをする

実現したいことは「HTTP APIでmessageとchannel情報を送ったら、そこにメッセージを投げてくれる」だけ。もうどうせ他にそういうのあるだろうと思ったので、探してみると案の定同じような実装が存在した。
hubot-scripts/http-post-say.coffee at master · github/hubot-scripts · GitHub

使えるようにする

最近はhubot-scriptsはdeprecatedになっている(https://github.com/github/hubot-scripts/issues/1113)というのと、推奨されているnpmへの移行がされていなさそうだった(?)ということ、実際にhubot-post-sayを利用してみるとちょっとバグってたので、コピーして手直しして自分のHubotのscripts以下に入れるということをした。

diff --git a/src/scripts/http-post-say.coffee b/src/scripts/http-post-say.coffee
index 29ae14a..10ffa96 100644
--- a/src/scripts/http-post-say.coffee
+++ b/src/scripts/http-post-say.coffee
@@ -36,7 +36,7 @@ module.exports = (robot) ->
     envelope.user.type = body.type or 'groupchat'

     if message
-      robot.send user, "#{message}"
+      robot.send envelope, "#{message}"

     res.writeHead 200, {'Content-Type': 'text/plain'}
     res.end 'Thanks\n'

これで手元で/hubot/sayエンドポイントが作成されて、そこにcurlすることで使えるようになった。

実際に使ってみる

まず手元でbin/hubotすることにより、Hubotを立ち上げる。
f:id:shiba_yu36:20141013095630p:plain

続いてcurlで以下のコマンドを叩き、エンドポイントに対して投げてみる。

$ curl -X POST http://localhost:8080/hubot/say -d message=こんにちは -d room='#dev'

f:id:shiba_yu36:20141013095656p:plain

するとHubot側に以下のような文章が表示された。
f:id:shiba_yu36:20141013095709p:plain

使えた。これでmessageとroomを指定してHTTPで叩くだけでHubotがしゃべることが出来るようになった。

注意点

注意点としては、手軽さを重視してtokenなどを入れなくても投稿できるようにしているので、他の人から利用できる場所にエンドポイントを置いてしまうと、悪用されてHubotに投稿される可能性があること。きちんとアクセス制限をかけたり、それが面倒だったらSlackを使う分には素直にIncoming Webhookを利用するのが良さそう。

まとめ

今回はSlackでikachan的なことをするためにHubotを利用してみました。最近のhubot scriptはどこを探せばよいかわからないですが、npmを探せばよいのだろうか、というところが気になりポイントでした。