7
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Dialogflow Messengerで用意されているレスポンスをDenoで返してみた

Posted at

Dialogflow Messengerとは、あなたが運営しているWebサイトに対して、簡単にQ&Aのようなチャット機能を組み込むことができます。
ドキュメントは下記URLをご確認ください。

ハンズオン資料URL

Katacodaを使って簡単に試せる環境を用意しました。こちらの資料に沿って行えばあっという間に確認できます。

リッチレスポンス

普通にテキストを返すことはもちろんですが、リッチなレスポンスを返すことができます。

スクリーンショット 2020-06-23 14.40.42.png

DenoでAPI作成

今回はそのレスポンスを今流行のDenoで返してみたいと思います。サーバー部分は abc を使いました。

start メソッドでポートを指定してサーバーを起動しています。あとは指定されたJsonをレスポンスとして返しています。

hello.ts
import { Application, Context } from "https://deno.land/x/abc@v1.0.0-rc10/mod.ts"

const app = new Application()

app.static('/', './public')

app.get('/', async (ctx: Context) => {
    await ctx.file('./public/index.html')
})

app.post('/', async (ctx: Context) => {
    let js = {}

    js = {
        "fulfillmentMessages": [
            {
                "payload": {
                    "richContent": [
                        [
                          {
                            "type": "info",
                            "title": "情報レスポンス",
                            "subtitle": "サブタイトル\nクリックすると別のページに飛ぶよ",
                            "image": {
                              "src": {
                                "rawUrl": "https://www.i-enter.co.jp/images/favicon.ico"
                              }
                            },
                            "actionLink": "https://www.i-enter.co.jp"
                          }
                        ]
                    ]
                }
            }
        ]
    }

    await ctx.json(js)
})
app.start({port: 3000})

これを実行すると、Dialogflow Messengerのレスポンスは下記のようになります。
ちょっとオシャレでリッチなデザインが返ってきます。

スクリーンショット 2020-06-23 14.27.43.png

各レスポンス種類

説明レスポンス

一般的なタイトルと内容を明記するものです。

js = {
    "fulfillmentMessages": [
        {
            "payload": {
                "richContent": [
                    [
                        {
                            "type": "description",
                            "title": "説明レスポンス",
                            "text": [
                                "説明1行目",
                                "説明2行目"
                            ]
                        }
                    ]
                ]
            }
        }
    ]
}
s200.png

画像レスポンス

画像を返してくれます。svgファイル以外にもjpeg、png画像なども可能です。

js = {
    "fulfillmentMessages": [
        {
            "payload": {
                "richContent": [
                    [
                        {
                            "type": "image",
                            "rawUrl": "https://deno.land/logo.svg",
                            "accessibilityText": "Deno logo"
                        }
                    ]
                ]
            }
        }
    ]
}
s201.png

ボタンレスポンス

クリックすると、別のWebページに遷移させることができます。また event を使うことで、別途パラメータを渡すこともできます。
アイコンはマテリアルアイコンライブラリのIDを指定することができます。


js = {
    "fulfillmentMessages": [
        {
            "payload": {
                "richContent": [
                    [
                        {
                            "type": "button",
                            "icon": {
                                "type": "sentiment_satisfied_alt", // 何も指定しなければ矢印アイコン
                                "color": "#FF9800"
                            },
                            "text": "クリックすると別のページに飛ぶよ",
                            "link": "https://www.i-enter.co.jp",
                            "event": {
                                "name": "RESULT",
                                "languageCode": "ja-JP",
                                "parameters": {
                                    "hoge": "ボタンクリック"
                                }
                            }
                        }
                    ]
                ]
            }
        }
    ]
}
s202.png

リストレスポンス

検索結果などを表示するのに適しているものです。 divider を使うことで区切り線をつけることができます。クリックで反応することができます。 event にも対応しています。


js = {
    "fulfillmentMessages": [
        {
            "payload": {
                "richContent": [
                    [
                        {
                            "type": "list",
                            "title": "リスト1タイトル",
                            "subtitle": "リスト1 - クリックしてみてね",
                            "event": {
                                "name": "RESULT",
                                "languageCode": "ja-JP",
                                "parameters": {
                                    "hoge": "リスト1をクリック"
                                }
                            }
                        },
                        {
                            "type": "divider"
                        },
                        {
                            "type": "list",
                            "title": "リスト2タイトル",
                            "subtitle": "リスト2 - クリックしてみてね",
                            "event": {
                                "name": "RESULT",
                                "languageCode": "ja-JP",
                                "parameters": {
                                    "hoge": "リスト2をクリック"
                                }
                            }
                        }
                    ]
                ]
            }
        }
    ]
}
s203.png

アコーディオン

クリックすると、メニューが展開されます。

js = {
    "fulfillmentMessages": [
        {
            "payload": {
                "richContent": [
                    [
                        {
                            "type": "accordion",
                            "title": "アコーディオンレスポンス",
                            "subtitle": "サブタイトル",
                            "text": "アコーディオンテキスト"
                        }
                    ]
                ]
            }
        }
    ]
}
s204.png

候補ワードレスポンス

押してほしい候補をボタンで返してくれます。 image を指定するとボタンアイコンを設定することができます。


js = {
    "fulfillmentMessages": [
        {
            "payload": {
                "richContent": [
                    [
                        {
                            "type": "chips",
                            "options": [
                                {
                                    "text": "はい",
                                    "image": {
                                        "src": {
                                            "rawUrl": "https://www.i-enter.co.jp/images/favicon.ico"
                                        }
                                    }
                                },
                                {
                                    "text": "いいえ"
                                }
                            ],
                        }
                    ]
                ]
            }
        }
    ]
}
s205.png

組み合わせレスポンス

これまでに紹介したものを組み合わせることができます。

js = {
    "fulfillmentMessages": [
        {
            "payload": {
                "richContent": [
                    [
                        {
                            "type": "image",
                            "rawUrl": "https://deno.land/logo.svg",
                            "accessibilityText": "Denoイメージ"
                        },
                        {
                            "type": "info",
                            "title": "組み合わせレスポンス",
                            "subtitle": "今まで紹介したのを組み合わせられるよ",
                            "actionLink": "https://cloud.google.com/dialogflow/docs/integrations/dialogflow-messenger#info_response_type"
                        }
                    ]
                ]
            }
        }
    ]
}
s206.png

まとめ

いかがでしたでしょうか?リッチなレスポンスを返すことができたでしょうか?
ドキュメントには外部APIを使ったレスポンスに関する情報が一切無かったので、誰かの為になれば幸いです。

システム化のご検討やご相談は弊社までお問い合わせください。
https://i-enter.co.jp/contact/

7
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?