【问题标题】:Using postBack to send bot text message using BotFramework v4 and Node.js使用 postBack 使用 BotFramework v4 和 Node.js 发送机器人文本消息
【发布时间】:2019-07-02 05:34:47
【问题描述】:

我正在尝试向我的机器人发送回发短信,但我不知道正确的语法。

这是我的代码:

if (postback.payload == "WHAT_IS_MENTAL_HEALTH") {
      await turnContext.sendActivity("TO-DO: Forward on 'What Is Mental Health?' to Bot Handler");
      ActionTypes.postBack("What Is Mental Health?");
}

我正在尝试转发“什么是心理健康?”到我的机器人,所以它会撤回 QnA Maker 对该问题的响应。

具体步骤如下:

  1. 用户点击 Facebook Messenger 通用模板卡上的按钮(例如“什么是心理健康?”按钮)
  2. 按钮向机器人发送回发负载(例如“WHAT_IS_MENTAL_HEALTH”)
  3. 我正在检测来自 Facebook Messenger 的 postBack 有效负载(例如,如果 (postBack.payload == “WHAT_IS_MENTAL_HEALTH”))
  4. 一旦检测到特定的 postBack 有效负载,我就想向我的机器人发送一个额外的 postBack 作为文本(例如“什么是心理健康?”),以便我的 QnA 可以解释它并以正确的答案进行响应编入我的 QnA 知识库。

【问题讨论】:

  • 我尝试了很多变体,但无法让它发挥作用。我尝试过的变体是:await turnContext.PostAsync();等待 turnContext.postBack();等待 turnContext.sendActivity.postBack();后退(); ActionTypes.postBack();
  • 我可以提供帮助,但要确保我们在同一页面上。为什么使用“postBack”?你到底想达到什么目的?您是否只是想或多或少地向您的机器人发送“隐藏”消息?你想触发什么用户交互?
  • 谢谢!我正在使用 postBack,因为我正在检测来自 Facebook Messenger 的 postBack Payload,然后想将其作为文本转发到我的机器人,以便我的 QnA 可以对其进行响应。这有意义吗?
  • 您能指导我完成您尝试实现的步骤吗?比如user clicks button > button calls bot with postback event > bot responds with QnA response?我只是不清楚什么是“检测 postBack Payload”。如果机器人已经检测到它,您不需要向机器人转发任何其他内容。如果您使用其他详细信息编辑您的问题,这可能是最简单的。
  • Np。真正的关键不是关于我发布的代码,而是更多关于结合使用这两个示例来获得你想要的东西。由于您似乎是新手,我不能推荐足够的学习如何调试(我在this answer 的末尾发布了如何使用机器人)。它将特别帮助您阅读来自activity 对象的内容并确保您获得正确的属性/值。

标签: node.js botframework


【解决方案1】:

Facebook 事件和机器人框架

当 Facebook 向您的机器人发送事件时,它会发送一个 Activity 和一个 Event ActivityType。对于某些事件,事件数据位于 Activity.Value 属性中。对于其他事件,例如来自快速回复的回发,活动将是 Message,数据将在 Activity.ChannelData 中。例如,您的机器人可能会收到一个 postBack 事件作为这样的活动:

{
    channelId: 'facebook',
    [...]
    type: 'message',
    channelData: {
        recipient: {...},
        sender: {...},
        message: {
            [...],
            quick_reply: {
                [...],
                payload: '<your payload>'
            }
        }
    }
}

处理 Facebook 事件

这个答案将大量来自Facebook Events Sample。我强烈建议您查看它以获取更多帮助。

捕获消息和事件

首先,您要使用onMessage()onEvent() 捕获Facebook 消息和事件:

this.onMessage(async (turnContext) => {
    console.log('Processing a Message Activity.');

    // Show choices if the Facebook Payload from ChannelData is not handled
    if (!await this.processFacebookPayload(turnContext, turnContext.activity.channelData)) {
        if (turnContext.activity.channelId !== 'facebook') {
            await turnContext.sendActivity('This sample is intended to be used with a Facebook bot.');
        }
        await this.showChoices(turnContext);
    }
});

this.onEvent(async (turnContext) => {
    console.log('Processing an Event Activity.');

    // Analyze Facebook payload from EventActivity.Value
    await this.processFacebookPayload(turnContext, turnContext.activity.value);
});

处理消息/事件

Facebook 可以发送多种类型的事件。你可能想use an if or switch statement to handle each type:

async processFacebookPayload(turnContext, data) {
    // At this point we know we are on Facebook channel, and can consume the Facebook custom payload present in channelData.
    const facebookPayload = data;
    if (facebookPayload) {
        if (facebookPayload.postback) {
            // Postback
            await this.onFacebookPostback(turnContext, facebookPayload.postback);
            return true;
        } else if (facebookPayload.optin) {
            // Optin
            await this.onFacebookOptin(turnContext, facebookPayload.optin);
            return true;
        [...]
    }
    return false;
}

具体来说,处理回发

示例只是做了:

async onFacebookPostback(turnContext, postback) {
    console.log('Postback message received.');
    // TODO: Your postBack handling logic here...

    // Answer the postback and show choices
    await turnContext.sendActivity('Are you sure?');
    await this.showChoices(turnContext);
}

如果您想将问题发送给 QnA Maker,您可以(使用 QnA Maker Sample 作为指导):

async onFacebookPostback(turnContext, postback) {
    // qnaMaker.getAnswers doesn't accept string input, so we need to adjust our turnContext
    //  to match what it expects, which is a string in Activity.Text
    turnContext.activity.text = postback.payload;
    const qnaResults = await this.qnaMaker.getAnswers(turnContext);

    // If an answer was received from QnA Maker, send the answer back to the user.
    if (qnaResults[0]) {
        await turnContext.sendActivity(qnaResults[0].answer);

    // If no answers were returned from QnA Maker, reply with help.
    } else {
        await turnContext.sendActivity('No QnA Maker answers were found.');
    }
}

【讨论】:

  • 非常感谢您花时间看这个。稍加调整,我就可以完美地完成这项工作。我改变了 turnContext.activity.text = postback.message.quick_reply.payload; to turnContext.activity.text = postback.payload;它现在完美无缺!如果您可以通过此更改更新答案,那么我可以将此问题设置为已回答。再次感谢您!
  • 你太棒了,谢谢!只需再解决一个问题 here 我就走了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-03
  • 2020-11-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多