从Slack到AWS Lamba的电子邮件字段

时间:2018-11-12 09:52:22

标签: aws-lambda slack aws-lex

{
        "messageVersion": "1.0",
        "invocationSource": "DialogCodeHook",
        "userId": "xxx",
        "sessionAttributes": {
            "currentReservation": ""
        },
        "requestAttributes": {

        },
        "bot": {
            "name": "BookTrip",
            "alias": "shoping",
            "version": "7"
        },
        "outputDialogMode": "Text",
        "currentIntent": {
            "name": "Shoping",
            "slots": {
                "offer": "Yes",
                "email_address": null
            },
            "slotDetails": {
                "offer": {
                    "resolutions": [
                        {
                            "value": "Yes"
                        }
                    ],
                    "originalValue": "Yes"
                },
                "email_address": {
                    "resolutions": [],
                    "originalValue": null
                }
            },
            "confirmationStatus": "None"
        },
        "inputTranscript": "<mailto:xxx.20@gmail.com|xxx.20@gmail.com>"
    } 

当机器人要求输入电子邮件地址时。用户输入xxx.20@gmail.com作为email_address插槽。

但是,当请求来自备用设备时,它不会进入插槽。

任何建议或解决方案都值得赞赏。

1 个答案:

答案 0 :(得分:0)

Lex无法将输入识别为电子邮件,因为Slack用<mailto:...|...>包装了实际输入。您可以在事件的inputTranscipt值中看到Lex提供的输入。

我假设您已将Lex直接连接到Slack,并且您正在使用Lambda函数。

在Lambda中,您将必须解析inputTranscript并自己填写广告位。您可以尝试这样的事情(Node.js):

var userInput = event["inputTranscript"];

var email = userInput .split("|");
email = email[1].replace(">","");

console.log(email);
event["currentIntent"]["slots"]["email_address"] = email;

只有在用户输入电子邮件后,您才应该执行上述操作。它将从Slack接收整个输入,包括mailto:包装器标记,并将其分成两个数组。然后,取下一半,最后删除“>”。然后,应该保留纯电子邮件,因为用户最初是输入它的。然后在插槽中进行设置。当您在响应中将插槽传递回lex时,Lex随后将识别出email_address插槽已填充。

您可能经常需要像这样处理inputTranscript。我发现跟踪sessionAttribute中最后引出的广告位可以帮助我确定在对话中需要以特定方式解析输入的内容。