BackEnd

[Dialogflow + CF] アクア様が罵倒してくれたり天気を教えてくれるSlackボットを作る

投稿日:

はじめに

このすば、面白いですよね。
あまりアニメは見ない私ですが、このすばは全部見ました。
OVAか何かで続編があるみたいなので、期待したいです。
アニメ『この素晴らしい世界に祝福を!2』公式サイト

さて、Dialogflowをちょっとずつ触っていますが、ボット的なものを作ってみようと思いました。
基本的にはDialogflowのチュートリアルをもとに進めていましたが、少し味気なくなります。
そこで敬虔なアクシズ教徒である私は、アクア様のSlackボットを作ることに決めました。

過去の記事はこちら。
Rubyを使ってDialogflowのお勉強

Dialogflowの準備

プロジェクトを作る

とにもかくにもまずはプロジェクトを作ります。
今回は日本語設定でいきます。
(英語の方がデフォルトで辞書が登録されているようですが。。。)

Intentを作る

まずはとりあえず適当にでも呼びかければ返してくれるようにします。
Intentの項目の中にDefault Fallback Intentがあるかと思います。

Intentで基本的には投げかけられる単語を定義するのですが、どれにもマッチしなかった場合は、このDefault Fallback Intentが返されます。
下記のようにアクア様らしい言葉を埋めてみます。

試してみる

画面右側で試すこともできます。
試しに「こんにちは」と言ってみましょう。
設定したレスポンス文からランダムに1つ返されます。
IntentもDefault Fallback Intentになっています。

WELCOME Intentを作る

もう1つ、Intentには初めから用意されているもの(Action)があります。

Default Welcome Intentは、例えばボットが新しくグループに参加する際などのメッセージを定義できます。
WELCOMEメッセージは他にも定義できます。
詳細はこちらをご覧ください。

さて、アクア様らしい文言を考えて、Text Responseに埋めてあげます。
その他の部分はそのままで良いかと思います。

ここまでで先にSlackボットの方を作っていきます。

Slackボットを作る

まずはSlack用APPを作成します。
Dialogflowの公式サイトで連携方法が記載されているので、そちらを参考に作成します。
https://dialogflow.com/docs/integrations/slack

どこかに日本語で書いてあるドキュメントがあった気がするのですが、見つかりませんでした。。。

あとはアクア様に相応しい画像を選択し、Slackにインストールします。

Dialogflowとの連携が完了していれば、もう動くようになっていると思います。

しかしアクア様は賢い方なので、もう少しDialogflowを操作します。

名前を答える

せめて名前を聞かれたら答えられるようにします。
新しいIntentを作成します。

下図のような感じです。
User saysが、こちらから聞く内容です。
複数登録できます。

保存して学習が完了すれば、答えてくれるようになります。

Cloud Functionsを使用してAPIを叩く

さてただ受け答えするだけでは面白くないので、チュートリアルを参考に、APIを叩いて、そのレスポンスを返したいと思います。
今回叩くのは、WorldWeatherOnlineという天気のAPIです。

WorldWeatherOnlineのAPIキーを取得する

WorldWeatherOnlineで会員登録をし、APIキーを取得します。
基本無料のようです。

Cloud Functionsのプロジェクトを作る

バックエンドとしては、Dialogflowでも紹介されているCloud Functionsを使用します。
(DialogflowがGoogle傘下なので当たり前かもしれませんが。。。)
Cloud Functionsはサーバーレスアーキテクチャで、このようなボット用のイベントを作るにはちょうど良いと思います。

私も初めて使用したので、クイックスタートなんかを読んでプロジェクトを作成しました。
はじめにクレジットカードを登録しなければなりませんが、無料使用枠があるので、個人使用としては課金されることはないかと思います。

プロジェクトを作成したら、新しく関数を作ります。

  • 関数の名前は分かりやすくつけておきます。(関数名と同じにすれば良いのではないでしょうか。)
  • トリガーはHTTPトリガーにします。これを選択するとURLが表示されるのでメモしておきます。
  • 実行されるソースコードはインラインエディタで作成します。(詳しいコードは後述)
  • ステージパケットを選択します。(とりあえずどこでも良いのかな?)
  • 実行する関数名を記述します。(もし今回のコードを使用するのであれば、weatherWebhookになります。)

さて、ソースコードですが、チュートリアルのものを使用させていただきました。
ただ、そのままだとうまく動かないので、下記のように修正しました。

  • 先ほどメモしたAPIキーを[YOUR_API_KEY]の部分に記載。
  • チュートリアルではuse strictを使用していますが、ここでコケるようなので削除します。

ソースコードはこちらにも貼り付けておきます。

さて、保存した後に生成されるURLをメモしておきましょう。

DialogflowのFulfillmentの設定

