kun432's blog

Alexaなどスマートスピーカーの話題中心に、Voiceflowの日本語情報を発信してます。たまにAWSやkubernetesなど。

〜スマートスピーカーやVoiceflowの記事は右メニューのカテゴリからどうぞ。〜

Voiceflow Dialog Management APIでSlackとつないでみた

f:id:kun432:20210313005910p:plain

VoiceflowのDialog Management APIをつかって、LINEにつづいて、Slackにつないでみました。

Dialog Management APIについてはこちら。

目次

構成

基本的な構成は前回と同じです。

f:id:kun432:20220107025735p:plain

コード

コードは以下で公開しています。

ではやってみましょう。

前提として、

  • Voiceflowのサンプルプロジェクトはすでにインポート済
  • 会話モデルのトレーニング済
  • APIキーやバージョンIDを取得済

とします。

サンプルプロジェクトはLINE連携と同じものを使用します。(右クリックでダウンロード)

https://raw.githubusercontent.com/kun432/voiceflow-samples/main/dialog-managment-api/dialog-management-api-sample-line.vf

プロジェクトのインポートとトレーニングのやり方

APIキーとバージョンIDの取得方法

Slackアプリの作成&設定その1

まず最初にSlack側でアプリを作成していきましょう。基本的に公式のドキュメントに従って準備していきますので、各項目の説明等はドキュメントを参照してください。

slack.dev

アプリの管理画面を開きます。

f:id:kun432:20220107030316j:plain

ブラウザが立ち上がります。右上の「ビルド」をクリック。

f:id:kun432:20220107031059j:plain

「Create an App」をクリック。

f:id:kun432:20220107031125j:plain

「From Scratch」をクリック。

f:id:kun432:20220107031206j:plain

アプリの名前と、アプリを使うワークスペースを選択して、「Create App」をクリック。

f:id:kun432:20220107031516j:plain

アプリが作成されました。

f:id:kun432:20220107032211p:plain

ではアプリの設定や連携に必要な情報を集めていきましょう。左のメニューにある「OAuth & Permissions」をクリックします。

f:id:kun432:20220107032341j:plain

OAuth & Permissionsページが開いたら、下の方にスクロールして、Bot Token Scopesのところにある「Add an OAuth Scope」をクリックします。

f:id:kun432:20220107032937j:plain

いくつか選択肢がありますが、アプリがボットとしてメッセージを投稿できる「chat.write」を選択します。

f:id:kun432:20220107033536j:plain

以下のようになっていればOKです。

f:id:kun432:20220107033608p:plain

上の方にスクロールして、左のメニューから「Install App」をクリックします。

f:id:kun432:20220107033803j:plain

「Install to Workspace」をクリックします。

f:id:kun432:20220107033931j:plain

権限の確認画面が表示されます。「許可する」をクリックします。

f:id:kun432:20220107034026j:plain

インストールが完了すると、「Bot User Auth Token」が発行されます。これが連携に必要な1つ目の情報になります。どこか安全な場所にペーストして保管しておきましょう。

f:id:kun432:20220107040600j:plain

次に左のメニューから「Basic Information」をクリックします。

f:id:kun432:20220107040935j:plain

下の方にスクロールして、「Signing Secret」のところで「Show」をクリックして、表示された文字列を安全な場所にペーストしておきます。これが連携に必要な2つ目の情報です。

f:id:kun432:20220107041418j:plain

これで連携に必要な情報は集まりました。もう少し設定は必要ですが、一旦、Node.jsアプリのほうに移りましょう。ブラウザは開いたままにしておいいてください(あとで戻ってきます)

Node.jsアプリ&ngrok起動

ではVoiceflowとSlackをつなぐためのNode.jsアプリを起動していきます。

レポジトリをクローンします。

$ git clone https://github.com/kun432/voiceflow-dialog-management-api-sample-ja
$ cd voiceflow-dialog-management-api-sample-ja

slack用のソースのディレクトリに移ります。

$ cd slack

パッケージをインストールします。

$ npm install

VoiceflowとSlackのAPIキーなどの環境変数を設定していきます。設定するのは以下。

  • SLACK_BOT_TOKEN
    • Slackアプリ作成時に取得した「Bot User Auth Token」を指定
  • SLACK_SIGNING_SECRET
    • Slackアプリ作成時に取得した「Signing Secret」を指定
  • VF_API_KEY
    • Voiceflowで作成したAPIキー
  • VF_VERSION_ID
    • VoiceflowのプロジェクトのバージョンID

"XXX...XXX"の部分をそれぞれ置き換えてコマンドを実行します、

$ export SLACK_BOT_TOKEN="XXX...XXX"
$ export SLACK_SIGNING_SECRET="XXX...XXX"
$ export VF_API_KEY="VF.XXX...XXX"
$ export VF_VERSION_ID="XXX...XXX"

Node.jsアプリを起動します。以下のように表示されればOKです。

$ npm start

