【ビール女子麦子さん④】Watson AssistantとLINE Messaging APIでランダムにスタンプを返す機能を作ってみた


1.はじめに

「ビール女子🍺麦子さん」シリーズ、4回目の投稿です。

いままで麦子さんは、テキストでしか回答できなかったのですが、今回は「スタンプを送ると、スタンプを返す機能」を実装しようと思います。といっても、1種類のスタンプを固定で返しても面白くないので、複数のスタンプの中からランダムに返す仕組みにしようと思います。

ちなみに、ビール女子麦子さんとは、以下のようなWatson AssistantとLINE Messaging APIでつくった、ビールに詳しいチャットボットです。


2.仕組みの検討

使うのはいつも通りこの3つです。

・WatsonAssistant

・Node-RED

・LineMessagingAPI


(1)スタンプが送られてきたことの認識

Messaging APIリファレンスの「Webhookイベントオブジェクト」ー「messageプロパティ」ー「スタンプ」を見ると、スタンプが送られてきた場合は、messageオブジェクトの"type"が"sticker"になるとされています。

実際に、Node-REDのデバッグログで、スタンプを送ったときのWebhookイベントオブジェクトを見てみると、確かに"type"が"sticker"になっています。

これでスタンプが送られてきたことが認識できそうです。

1.png


(2)スタンプの返し方

次にスタンプの返し方を確認しましょう。Messaging APIリファレンス

「メッセージオブジェクト」の「スタンプメッセージ」を見ると、以下のように"type","packageId","stickerId"をStringで設定するとされています。

{

"type": "sticker",
"packageId": "1",
"stickerId": "1"
}

ちなみに、"packageId"と"stickerId"はスタンプリストから確認ができます。

これでスタンプの返し方もわかりました。


(3)「ランダムに」スタンプを返す方法

固定のスタンプを返すだけであれば、Webhookのmessageプロパティのtypeが"sticker"の時に、固定のメッセージオブジェクトを返せばいいのですが、それでは面白くありません。そこで、複数のスタンプの中からランダムで返す仕組みを考えてみました。

【ランダムにスタンプを返す仕組み】

①Webhookのmessageプロパティのtypeが"sticker"であることを認識

②WatsonAssistantに渡すメッセージに「スタンプを送って」という文字列を設定

③WatsonAssistantは「スタンプを送って」というIntentを受け取ったら、テキストのランダム回答機能で複数のstickerIdの中から1つのstickerIdを返却

④WatsonAssistantの返却した結果が「0~99999999」の場合はstickerIdと認識

(WatsonAssistant側に数字のみを回答する機能は他にないためこの実装が可能)

⑤stickerIdが返ってきた場合は、メッセージオブジェクトにスタンプメッセージとして"type","packageId","stickerId"を設定

99.png

これで、「スタンプを送ると、スタンプを返す機能」ができるのではないかと考えました。


3.実装

それでは実装していきましょう。実際の麦子さんは度重なる機能追加でかなり複雑化していますので、シンプルに説明するために【ビール女子麦子さん】 IBM WatsonとLINEでbotを作ってみたの時点のNode-REDへ追加するイメージで書きます。初期状態を以下の状態とします。

0.png


①Webhookのmessageプロパティのtypeが"sticker"であることを認識

・「Switch」のノードを以下のように設定し、"sticker"とそれ以外で別のフローに流れるようにします。

2.png


②WatsonAssistantに渡すメッセージに「スタンプを送って」という文字列を設定

・「Change」のノードを以下のように、WatsonAssistantに送信するメッセージに「スタンプを送って」という文字列を設定します。

3.png

・これらを以下のように並べで、Typeがstickerの時に「スタンプを送って」という文字列をWatsonAssistantに送るようにします。

4.png


③WatsonAssistantは「スタンプを送って」というIntentを受け取ったら、テキストのランダム回答機能で複数のstickerIdの中から1つのstickerIdを返却

WatsonAssistant側に移って、機能を実装していきましょう。

【手順】

・WatsonAssistantの「Intents」に「スタンプを送って」を登録。

・Dialogsに「スタンプ」というノードを作成し、「#スタンプを送って」のIntentsの時に、stickerIdをランダムに返すように設定。

※"packageId"と"stickerId"はスタンプリストから確認

4.png


④WatsonAssistantの返却した結果が「0~99999999」の場合はstickerIdと認識

ここからは、Node-REDに戻ります。

・「Switch」のノードを以下のように設定し、WatsonAssistantの返却した結果が「0~99999999」の時と、それ以外で分岐させます。

5.png


⑤stickerIdが返ってきた場合は、メッセージオブジェクトにスタンプメッセージとして"type","packageId","stickerId"を設定

・「Change」のノードを以下のように設定し、スタンプメッセージを送るようにします。

6.png

「対象の値」の中身は以下のようにしました。

[

{
"type":'sticker',
"packageId":'11537',
"stickerId":msg.payload.output.text[0]
}
]

・これらを以下のように配置します。

7.png

これでデプロイしたら完成です!!!!


4.できあがり!

こんな感じになりました!

よかったら使ってみてくださいね!

ビール女子🍺麦子さん 

  ↓↓↓↓↓

友だち追加