Dialogflowの左メニュー、Fulfillmentの項目でWebhookの設定ができます。
先ほどのURLの出番です!

  • ENABLEDにチェックを入れます。
  • URLに先ほどのURLを入れます。

これで保存します。

天気用のIntentを作る

新しく天気を尋ねる用のIntentを作ります。
ここはチュートリアルと一緒に見ていただくと分かりやすいと思います。(Gif画像で動き付きなので)

User saysの前に、先に下記をやっておきます。

PARAMETERS

変数のようなものを用意します。
今回の場合は日付のdateと、場所のgeo-cityです。
上図のように設定すればよしなに判断してくれます。

また、REQUIREDにチェックをつけておくと、仮にそのパラメーターがなかった場合に聞き返してくれます。

Text Response

APIのレスポンスが得られなかった場合の言葉です。

Fulfillment

Webhookにチェックを入れておきます。

さて、ここまできたらUser Saysを埋めていきましょう。
WorldWeatherOnlineが、あまり日本の地理が得意ではなさそうなので、今回はアメリカの地名でいきます。

先にパラメータを設定しておくと、勝手に色がつきます。
もし色がつかなければ、文字を選択すると設定できます。

さて、試してみます。

パラメータもちゃんと判断されていることが分かります。
「SHOW JSON」を見ると、API(Cloud Functions)のレスポンスを確認できます。

Contextを使って会話っぽく

Contextを使うと会話っぽくすることもできます。
先ほどの天気のIntentに設定します。

  • Add input contextは、そのIntentを実行するために必要なContextです。
  • Add output contextは、そのIntentが終了した時に渡されるContextです。

私も初めて読んだ時はよく分からなかったのですが、触っているうちになんとなく分かってきました。

Contextを理解するために、新しく「weather.context」というIntentを作成します。
今回やりたいことは、

  1. 「weather」Intentで「本日の天気」を聞いて
  2. 「weather.context」で「同じ土地の次の日の天気」を答えてもらいます。

まずはContextを設定します。
このIntentを実行するためには「location」というContextが必要です。
また、Intentが終了する時に再度「location」というContextが渡されます。

次にパラメータやText Responseです。

特筆すべきは、geo-cityのVALUEが#location.geo-cityになっていることです。
Contextには、値が格納されます。
今回の場合は、「weather」で聞いた時の土地の名前ですね。

またText Responseでは、パラメーター名に$をつけてアクセスもできます。

User saysにはシンプルに「明日は?」を入れておきます。

最後に試してみます。
ちゃんと同じワシントンで、違う日付になっていることが分かります。

さいごに

実際にアクア様ボットを動かした図です。

ちょっとAPIからのレスポンスは考えないといけないですね。。
今回はわざわざDialogflowやCloud Functionsなんかを使う必要がない程度だったかもしれませんが、色々と応用できそうです。

最後に、このすばの続編期待してます!

page_footer_300rect




page_footer_300rect




-BackEnd

執筆者:


comment

メールアドレスが公開されることはありません。

関連記事

rails

ShrineでS3に画像をアップロードする

1 はじめに1.1 前提条件1.2 関連記事2 AWS側の準備2.1 S3バケットを作成する2.2 CORSを設定する2.3 アクセス用のユーザを作成する3 Rails側の設定3.1 Initiali ...

rails

RailsでS3に画像をアップロードする

1 はじめに2 今回やりたいこと3 下準備3.1 ImageMagickをインストールする3.2 Gemをインストールする4 レコード生成時にファイルを指定してアップロードする4.1 アップローダを作 ...

rails

Railsの低レベルキャッシュを使ってみた

1 はじめに1.1 環境2 ドキュメント3 準備3.1 configの確認3.2 キャッシュストア4 使ってみる4.1 #read、#write、#delete4.2 #fetch4.3 オプション4 ...

Rubyを使ってDialogflowのお勉強

1 はじめに1.1 環境2 とりあえずAPIで叩いてみる2.1 テスト用のIntentを作成2.2 Gemの設定3 Eventについて3.1 WELCOMEイベント3.2 パラメータ付きで叩く3.3 ...

GoogleAppsScriptを使ってmBaaSの定期実行処理を実装する

1 はじめに1.1 簡単な状況説明1.2 定期実行を行う方法2 実装2.1 実装の流れ2.2 JavaScriptの実装2.3 スクリプトをアップロードする2.4 Google Apps Script ...

page_side_300rect

Web版MyCoach

私たちはより広い方にコーチングを知ってもらいたいと考えています。
下記のサイトにて、コーチの方々を紹介しておりますので、よろしければご覧ください。

アプリ情報

私たちは、目標を達成したい方を応援する、TODOアプリもリリースしております。
下記のアイコンから無料でダウンロードできます。

リンク

follow us in feedly
2017年12月
« 11月  
 12
3456789
10111213141516
17181920212223
24252627282930
31