ChatWorkがメッセージ取得APIを解禁したのでHubotと連携させてみよう!(業界初かも)


ChatWorkがメッセージ取得APIを解禁したのでHubotと連携させてみよう!(業界初かも)

こんにちは、LIGエンジニアののびすけです。そろそろブログ執筆数ではかなり上位に食い込んできている気がしています。

ChatOpsな世界では、Slack x Hubotの組み合わせが多いですが、弊社ではChatWorkを利用しているのでChatWork x Hubotを導入してみます。

そろそろChatWorkの導入実績に弊社も載らないかな〜(チラチラ)

さて、今回はみなさんご存知ChatWorkとHubotを連携させてBotを作ってみようと思います。

Github製Bot作成フレームワークHubot

Hubot

今をときめく、Bot作成用のフレームワークです。イケてるWeb系企業は社内のチャットツールに導入しているところも多いと思います。
詳しくは以下の記事をご参照してください。

2014年11月にメッセージAPIが解禁されたChatWork API

先日の記事「ChatWorkの定期連絡を自動化!ChatWork APIを使って業務効率化してみた。」でも書いたのですが、ChatWorkのAPIは現在プレビュー版として公開されています。この記事が公開された2014年10月の段階ではメッセージ取得ができませんでした。

しかし2014年11月27日には、こちらの参考記事「速報! ChatWorkAPIでメッセージ取得が出来るようになったので、メッセージに反応するBOT使ってみました。」にもあるように、ChatWorkAPIでメッセージ取得ができるようになりました。

何ができるようになったの?

これまではメッセージ取得ができなかったので、ChatWorkにBotがメッセージ投稿するだけの一方通行な処理しかできませんでしたが、今回、メッセージ取得ができるようになったので、ユーザがBotに話しかけることができるようになりました。

従来

 
サーバー側で色々処理 –> ChatWorkAPI –> BotがChatWorkに投稿

今まではサーバー側で時間指定など何かしらのイベントを別途用意して実行する必要がありました。

今回

 
ユーザがBotに呼びかける –> ChatworkAPI –> サーバー側で色々処理 –> ChatWorkAPI –> BotがChatWorkに投稿

今回のメッセージ取得APIでBotとユーザーの双方向なやりとりが実現できます。

実際に作ってみましょう。

前回の記事「社内システム担当が基礎から学ぶHubot&Slack超入門!【解説編】」からだいぶ空いてしまいましたが、今回はHubotを実装してみます。
ChatWorkAPIの準備は過去記事にもあるので省略します。APIキー(アクセストークン)をAPIページから申請して取得しておいてください。

LIGでは、「LIG子」というBot用のアカウントを作成して、LIG子アカウントでAPIキーを取得しました。

Hubotの準備

Hubotはv2.9系から公式でyoemanを利用したインストールを推奨しています。
gihyo.jpの連載での導入は、情報が古い可能性があるので注意しましょう。

Yoemanとhubotのジェネレータをnpm経由でインストールします。

$ npm i -g yo generator-hubot

これでyoコマンドが使えるようになります。yoはさまざまなアプリケーションを作成しはじめる際の雛形を生成してくれるツールです。作成するBotの名前のフォルダを作ってyoを実行します。

$ mkdir ligco
$ cd ligco
$ yo hubot

                     _____________________________
                    /                             \
   //\              |      Extracting input for    |
  ////\    _____    |   self-replication process   |
 //////\  /_____\   \                             /
 ======= |[^_/\_]|   /----------------------------
  |   | _|___@@__|__
  +===+/  ///     \_\
   | |_\ /// HUBOT/\\
   |___/\//      /  \\
         \      /   +---+
          \____/    |   |
           | //|    +===+
            \//      |xx|
            

いかついロボットアスキーアートが表示されますね。
yoのバージョンが古い場合は下のような感じで教えてくれます。最新を使いたい人はアップデートしましょう。

質問項目があるのですが、全てそのままエンターを押して進めていきました。

? Owner: n0bisuke <rsksound@gmail.com>
? Bot name: ligco
? Description: A simple helpful robot for your Company
? Bot adapter: campfire

エラーが出なければ、インストールは完了です。bin/hubotを実行してみましょう。
hubot>で待ち受け状態になると思います。hubot pingと入力するとPONGと返ってきます。
hubot pug meと入力するとパグの画像URLが返ってきて、exitと入力するとhubotを終了します。

$ bin/hubot
connect deprecated multipart: use parser (multiparty, busboy, formidable) npm module instead node_modules/hubot/node_modules/express/node_modules/connect/lib/middleware/bodyParser.js:56:20
connect deprecated limit: Restrict request size at location of read node_modules/hubot/node_modules/express/node_modules/connect/lib/middleware/multipart.js:86:15
Hubot> [Tue Jan 13 2015 18:03:41 GMT+0900 (JST)] ERROR hubot-heroku-alive included, but missing HUBOT_HEROKU_KEEPALIVE_URL. `heroku config:set HUBOT_HEROKU_KEEPALIVE_URL=$(heroku apps:info -s  | grep web_url | cut -d= -f2)`
[Tue Jan 13 2015 18:03:42 GMT+0900 (JST)] INFO Using default redis on localhost:6379

