せっかくならデキるエンジニアになりたい

SIerになったので、デキる技術者を目指していろいろ試してみたときの備忘録

memorandum

Let's be a good engineer!

Watson AssistantとSlackをNode-REDで連携させた話

なんでSlackと連携?

Watson Conversation-Slack間の連携なんて、正直言ってググれば2016年くらいからいろんな人がやってる記事がめちゃくちゃ出てくるんですけど、如何せんオリジナリティを出せるほどの技術力と知識がないので、参考にできる記事がいっぱいある分野で慣れていこうと言う、そういう魂胆です(*´-`)

ちなみに、この記事の続きです。

moeka-dev.hatenablog.com

どうやって連携させる?

Slackと連携となると、どうやらこの二つを使うのが主流なようです。

比較項目 BotKit Node-RED
概要 チャットボットを作るためのフレームワーク。Slackでの活用実績が異様に多い(個人の所感)。 ブラウザベースのフローエディタツール。IOTアプリやWebアプリがビジュアルプログラミングっぽく作れる。
公式サイト https://www.botkit.ai/ https://nodered.org/
https://nodered.jp/←日本語版
開発元 XOXCO社 英国IBM(Hursley研究所)
必要な環境 Node.js Node.js
IBM Cloudから動かすのであれば特になし
便利そうなサイト Creating a smart ChatBot for Slack←SlackAPI公式チュートリアルから辿れる Node-REDのデザインパターン10選
Watsonに博多弁をしゃべらせてみたIBM公式サイトから辿れる
GitHub https://github.com/howdyai/botkit https://github.com/node-red/node-red

Botkitと(多分)似たようなチャットボット用FWであるHubotもありましたが、これはWatson-Slack間連携においてはそんなに参考になりそうな記事が多くなかったのでパス。

BotKitとNode-REDのどちらを使うかですが、そもそもボットの動作部分はWatson Assistantで前回作ったし、わざわざチャットボットのFWを使うまでもないかなっていうのと、IBM Cloud上で簡単に使えそうってことで、Node-Redを採用することにしました!

Node-REDをIBM Cloudで使う準備

出来るだけ公式ドキュメントを使おうっていうスタンスで頑張っているので、色々と記事はありますが、できる限り公式に沿ってやって行きたいと思います。

というわけでこのページを探し当てました。
Running on IBM Bluemix

ボイラープレートアプリケーション

Node-REDは、IBM Cloud上でボイラープレートアプリケーションとして提供されています。

(´-`).。oO(ボイラープレートってなんだろう)

しばらく調べてようやくそれっぽい記述を見つけました。

ランタイム
アプリケーションの実行に必要な言語環境のことです。JavaやNode.jsなどの言語環境を利用できます。
サービス
アプリケーションが使用する機能を提供する、事前定義済みのミドルウェアやアプリケーションのことです。データベースやモバイルPush通知などがあります。
アドオン
アプリケーション開発や運用を支える機能を提供します。DevOps関連の機能や、負荷に応じて自動的にリソースを拡張するAuto Scalingなどがあります。
ボイラープレート
ランタイムとサービスの典型的な組み合わせを事前に定義したものです。アプリケーションをとにかく作り始めるときに便利です。ボイラープレートから作成した環境に、サービスを追加することも可能です。

BMの次世代クラウド・プラットフォーム "IBM Bluemix"より引用

IBM CloudではなくIBM Bluemix時代の記事ですが、おそらく意味合い的には変わらないと思います。ボイラープレートはつまり、これさえあればすぐにツールが使えるようになるよっていうツールのセット、DockeでいうDockeイメージみたいな立ち位置ってことですかね!(投げやり)

Node-REDの導入

その便利なボイラープレートアプリケーションであるNode-REDを、早速導入していこうと思います。
ダッシュボードがあるページの上メニューの「カタログ」から見つけることができました。 f:id:moeka-dev:20180318201439p:plain

確かにボイラープレートって書いてますね。

