最近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を立ち上げる。
続いてcurlで以下のコマンドを叩き、エンドポイントに対して投げてみる。
$ curl -X POST http://localhost:8080/hubot/say -d message=こんにちは -d room='#dev'
するとHubot側に以下のような文章が表示された。
使えた。これでmessageとroomを指定してHTTPで叩くだけでHubotがしゃべることが出来るようになった。
注意点
注意点としては、手軽さを重視してtokenなどを入れなくても投稿できるようにしているので、他の人から利用できる場所にエンドポイントを置いてしまうと、悪用されてHubotに投稿される可能性があること。きちんとアクセス制限をかけたり、それが面倒だったらSlackを使う分には素直にIncoming Webhookを利用するのが良さそう。
まとめ
今回はSlackでikachan的なことをするためにHubotを利用してみました。最近のhubot scriptはどこを探せばよいかわからないですが、npmを探せばよいのだろうか、というところが気になりポイントでした。