[Amazon Connect] フローに定義されたアナウンスを一覧する 〜記述間違いなどを電話しないで確認するために〜

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

1 はじめに

Amazon Connect(以下、Connect)では、「プロンプトの再生」や「顧客の入力を取得する」ブロックを使用して、システムからの応答を自由に設定できます。

しかし、問い合わせフローエディタでは、設定したテキストの内容を確認するには、それぞれのブロックを開かなければなりません。

また、テキスト入力のエリアは、デフォルトで小さく表示されるため、長いテキストの確認は、毎回広げないと、全部が見えません。

正直、すべての設定に問題がないかを確認するのは、ちょっと面倒です。

私のよく陥るパターンとしては、実際に電話をかけて使用していて、誤字脱字に気がつく事です。フローが分岐している場合などは、毎回すべてのフローを通るとは限らないので、見逃してしまうこ事もよくあります。(あくまで私の不注意が原因ですが・・・)

今回は、このようなミスを避けるため、設定されたテキストを電話しないで確認するプログラムを簡単に作成してみましたので、紹介させて下さい。

2 エクスポート

現時点(2018/10/29現在)では、まだ、「ベータ」となっていますが、問い合わせフローエディタの保存メニューに「フローのエクスポート」があります。

このメニューを使用すると、編集中のフローがJSONファイルとして保存されます。

単なるJSONファイルですので整形すると、構造は簡単に理解できます。

{
    "modules": [
        {
            "id": "4b672328-236a-49eb-a884-77a71101e427",
            "type": "Disconnect",
            "branches": [],
            "parameters": [],
            "metadata": {
                "position": {
                    "x": 957,
                    "y": 45
                }
            }
        },
        {
            "id": "41f1f2e2-e509-42d7-83ae-3aa3f732e246",
            "type": "StoreUserInput",
            "branches": [
                {
                    "condition": "Success",
                    "transition": "4b672328-236a-49eb-a884-77a71101e427"
                },
                {
                    "condition": "Error",
                    "transition": "4b672328-236a-49eb-a884-77a71101e427"
                }
            ],
            "parameters": [
                {
                    "name": "Text",
                    "value": "折返しお電話を差し上げます。\nこのお電話への折返しを希望される場合は1と#を、\n他のお電話への折返しを希望される場合は、電話番号を入力して下さい。",
                    "namespace": null
                },
                {
                    "name": "TextToSpeechType",
                    "value": "text"
                },
                {
                    "name": "CustomerInputType",
                    "value": "Custom"
                },
                {
                    "name": "Timeout",
                    "value": "5"
                },
                {
                    "name": "MaxDigits",
                    "value": 20
                },
                {
                    "name": "EncryptEntry",
                    "value": false
                }
            ],
            "metadata": {
                "position": {
                    "x": 393,
                    "y": 342
                },
                "useDynamic": false,
                "useDynamicForEncryptionKeys": true,
                "countryCodePrefix": "+1"
            }
        },
        {
            "id": "16747468-790e-4874-b936-bc72a40cf345",
            "type": "GetUserInput",
            "branches": [
                {
                    "condition": "Timeout",
                    "transition": "4b672328-236a-49eb-a884-77a71101e427"
                },
                {
                    "condition": "NoMatch",
                    "transition": "4b672328-236a-49eb-a884-77a71101e427"
                },
                {
                    "condition": "Error",
                    "transition": "4b672328-236a-49eb-a884-77a71101e427"
                },
                {
                    "condition": "Evaluate",
                    "conditionType": "Equals",
                    "conditionValue": "1",
                    "transition": "4b672328-236a-49eb-a884-77a71101e427"
                },
                {
                    "condition": "Evaluate",
                    "conditionType": "Equals",
                    "conditionValue": "2",
                    "transition": "4b672328-236a-49eb-a884-77a71101e427"
                },
                {
                    "condition": "Evaluate",
                    "conditionType": "Equals",
                    "conditionValue": "3",
                    "transition": "41f1f2e2-e509-42d7-83ae-3aa3f732e246"
                }
            ],
            "parameters": [
                {
                    "name": "Text",
                    "value": "入会に関するお問い合わせは1を\nご請求に関するお問い合わせは2を\nその他のお問い合わせは3を\n入力して下さい",
                    "namespace": null
                },
                {
                    "name": "TextToSpeechType",
                    "value": "text"
                },
                {
                    "name": "Timeout",
                    "value": "5"
                },
                {
                    "name": "MaxDigits",
                    "value": "1"
                }
            ],
            "metadata": {
                "position": {
                    "x": 644,
                    "y": 81
                },
                "conditionMetadata": [
                    {
                        "id": "6fb825a9-a609-4ae4-b407-f62a0f3d7097",
                        "value": "1"
                    },
                    {
                        "id": "719e0174-4d51-45d4-b158-ad43539cfec0",
                        "value": "2"
                    },
                    {
                        "id": "ba194442-9a1b-4a14-aa71-087b3290bc75",
                        "value": "3"
                    }
                ],
                "useDynamic": false
            },
            "target": "Digits"
        },
        {
            "id": "dfec65cf-5544-4363-881f-872ae8901e8a",
            "type": "SetVoice",
            "branches": [
                {
                    "condition": "Success",
                    "transition": "06301b03-7de4-46f2-81a6-68460aaeb11d"
                }
            ],
            "parameters": [
                {
                    "name": "GlobalVoice",
                    "value": "Takumi"
                }
            ],
            "metadata": {
                "position": {
                    "x": 164,
                    "y": 82
                }
            }
        },
        {
            "id": "06301b03-7de4-46f2-81a6-68460aaeb11d",
            "type": "PlayPrompt",
            "branches": [
                {
                    "condition": "Success",
                    "transition": "16747468-790e-4874-b936-bc72a40cf345"
                }
            ],
            "parameters": [
                {
                    "name": "Text",
                    "value": "<speak>\n<break time=\"3s\"/>\nお電話ありがとうございます。\n</speak>",
                    "namespace": null
                },
                {
                    "name": "TextToSpeechType",
                    "value": "ssml"
                }
            ],
            "metadata": {
                "position": {
                    "x": 400,
                    "y": 82
                },
                "useDynamic": false
            }
        }
    ],
    "version": "1",
    "type": "contactFlow",
    "start": "dfec65cf-5544-4363-881f-872ae8901e8a",
    "metadata": {
        "entryPointPosition": {
            "x": 20,
            "y": 80
        },
        "snapToGrid": false,
        "name": "Sample001",
        "description": null,
        "type": "contactFlow",
        "status": "saved",
        "hash": "9388f5d912d30ebab46a28751de58bd204522d2a68d2f0b3a0eae729d7b2e5d5"
    }
}