> slack@1.0.0 start
> node index.js

⚡️ Bolt app is running on 3000!

ngrokを立ち上げて公開します。

$ ngrok http 3000
ngrok by @inconshreveable                                 (Ctrl+C to quit)

(...snip...)

Forwarding                    http://XXXX-XXX-XXX-XXX-XXX.ngrok.io -> http:
Forwarding                    https://XXXX-XXX-XXX-XXX-XXX.ngrok.io -> http

(...snip...)

上記で表示されるHTTPSのURLを記録しておきます。

ローカルの準備はこれで完了です。再度slack側の設定に戻ります。

Slackアプリの設定その2

ブラウザに戻ってSlackアプリの設定を続けます。

左のメニューから、「Event Subscriptions」をクリックします。

f:id:kun432:20220107144901j:plain

「Enable Events」のスイッチをONにします。

f:id:kun432:20220107145136j:plain

スイッチをONにするとURLを入力する欄が表示されるので、ngrokで表示されたURLを入力し、URLの末尾に/slack/eventsをつけます。

f:id:kun432:20220107145424j:plain

URLが正しければ上記のように「Verified」と表示されます。このとき、ngrokを立ち上げたコンソールでも以下のように表示されると思います。「200 OK」になっていれば問題ないです。

f:id:kun432:20220107145830j:plain

URLが間違っていたり、正しく動かない場合は以下のように表示されるので、ngrokが正しく立ち上がっているか、URLが正しいかを確認してください。

f:id:kun432:20220107150137j:plain

(上記の例は最後のsがたりない)

ただしくURLを入力できたら、下にスクロールして「Subscribe to Subscribe to bot events」をクリックします。

f:id:kun432:20220107150417j:plain

「Add Bot User Event」が表示されるのでこれをクリックします。

f:id:kun432:20220107150624j:plain

ボットがメッセージを受け取るイベントを選択します。とりあえず以下を選択します。

  • message.channels
    • ボットが追加されているパブリックチャンネルのメッセージを受け取ります
  • message.groups
    • ボットが追加されているプライベートチャンネルのメッセージを受け取ります
  • message.im
    • ユーザからボット宛(@でメンション)のメッセージを受け取ります
  • message.mpim
    • ボット宛のグループ DM を受け取ります

f:id:kun432:20220107151431p:plain

こんな感じに設定できればOKです。最後に一番下にある緑の「Save Changes」をクリックします。

f:id:kun432:20220107151633j:plain

SuccessとなればOKです。アプリを再インストールするように言われますので、「reinstall your app」をクリックします。

f:id:kun432:20220107151852j:plain

再度権限の確認画面が表示されますので「許可」をクリックします。

f:id:kun432:20220107152003j:plain

これですべての設定が完了しました。

動作確認

それではSlackアプリで動作確認してみましょう。適当なチャンネルの詳細画面を開いて、「インテグレーション」の「アプリの追加」をクリック。

f:id:kun432:20220107152806j:plain

作成したアプリ名が表示されますので「追加」をクリックします。

f:id:kun432:20220107152910j:plain

これでボットがチャネルに参加しますので、適当に話しかけてみてください。

f:id:kun432:20220107153004p:plain

ボットがメッセージを受け取るイベントの設定により、チャンネルのすべてのメッセージを受け取る or @メンションでのみ受け取る等の設定もできますので、ユースケースに合わせて選択すれば良いと思います。

また、Node.jsアプリを立ち上げたコンソールで、リクエスト・レスポンスなどをデバッグ表示していますので、実際にどういったデータがやりとりされているかを見ると良いでしょう。

f:id:kun432:20220107153612j:plain

なお、前回・前々回の記事でもご紹介していますが、VoiceflowのState APIを使うと、永続的な情報をVoiceflow側に持たせて、アプリからは一意のキーでアクセスするだけで、ユーザごとの永続的なアトリビュートの管理ができます。プロジェクト側で変数を保持するようにしておくと、以下のように、1回目のアクセスで聞かれた名前と年齢を2回目のアクセスでは聞かれない、ということができます。

f:id:kun432:20220107154156p:plain

SlackではユーザごとにID(message.user)が払い出されるようなので、これをキーにしています。テストなどでユーザ情報を削除したい場合は、Node.jsアプリのコンソールで表示されるSlackからのリクエストに含まれるユーザIDを取得して、

f:id:kun432:20220107160223j:plain

以下のような感じでDELETEリクエストを送れば削除されます。

$ USER_ID="XXXXXXXX"
$ curl -s -X DELETE "https://general-runtime.voiceflow.com/state/$VF_VERSION_ID/user/$USER_ID" -H "Authorization: $VF_API_KEY"

まとめ

LINEにつづいてSlackでも連携してみました。チャットアプリとVoiceflowをつなぐ中間アプリを用意するだけで、Voiceflowの会話ロジックは共通で、いろんなフロントエンドに対応できるのがDialog Management APIのメリットだと思います。