使用postBack通过BotFramework v4和Node.js发送bot文本消息

时间:2019-07-01 15:26:30

标签: node.js botframework

我正在尝试向我的机器人发送一个postBack文本消息,但是我不知道正确的语法。

这是我的代码:

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知识库中。

1 个答案:

答案 0 :(得分:1)

Facebook活动和Bot框架

Facebook将事件发送给您的机器人时,它会发送一个HasSupportFragmentInjector ActivityActivityType。对于某些事件,事件数据位于Activity.Value属性中。对于其他事件,例如来自快速回复的回发,活动将为Event,数据将位于Message中。例如,您的机器人可能会通过以下活动收到一个postBack事件:

Activity.ChannelData

处理Facebook事件

这个答案将大大地Facebook Events Sample。我强烈建议您寻求帮助。

捕获消息和事件

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

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

处理消息/事件

Facebook可以发送许多类型的事件。您可能要use an if or switch statement to handle each type

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);
});

具体来说,处理回发

该示例只是这样做:

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;
}

当您要将问题路由到QnA Maker时,可以(使用QnA Maker Sample作为指导):

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);
}