1.はじめに
「ビール女子🍺麦子さん」シリーズ、4回目の投稿です。
いままで麦子さんは、テキストでしか回答できなかったのですが、今回は「スタンプを送ると、スタンプを返す機能」を実装しようと思います。といっても、1種類のスタンプを固定で返しても面白くないので、複数のスタンプの中からランダムに返す仕組みにしようと思います。
ちなみに、ビール女子麦子さんとは、以下のようなWatson AssistantとLINE Messaging APIでつくった、ビールに詳しいチャットボットです。
つくってみたー!!中身はWatson Assistant(Watson Conversation)です。会話のスキル作るの楽しい!!
— はぁこ🌸ビール女子麦子開発中 (@paco_itengineer) April 20, 2019
これからビールの知識を増やして立派なビール女子に育てます😃 pic.twitter.com/nZfuqH4IfC
2.仕組みの検討
使うのはいつも通りこの3つです。
・WatsonAssistant
・Node-RED
・LineMessagingAPI
(1)スタンプが送られてきたことの認識
Messaging APIリファレンスの「Webhookイベントオブジェクト」ー「messageプロパティ」ー「スタンプ」を見ると、スタンプが送られてきた場合は、messageオブジェクトの"type"が"sticker"になるとされています。
実際に、Node-REDのデバッグログで、スタンプを送ったときのWebhookイベントオブジェクトを見てみると、確かに"type"が"sticker"になっています。
(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"を設定
これで、「スタンプを送ると、スタンプを返す機能」ができるのではないかと考えました。
3.実装
それでは実装していきましょう。実際の麦子さんは度重なる機能追加でかなり複雑化していますので、シンプルに説明するために【ビール女子麦子さん】 IBM WatsonとLINEでbotを作ってみたの時点のNode-REDへ追加するイメージで書きます。初期状態を以下の状態とします。
①Webhookのmessageプロパティのtypeが"sticker"であることを認識
・「Switch」のノードを以下のように設定し、"sticker"とそれ以外で別のフローに流れるようにします。
②WatsonAssistantに渡すメッセージに「スタンプを送って」という文字列を設定
・「Change」のノードを以下のように、WatsonAssistantに送信するメッセージに「スタンプを送って」という文字列を設定します。
・これらを以下のように並べで、Typeがstickerの時に「スタンプを送って」という文字列をWatsonAssistantに送るようにします。
③WatsonAssistantは「スタンプを送って」というIntentを受け取ったら、テキストのランダム回答機能で複数のstickerIdの中から1つのstickerIdを返却
WatsonAssistant側に移って、機能を実装していきましょう。
【手順】
・WatsonAssistantの「Intents」に「スタンプを送って」を登録。
・Dialogsに「スタンプ」というノードを作成し、「#スタンプを送って」のIntentsの時に、stickerIdをランダムに返すように設定。
※"packageId"と"stickerId"はスタンプリストから確認
④WatsonAssistantの返却した結果が「0~99999999」の場合はstickerIdと認識
ここからは、Node-REDに戻ります。
・「Switch」のノードを以下のように設定し、WatsonAssistantの返却した結果が「0~99999999」の時と、それ以外で分岐させます。
⑤stickerIdが返ってきた場合は、メッセージオブジェクトにスタンプメッセージとして"type","packageId","stickerId"を設定
・「Change」のノードを以下のように設定し、スタンプメッセージを送るようにします。
「対象の値」の中身は以下のようにしました。
[
{
"type":'sticker',
"packageId":'11537',
"stickerId":msg.payload.output.text[0]
}
]
これでデプロイしたら完成です!!!!
4.できあがり!
こんな感じになりました!
普通にスタンプを送れば、麦子さんがスタンプを返してくれるようにもなってます! pic.twitter.com/zQQdFLyVos
— はぁこ🌸ビール女子麦子開発中 (@paco_itengineer) May 8, 2019
よかったら使ってみてくださいね!