2018/06/07

「Slack」のbotを「知話輪」に移行した

こんにちは、エンジニアの藤本です。
プロダクトデザイン本部で、ビジネスチャット「知話輪®」の開発を担当しています。
今回は、以前社内で使っていたチャットツール「Slack」上で動かしていたbotを、「知話輪」に移行したときの話をします。

最近では、botで業務を自動化することが珍しくなくなってきましたが、弊社も例外ではありません。
例えば、botを操作して検証環境を「AWS」上に構築するAWS botは、社内の9割が使う、なくてはならないものとなっています。
このAWS botは現在社内で使っている「知話輪」より歴史が長く、以前は「Slack」で管理されていました。
このAWS botを「Slack」から「知話輪」に移し替えること。これが「知話輪」誕生に際して私に課せられたミッションでした。

ミッション内容を整理すると、以下の3点になります。

  • 現在「Slack」で動いているAWS botを「知話輪」で動くようにすること
  • 変更箇所を最小限に抑えること
  • 期限は1週間

知話輪Adapterの実装

では、与えられたミッションのクリアに向けて、どんなふうに進めていったのか、紹介したいと思います。

まずは、現在のbotがどういう仕組みで動いているのかを知らなければなりません。
AWS botがRubotyで作られているという情報をもとに中身を見ると、ruboty-slackという今回のミッションにもっとも関係がありそうな存在が鎮座していました。
このruboty-slackは、botと通信先をつなげるAdapterと呼ばれる構成要素とのことです。どうやらこれの「知話輪」版を作れば、AWS bot本体のロジックは変える必要がなさそうです。

ということで、作成したRuboty用の知話輪Adapterがこちらです。
AWS botのGemfileに書かれていたruboty-slackをruboty-cwwに書き換え、dotenvで使う.envファイルに必要な環境変数をセットするだけで使えるようにしました。
このAdapterを使うことで、「知話輪」とbotの間でメッセージのやりとりができるようになります。
以下の画像のように、popyと名付けたbotから応答が返って来ることを確認しました。
実装のための調査に2日、実装1日で仕上げました。

AWS_botからの応答
ここからは、実装の詳細を解説します。
参考にしたruboty-slackの実装は、以下のようになっていました。

  1. チャンネルの、最後に取得したメッセージ以降のメッセージを定期的に取得する
  2. 取得したメッセージをbotへ渡す
  3. botから帰ってきたメッセージをチャンネルへ投稿する

ruboty-cwwも、これにならって実装しています。

 

1を実装しているのが、get_messagesです。

メッセージ一覧取得APIを使って「知話輪」のグループからメッセージを取得しています。
メッセージ一覧取得APIを使うには、指定されたエンドポイントへGETリクエストを投げればOKです。
message_get_pathで、エンドポイントへのURLを作成しています。

これによって作成されるURLは、以下のようになります。

https://{企業ID}.chiwawa.one/api/public/v1/groups/{グループID}/messages?createdAtFrom={最後に取得したメッセージの作成日時}

createdAtFromを指定することで、その日時以降に作成されたメッセージを取得できるため、「最後に取得したメッセージの作成日時」を入れて、新しいメッセージの取得としています。
APIからJSON形式で返ってきたデータをparseしてハッシュオブジェクトとし、「最後に取得したメッセージの作成日時」を、直近で取得したメッセージのものに更新しています。

2を実装しているのが、listen_groupです。

get_messagesで取得したメッセージからbot自身が発言したメッセージを除き、botへと渡しています。

3を実装しているのが、sayです。

メッセージ投稿APIを使って、「知話輪」のグループへメッセージを投稿しています。
メッセージ投稿APIを使うには、メッセージ一覧取得APIと同じエンドポイントへPOSTリクエストを投げればOKです。
リクエストボディにセットされたJSON形式のデータがAPIに送られ、メッセージが投稿されます。
post_message_dataで、そのJSONを作成しています。

 

今回は「知話輪」とbotの間で単純な文字列しか渡していませんが、Adapterを書き換えることで自由に設定できます。メッセージ投稿APIのドキュメントも確認しつつ、自由にカスタマイズしてください。
書き換える箇所の目印として、70行目78行目にコメントを入れています。

Ruboty以外にNode.js用SDKも用意していますので、こちらもぜひ使ってみてください。