Node-REDが利用できるボイラープレートアプリケーションは、「Node-RED Starter」と「Internet of Things Platform Starter」の2つがあるみたいなんですが、後者はWatson IoT Platformのデフォルトフローが入っているようです。
でも特にIoTで使うわけではないので大人しくNode-RED Starterをクリックします。

f:id:moeka-dev:20180318201446p:plain アプリ名とホスト名を入力。下部で月額費用計算してるのがちょっと怖いけどライトプランなら無料なはず。

f:id:moeka-dev:20180318201454p:plain f:id:moeka-dev:20180318201502p:plain

ちょっと下にスクロールしたら、「SDK for Node.js」と「Cloudant NoSQL DB」のプランが別途選べるようになっていました。なるほど、これを一緒に使えるようにしてくれるからボイラープレートなんですね。ランタイムはNode.jsだから必須だとして、きっとDBはIBM Cloudantじゃなくても良いけど、これがおすすめだよってことなのでしょう。

f:id:moeka-dev:20180318201510p:plain 数分待つとアプリケーションが起動するので、https://<yourAppName>.mybluemix.netというURLでNode-REDにアクセスしました。

f:id:moeka-dev:20180318201518p:plain セキュリティの設定などなどを行なうと…

f:id:moeka-dev:20180318201539p:plain はい、英語です。知ってましたのでダメージは軽いです。とりあえずGo to your Node-RED flow editerをクリックしてみます。

f:id:moeka-dev:20180318201547p:plain 導入が簡単すぎる…

Node-REDでフロー作成

Slackノードの追加

デフォルトではSlackノードが左側のパレットにないので、どうやら導入作業が必要らしいです。Slackと連携するためのパッケージは、Node-RED公式サイトのflowから検索できるようなので、Slackというキーワードで検索します。 f:id:moeka-dev:20180318201601p:plain f:id:moeka-dev:20180318201608p:plain

おお、いっぱい出てき...ん?

node-red-contrib-slacker
Node RED Slack integration built on top of botkit from howdy.ai

howdy.aiがbotkitを作ってて、それを元にNode-REDのSlackノードが構築されている…?
howdy.aiとは!?と思ったんですけど、冒頭でbotkitのGithub調べた時のURLがhttps://github.com/howdyai/botkitでした。めちゃくちゃhowdy.aiですね…

というか比較までしたのに結局裏でbotkit使ってるものもあるっていう笑

とりあえず使うノードを決めたいんですが、それっぽいのだけでも結構あります。迷います。
でもnode-red-contrib-slackだけダウンロード数が桁違いなので、これで良さそうな気がします。中身の説明→node-red-contrib-slackを読んでみても、一番説明もしっかりしてるし用途もあってそうです。
ざっくり言うとSlack.comにWebhookでPostを送信するってことですよね。いけそう。

ありがたく使わせていただくことにします。

このありがたいノードを使うには、公式ドキュメントによるとpackage.jsonファイルに依存するパッケージとそのバージョンを記述するらしい(mavenでいうpom.xml的な感じかな?)んですが、わざわざファイルいじらなくてもできるようです。

f:id:moeka-dev:20180318201553p:plain パレットの管理から「ノードの追加」で検索して

f:id:moeka-dev:20180318201616p:plain 追加!

一瞬何も変わらなくて焦りましたが、F5したらちゃんと追加されてました! f:id:moeka-dev:20180318201623p:plain

Nodeを作成

各ノードの役割が、ちゃんと「ノードのヘルプ」と言うところに表示されるので、読んでみます。 f:id:moeka-dev:20180318201627p:plain

slack
msg.payloadをSlackに送ります。Slack Channelに簡単に投稿できる方法です。 msg.channelを設定することで投稿するチャンネルを切り替えることもできます。 msg.attachmentsを追加すると、Slack Attachmentも使えます。

Slack Attachmentっていうのはこれのことですね。

