BackEnd

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

投稿日:2017年12月4日 更新日:

はじめに

このすば、面白いですよね。
あまりアニメは見ない私ですが、このすばは全部見ました。
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なんかを使う必要がない程度だったかもしれませんが、色々と応用できそうです。

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

blog-page_footer_336




blog-page_footer_336




-BackEnd
-

執筆者:

免責事項

このブログは、記事上部に記載のある投稿日時点の一般的な情報を提供するものであり、投資等の勧誘・法的・税務上の助言を提供するものではありません。仮想通貨の投資・損益計算は複雑であり、個々の取引状況や法律の変更によって異なる可能性があります。ブログに記載された情報は参考程度のものであり、特定の状況に基づいた行動の決定には専門家の助言を求めることをお勧めします。当ブログの情報に基づいた行動に関連して生じた損失やリスクについて、筆者は責任を負いかねます。最新の法律や税務情報を確認し、必要に応じて専門家に相談することをお勧めします。


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


関連記事

laravel logo

LaravelのArtisanコマンドを自作する

1 はじめに2 コマンドの作成方法3 コマンドの実装3.1 文字列出力3.2 引数3.3 オプション3.4 入力を使用した対話型3.4.1 ask()メソッド3.4.2 secret()メソッド3.4 ...

crypto

公開鍵暗号の概要、用語と使用例

1 はじめに1.1 前提条件2 暗号化と復号2.1 暗号化とは2.2 復号とは3 暗号化方式3.1 共通鍵暗号3.2 公開鍵暗号4 署名と検証4.1 署名とは4.2 検証とは5 RSA暗号とは5.1 ...

Go言語

Go言語のエラーハンドリングとログローテーション

1 はじめに2 エラーハンドリング2.1 error インターフェース2.2 pkg/errors パッケージ3 独自のエラータイプ付き errorsパッケージを作成4 log パッケージ4.1 lo ...

js

Moment Timezoneを使ってJavaScriptで日付を変換する

1 はじめに2 Moment Timezone2.1 セットアップ2.2 使用例3 Moment Timezoneの機能3.1 タイムゾーンの一覧を表示する3.2 現在のタイムゾーンを表示する3.3 ...

Go言語

Goのfmt.print系関数のまとめ

1 はじめに2 print関数の命名規則3 各print関数の説明3.1 Print(標準出力へ出力)系関数3.2 Sprint(文字列を出力)系関数3.3 Fprint(ファイルへ出力)系関数4 書 ...

フォロー

blog-page_side_responsive

2017年12月
 12
3456789
10111213141516
17181920212223
24252627282930
31  

アプリ情報

私たちは無料アプリもリリースしています、ぜひご覧ください。 下記のアイコンから無料でダウンロードできます。