3 テキストの抽出

システムから返されるアナウンスを列挙するということで、とりあえず「プロンプトの再生」「顧客の入力を取得する」「顧客の入力を保存する」を抽出することにしました。

それぞれ、タイプは以下のとおりです。

ブロック タイプ
プロンプトの再生 PlayPrompt
顧客の入力を取得する GetUserInput
顧客の入力を保存する StoreUserInput

また、テキストは、parameters配列の内の、nameキーがText"となっているものの、valueに入っているようです。

parameters: [
    {
        "name": "Text",
        "value": "折返しお電話を差し上げます。\nこのお電話への折返しを希望される場合は1と#を、\n他のお電話への折返しを希望される場合は、電話番号を入力して下さい。",
        "namespace": null
    },

※「プロンプトライブラリを使用する」や「動的に入力する」を使用した場合は、この限りではありません。

以下のコードが、今回作成してみたテキスト抽出です。

const fs = require('fs');
const flow = process.argv[2];

if (flow == undefined) {
    console.log('use: node index.js contact-flow')
    return;
}

const targetTypes = {
    'PlayPrompt':'プロンプトの再生',
    'GetUserInput':'顧客の入力を取得する',
    'StoreUserInput':'顧客の入力を保存する'};
const json = JSON.parse(fs.readFileSync(flow, 'utf8'));

json.modules.forEach( module => {
    Object.keys(targetTypes).forEach( key => {
        if (module.type == key) {
            console.log('【' + targetTypes[key] + '】');
            module.parameters.forEach( param => {
                if (param.name == 'Text') {
                    console.log(param.value);
                }
            })
            console.log('\n')
        }
    })
})

使用しているようすです。誤字脱字等の凡ミスは、このような確認で避けやすくなるのでは無いでしょうか。

4 最後に

問い合わせフローエディタは、GUIで直感的に操作できる非常に優れたツールですが、設定値の列挙や、検索には少し手間がかかってしまいます。この辺は、エクスポートしたJSONファイルを使用することで、色々補って行くことで、スムーズな開発が進められるように感じています。

コメントは受け付けていません。