Slack Bot In
Slack Botがメンバーになっている任意のChannelにリスナーを提供します。 着信メッセージをmsg.payloadに格納して出力します。 msg.SlackObjには完全なSlackMessageの詳細が格納されています。 edit dialogueでチャンネルを制限することもできます。

Slack Bot Out
Bot API Tokenに基づいてmsg.payloadをSlackに送ります。 msg.channelを設定することで投稿するチャンネルを切り替えることもできます。

slackとSlack Bot Outの使い分け方がいまいちピンと来なかったので、ノードの中身をみてみることにします。

これがslack f:id:moeka-dev:20180318201634p:plain

これがSlack Bot Out f:id:moeka-dev:20180318201639p:plain

Webhookを使うか、Bot API Tokenを使うかの違いのようです。
正直用途的にはめちゃくちゃどっちでもいい気はするんですが、Slack Bot Inの方がTokenを使うので、出力の方もそれに合わせることにします。

とりあえずざっくりした流れはこんな感じですよね。 f:id:moeka-dev:20180318201653p:plain

Slackの設定

Slackでwatsonという名前のbotを作りました。 f:id:moeka-dev:20180318201643p:plain

API Tokenをコピーして、Node-REDのSlack Bot InとSlack Bot Outのノードに指定します。
(API Tokenの部分を不可視にする画像加工が面倒くさいのでスクショは撮ってないです(*・ω・)ノ)

Watson Conversationの設定

f:id:moeka-dev:20180318201648p:plain 前回作ったWatson AssistantワークスペースのWorkspaceIDとユーザID、パスワードを
Workspaces/(ワークスペース名)/Deploy/Credentialsから取得し、Node-REDのconversationノードに設定します。
(これもスクショなしです)

Nodeを繋げる

このノードたちを繋げていきます。 f:id:moeka-dev:20180318201653p:plain

Slack In - Say Hello間

Slack InはSlackから入力された言葉をそのままmsg.payloadに格納していて、Say Hello(conversation)はmsg.payloadに格納された言葉を分析すると書いているので、とりあえずそのまま繋ぎます。 f:id:moeka-dev:20180318201659p:plain

Say Hello - Slack Out間

Say Hello(conversation)のアウトプットは、

All Results will made available at msg.payload in JSON format.

と書いているので、ちょっと一工夫必要そうな気がします。詳細はConversation API Referenceに書いてあるそうです。 f:id:moeka-dev:20180318201703p:plain

…どこやねん…(´・ω・`)

しばらく探して頑張って見つけました。多分これでしょう!
f:id:moeka-dev:20180318201710p:plain

API Reference > Message > Send Message > RESPONSE
の部分です。ちゃんとJSON形式のレスポンスの例も書いてあるし。
Slackに喋らせたい部分→Slack Outのmsg.payloadに格納しなければならない部分はどうやら

 "output": {
    "text": [
      "Hi! What can I do for you?"
    ],

この部分のようなので、fanctionを追加してみます。
f:id:moeka-dev:20180318201717p:plain こうかな?
全部繋げます。

f:id:moeka-dev:20180318201721p:plain

これでおっけーなはず…!

デプロイ

なんとデプロイボタンを押すだけでデプロイができるらしい。すごい。 ぽち。

Slackでテスト!

さっき作ったSlackBotを、テスト用のチャンネルに招待して話しかけてみます。

f:id:moeka-dev:20180318201725p:plain わーできた!ちょっとWatsonの方を整備していなさすぎてこれくらいの会話しかまだできませんが、とりあえずSlackとの連携は無事行えました〜

まとめ

今まであまり公式サイトやAPIリファレンスなどを読んで何かするってことはそんなになかった(やってみた系の記事ばっかり見てた)んですが、なんだかんだやっぱり公式が情報量多いし正しいし応用も利くしで一番いいですね。

次にやりたいこと

  • Watson Assistantを色々な会話ができるように整備する
  • google Homeと連携させて音声でWatsonとおしゃべりする!