facebook messenger切换协议take_thread_control

时间:2018-04-28 17:40:46

标签: facebook facebook-messenger dialogflow

我创建了一个带有信使和对话流的机器人,这很好用 但是当我尝试实施切换协议时问题出现了

第一种方法:将线程控制传递给PAGE INBOX
我使用'input.handover'动作建立了对话流的意图,然后当我键入切换时,我调用我的webhook并使用pass_thread_control调用fb api并将控件传递到页面收件箱,我获得成功响应和对话从 BOT 传递到 PAGE INBOX 。但是这里坚持 PAGE INBOX 而且我不能将take_thread_control带到 BOT ,因为 PAGE INBOX 没有与对话流或任何其他webhook链接。

第二种方法:将线程控制传递给另一个应用
使用相同的第一种方法设置,但这次我将线程控制传递给我创建的facebook APP 并与webhook链接(在heroku上托管了nodejs),我获得了成功响应,但这次没有消息来到此 APP 收件箱,在heroku控制台上我可以看到消息来到webhook但不是 APP 收件箱。

现在我只是被困在这里。如果有人知道如何使用对话流或任何帮助实现切换协议,我很欣赏。

感谢。

1 个答案:

答案 0 :(得分:1)

好吧,我只是通过混合两种方法找到解决方法

第1步:第二个应用将您的webhook订阅到机器人页面
page_subscribe

第2步:第二个应用webhook只是当用户输入特殊关键字(退出或返回...)时将线程控制带回主应用

app.post('/webhook', (request, response) => {
    const webhook_events = request.body.entry[0];
    // console.log('webhook_events : ', webhook_events);

    // Secondary Receiver is in control - listen on standby channel
    if (webhook_events.standby) {

        // iterate webhook events from standby channel
        webhook_events.standby.forEach(event => {

            const psid = event.sender.id;
            const message = event.message;

            // check if the user want back to the bot
            if (message && (message.text == 'exit' || message.text == 'back')) {

                // HandoverProtocol.takeThreadControl is just call the facebook api to takeThreadControl
                HandoverProtocol.takeThreadControl(psid).then(reps => {

                    // replay.sendMessage also call facebook api to send a message to the user to let him know he is back chat with the bot 
                    replay.sendMessage(psid, 'Hi, your are back to the BOT');

                }).catch(err => console.log(err));
            }

        });   
    }

    // respond to all webhook events with 200 OK
    response.sendStatus(200);
})

现在所有用户消息都从第二个应用程序webhook传递,当他键入' back'例如,webhook将控制权带回主应用程序(在本例中为机器人)