Hubotを導入してチャットツールを便利にしよう | GCREST_engineerのブログ

GCREST_engineerのブログ

ブログの説明を入力します。

hubotとは

Github社が開発しているHubotと呼ばれる、チャット用botフレームワークをご存知でしょうか。

開発現場では口頭よりもチャット上で仕様のやりとり、コミュニケーションが行われる事は日常的です。
現在主流のチャットツールとしては、IRC,Skype,ChatWork,Slack,HipChatなどが挙げられます。

Hubotはそのチャットに常駐し、特定時間に定型文を流したり、チャット内に流れた特定キーワードに反応し返答したり、呼びかけに応じて何か処理をしてくれたりするためのbotです。
Hubot自身はbotとしての機能を持っていますが、単体ではコンソール上でしか対話する事ができません。
アダプターと呼ばれる仲介プラグインを導入することで、先に挙げたようなチャットツール上に常駐することが出来ます。
Hubotはビルトインされている機能だけではなく、自分でscriptを書くことで機能を追加することができるので自分の開発現場だけが便利になるようなScriptも導入することが出来ます。

導入してみよう

Hubotの導入は以下のページをなどを参考にしてください。
基本的にNode.jsとnpmがインストールされている環境であれば容易に動かすことが出来ます。

GitHub社謹製! bot開発・実行フレームワーク「Hubot」
第2回 インストールとHello World

ジークレストでは、チャットツールとしてSkypeが使われています。
ですので、アダプターにはSkype用のアダプターを導入します。
netpro2k/hubot-skype

コンソール上で
npm install hubot-skype

をするか、package.jsonにgit://github.com/netpro2k/hubot-skype.gitを書いてからnpm installすることで導入が出来ます。

Skype上にhubotを導入する場合、少し手間がかかりSkypeのアプリ自体が常駐している必要があります。
なので、なるべくX環境のあるサーバーを用意した方が手間が少なくすむと思います。
私のいるチームではCUI環境のみのCent OS上で動かしていますが、Hubot自体の導入よりもSkypeの導入に手間取った覚えがあります。

SkypeとHubotが連携出来たら、Hubotがいる部屋のなかで
hubot ping と呼びかけてみてください。

ping

するとpong、と返事をくれますね。

私が開発をしているコンテンツ、ポケットランドでは「ナビット」と呼ばれるうさぎのキャラクターがいます。
どうせチームにbotを導入するならば、マスコットキャラクター的な物にしたかったのでナビットの画像を設定しています。

無機質なbotよりキャラクターっぽさがある方が、チームにbot自体が受け入れやすいと思います。
ちなみに、hubotと呼びかけるのではなくnabbitと呼びかけて反応するのはhubotの起動時に-nオプションで名前を設定している事によるものです。

~/hubot/bin/hubot -a skype -n nabbit &

ここまで出来ればあとは自分たちのhubotScriptを書いたり、他の人が書いたScriptを導入するだけです。

Scriptを自作してみよう

参考までに私のチームで使っているScriptの一つを挙げてみます。

SkypeはURLを貼ってもリンクとしては認識されますが、そのページがどのようなものなのかはページを開かなければわかりません。
Slackなどは自動でtitle要素を展開してくれるので、開かなくてもどのようなページかが分かるので案外重宝します。
今回はそれをHubotにやらせてみましょう。

Node.jsは基本的にutf-8しか許容してくれないので、titleを取得したページがShift-JISなどのエンコーディングの場合、
文字化けしたまま呟いてしまいます。
なので、iconvモジュールを使ってutf-8以外のページを変換します。
URLにアクセスするのにはRequestモジュール、title要素のスクレイピングにはcheerioモジュールを使用しています。

変換するコードはこちらを参考にしています。
Node.jsで、取得したWebページをUTF-8へ自動変換する


# Description:
#   URLからtitle要素を取得してつぶやく。
#
# Commands:
#  url title, but if page's char-set except UTF-8,characters were garbled.

cheerio = require 'cheerio'
request = require 'request'
iconv = require "iconv"
module.exports = (robot) ->
  robot.hear /https?:\/\/\S+/i, (msg) ->

    url = msg.match[0]
    options =
      url: url
      timeout: 2000
      encoding: "binary"
      headers: {'user-agent': 'node title fetcher'}

    request options, (error, response, body) ->
      conv = new iconv.Iconv(getCharset(body),'UTF-8//TRANSLIT//IGNORE');
      body = new Buffer(body, 'binary')
      body = conv.convert(body).toString();
      $ = cheerio.load body
      title = $('title').text().replace(/\n/g, '')
      if title isnt null && title isnt "" && title isnt "401 Unauthorized"
        msg.send(title)
      else

getCharset = (body) ->
  bin = body.toString('binary')
  re = bin.match(/<meta\b[^>]*charset=["']?([\w\-]+)/i)
  if re
    charset = re[1]
  else
    charset = "utf-8"
  charset

このscriptを導入してあげて、Skype上にURLを貼り付けると

title


といったようにタイトルを呟いてくれるようになりました。

終わりに

今回の内容だけでは、「ただ返答してくれるおもちゃ」程度くらいの認識にしかならなかったかもしれません。

ですが、業務に直結するような便利なScriptを書けば、例えば「hubot deploy testenv」と言うだけでテスト環境をdeployしてくれたり、「hubot launch aws」というコマンドで開発用のAWSインスタンスを立ち上げて各種ミドルウェアなどをセットアップしてくれる、といったことが可能になります。

コンテンツの開発も重要ですが、Hubotを導入していくなど、エンジニアが快適に開発出来るような環境を構築していくことも重要だと考えています。