node.js - 如何使用 Azure Bot Channels Registration + Botbuilder SDK 捕获 Facebook messing_optins?
问题描述
我已经启动并运行了一个聊天机器人,使用 Node.JS Microsoft Bot Framework 构建,并作为 Web 应用程序部署到 Azure 服务器,并使用 Bot Channels Registration 资源作为前端端点。
此 Bot Channels Registration 连接到 Facebook Messenger(通过 FB 应用程序) - 这意味着 Facebook 应用程序的 webhook 指向https://facebook.botframework.com/api/v1/bots/<BOT_CHANNELS_REGISTRATION_RESOURCE_NAME>
.
这一切都适用于正常的聊天功能。
但是,我现在想在我拥有的单独网页中添加一个选择加入复选框。此复选框通过 ping FB 起作用,然后将非常特定的有效负载发送到已配置的 bot webhook。
{
"recipient":{
"id":"<PAGE_ID>"
},
"timestamp":<UNIX_TIMESTAMP>,
"optin":{
"ref":"<PASS_THROUGH_PARAM>",
"user_ref":"<UNIQUE_REF_PARAM>"
}
}
我的问题是这样的:
Bot Channels Registration 如何接收和处理上述负载?它会自动将其转发到我在机器人频道注册设置中配置的消息传递端点吗?还是会卡住,永远无法访问我的实际机器人 Web 应用程序?
最后,如果它确实到达了我的正常消息端点,我如何使用我的botbuilder.ChatConnector()
侦听器处理特定的有效负载?鉴于我的网络应用程序代码看起来像(本质上)
var restify = require('restify');
var builder = require('botbuilder');
var dialogues = require('./dialogues');
var chatbot = function (config) {
var bot = {};
chatbot.listen = function () {
var stateStorage = new builder.MemoryBotStorage();
var connector = new builder.ChatConnector({
appId: process.env.APP_ID,
appPassword: process.env.APP_PASSWORD
});
bot = new builder.UniversalBot(connector, function (session) {
session.beginDialog(dialogues.base(bot).name);
}).set('storage', stateStorage);
return connector.listen();
};
return chatbot;
}
var server = restify.createServer();
// Listen for messages from users
server.post('/api/messages', chatbot.listen());
server.listen(process.env.port, function () {
console.log('%s listening to %s', server.name, server.url);
});
谢谢!
编辑:我已经弄清楚如何在我的消息传递端点中处理上述有效负载 - 通过向server.pre()
我的服务器添加一个处理程序,例如
server.pre(function (req, res, next) {
if (req.body && req.body.optin_payload_specific_field){
// handle opt-in payload
} else {
return next();
}
});
但是,通过额外的日志记录行,选择加入的有效负载似乎甚至没有到达此端点。它似乎在 Bot Channels Registration 中停止。目前正在寻找解决该主要障碍的方法。
解决方案
因此,根据@JJ_Wailes 的调查,这似乎不是受支持的功能(实际上,这是当前的功能请求)。有关更多详细信息,请参阅他对原始帖子的评论。
但是,对于那些感兴趣的人,我确实找到了一个半解决方法来捕获user_ref
由 checkbox_plugin 生成的标识符:
1) 从您的外部站点,按照此处文档中的步骤将初始 user_ref 发送到 FB。然后,FB 将对您的机器人进行标注,但根据上述内容,它会被 Bot Channels Registration 块阻止,因此被忽略。
2)从同一个外部站点,使用user_ref
向用户发送消息(仅使用普通requests
库)。成功发送意味着user_ref
已通过该步骤 #1 调用在 FB 中正确注册 - 失败意味着您需要重复步骤 #1(或使用其他一些错误处理流程)。
3) 之后,下次用户在 FB 中回复您的机器人时(只要您不向他们发送任何其他消息),您的机器人将收到的消息将包含此作为有效负载的一部分:
{ ...
channelData:
{ ...
prior_message:
{ source: 'checkbox_plugin',
identifier: <user_ref> }
}
}
所以我目前在我的bot.use()
中添加了一个检查,如果该部分存在于传入的消息有效负载 ( session.message.sourceEvent.prior_message
) 中并且源是“checkbox_plugin”,我将相应的 user_ref 存储在 中session.userData
,并且可以从那里工作。
我希望看到这个功能被添加到受支持的 Azure 机器人堆栈中,但同时希望这可以帮助其他遇到这个(诚然小众)障碍的人。
推荐阅读
- javascript - 按下浏览器后退按钮时,有时不会触发 Angular location.onPopState
- java - 为数字的每个数字添加一个值
- liferay-7 - Liferay 移动设备检测
- reactjs - React-Scroll-Parallax 裁剪图像问题
- python - 配置 GitPython 以输出/记录命令并处理输出
- python - 是否可以修改 Python 中打印到标准输出的内容?
- exception - 尖锐地捕捉异常
- angular - Angular2依赖注入抽象类
- variables - HtmlWebpackPlugin 不会将 pug 变量传递给包含的 pug 文件
- ms-access - 访问:在两个表单之间临时复制值的最佳方式