首页 > 解决方案 > 从 Slack 到 AWS Lamba 的电子邮件字段

问题描述

{
        "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>"
    } 

当机器人询问电子邮件地址时。用户为 email_address 槽输入了 xxx.20@gmail.com。

但是当请求来自 slack 时,它不会进入 slot。

任何建议或解决方案表示赞赏。

标签: aws-lambdaslackaws-lex

解决方案


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经常像这样处理。我发现跟踪 a 中最后一个引出的插槽sessionAttribute有助于我确定对话中我需要以特定方式解析输入的位置。


推荐阅读