Hubot> hubot ping
PONG
Hubot> hubot pug me
Hubot> http://28.media.tumblr.com/tumblr_lim8n49s881qa9dmvo1_500.jpg
Hubot> exit

$

Hubotコマンドの基本

Hubotではデフォルトで利用できるコマンドがいくつかあります。

「Bot名 コマンド名」みたいな形で利用します。コマンドによってはBot名 コマンド名 オプション1 オプション2…というように値をいくつか指定する必要もあります。

YouTube動画

[BOT名] youtube me [検索ワード]という形式で実行します。指定した検索ワードでYouTube検索をして、動画URLを返してくれます。

Hubot> hubot youtube me liginc
Hubot> http://www.youtube.com/watch?v=qY64VacE51g&feature=youtube_gdata

翻訳

[BOT名] translate me [翻訳したい日本語]という形式で実行します。指定した単語や文章を英語に翻訳してくれます。

Hubot> hubot translate me 岩手に行きたい
Hubot> " 岩手に行きたい" is Japanese for " I want to go to Iwate "

このほかにもデフォルトコマンドはいろいろあるので試してみましょう。

HubotをChatWorkに連携させて使ってみる

いよいよ、ChatWorkと連携してみます。

akiomikさんが公開してくれているhubot-chatworkというアダプター(Hubotが各種サービスと連携するための接続ツール)を利用します。akiomikさん、ありがとうございます!

Hubotのディレクトリ内で次のコマンドを実行していきましょう。
私はligcoというディレクトリ内で作業しているので、ligcoディレクトリで作業します。

ChatWorkアダプターのインストール

$ pwd
/path/to/ligco

$ npm i hubot-chatwork --save

これでアダプターはインストールできました。簡単ですね。

環境変数にAPIの情報を保存

export HUBOT_CHATWORK_TOKEN="DEADBEEF" # APIのアクセストークンを入力します。
export HUBOT_CHATWORK_ROOMS="123,456"   # カンマ区切りでルームIDを指定します。
export HUBOT_CHATWORK_API_RATE="350"   # 1時間あたりのAPIリクエスト数(間隔)を指定します。

HUBOT_CHATWORK_API_RATEに関してですが、この数が大きいほど、BOTのレスポンスは速くなります。
ドキュメントによると 2015年1月の段階で5分あたり100回までのリクエストができるみたいです。つまり1時間あたりに換算すると1200回になるので、それを超えない値を設定する必要があります。余裕を持たせて800くらいに設定しておきました。

# 実行してみます。

-aオプションでChatWorkアダプターを利用してHubotを実行します。
-nオプションでチャット側で呼び出す際のbot名を指定できます。

$ bin/hubot -a chatwork -n ligco

あらかじめ、botを利用したいチャットグループにはbotを参加させておいてください。

チャットワークで呼びかけてみましょう。

LIG子が返事をしてくれました〜!!
「愛してる」という単語を冷静に翻訳してくれるLIG子さん流石です。

今回の目的だったHubotとChatWorkの連携がうまくできました。

まとめ

いかがでしたでしょうか。
Hubot x Slackはよく聞きますが、Hubot x ChatWorkはまだ活用例があまり上がっていない印象です。でも、今回ご紹介したような方法でChatWorkを利用しているチームでもチャット側からコマンドを送ることができるようになります。
Hubotに独自のコマンドを作ることもできますので、チームが抱える課題によって便利なコマンドをどんどん作って活用していきましょう。

次はLIG社内の課題へのソリューションをHubotとChatWorkで解決してみようと思います。
 
乞うご期待! それでは。

 

【チャットツールを思いのままに】

ChatWorkの定期連絡を自動化!Chatwork APIを使って業務効率化してみた。

社内システム担当が基礎から学ぶHubot&Slack超入門!【解説編】

チャットツールをGitとNode.jsとHerokuでDIYする方法〜環境構築編〜

チャットツールをGitとNode.jsとHerokuでDIYする方法〜画面作成編〜

チャットツールをGitとNode.jsとHerokuでDIYする方法〜相手作成編〜


この記事を書いた人

のびすけ
のびすけ バックエンドエンジニア 2014年入社
岩手から上京してきました。

ギークハウスを経て、現在は0円シェアハウスに住んでいます。

好きなスポーツはフットサル/雪合戦/わんこそばです。

2015年は東京Node学園で登壇してみたいです。

・milkcocoa公認エバンジェリストになりました。(https://mlkcca.com/)
・gihyo.jpで記事書いてます (http://gihyo.jp/dev/feature/01/milkcocoa-baas)
・html5experts.jpで記事書いてます。(https://html5experts.jp/n0bisuke/)