BotFrameworkAdapter 缺少活动类型 - 在本地调试 Messenger
Posted
技术标签:
【中文标题】BotFrameworkAdapter 缺少活动类型 - 在本地调试 Messenger【英文标题】:BotFrameworkAdapter missing activity type - Debug Messenger locally 【发布时间】:2019-11-20 14:38:19 【问题描述】:我一直在本地使用机器人模拟器在我的机器人中工作。一切似乎都很好。现在是与 Messenger 集成的时候了,我也在尝试在本地运行它。
通过 ngrok 从 Messenger 到我的本地机器人。
我基本上是在尝试关注这个链接here。
当我从我的信使发送消息时,似乎需要一段时间才能到达我的端点(和断点),但是当我收到以下错误时:
/api/messages - POST
index.ts:72
BotFrameworkAdapter.processActivity(): 400 ERROR - Error: BotFrameworkAdapter.parseRequest(): missing activity type.
UnhandledPromiseRejectionWarning: Error: Error: BotFrameworkAdapter.parseRequest(): missing activity type.
at BotFrameworkAdapter.processActivity (.../node_modules/botbuilder/src/botFrameworkAdapter.ts:608:19)
在我的 ngrok 控制台上,我可以在 facebook APP 日志错误中看到 400 请求,有时也可以看到 502。
这里是重点:
// using restify
server.post('/api/messages', (req, res) =>
console.log('/api/messages - POST');
adapter.processActivity(req, res, async turnContext =>
await bot.run(turnContext);
);
);
基本上该机器人根本不起作用,但我使用 botkit 适配器连接到 facebook messenger 进行了测试,除了 Prompt Choice、Carousel 和 HeroCards 等特殊消息外,它似乎在大多数情况下几乎都可以工作。基本上它只适用于简单的文本。
BotFrameworkAdapter 应该可以正常翻译。知道发生了什么吗? 不确定我是否遗漏了什么。
【问题讨论】:
三个问题:1)你用来启动ngrok的ngrok命令是什么? 2) 您是否已将 Azure 机器人设置中的消息传递端点替换为 ngrok 端点(例如8823f95d.ngrok.io/api/messages)? 3) 您是否将 Azure 机器人中的 appId 和 appPassword 包含在本地机器人和模拟器中? 嗨,很抱歉我的回复晚了。 1) ./ngrok http 3978 -host-header="localhost:3978" 2) 是(我使用 HTTPS)3) 是的,我有一个 app.bot 文件,其中有一个 appId 和 appPassword 旁注:我建议您从 .bot 文件中迁移出去,因为由于管理和集成存在困难,该文件已被弃用。可以在here 找到有关如何执行此操作的说明。这不太可能,但其中的某些东西可能被阻塞了。 您能否发布索引和 mainBot.js 文件的完整代码(隐藏任何键/密码)? 我想我找到了问题所在。它现在可以工作了,我唯一改变的是 facebook 应用回调链接。在更改为 azure 回调链接后,我使用 ngrok 链接作为回调之前,一切正常。有意义吗? 【参考方案1】:好的。问题出在 Facebook 应用上的回调链接。
由于我的代码上有一个验证令牌,如下所示,我将 facebook 回调 URL 指向我的 ngrok 链接,验证工作正常。但它看起来像调试 azure 配置,您必须使用 azure 提供给您的回调链接。诸如“https://facebook.botframework.com/api...”之类的内容,您可以在频道/facebook 下找到。
一旦我将 facebook APP 设置为使用 azure 回调链接,一切正常。
server.post('/api/messages', (req, res) =>
adapter.processActivity(req, res, async turnContext =>
await bot.run(turnContext);
);
);
server.get('/api/messages', (req, res) =>
const mode = req.query['hub.mode'];
const token = req.query['hub.verify_token'];
const challenge = req.query['hub.challenge'];
if (mode && token)
if (mode === 'subscribe' && token === VERIFY_TOKEN)
// Responds with the challenge token from the request
console.log('WEBHOOK_VERIFIED', challenge);
res.status(200);
res.end(challenge);
else
res.send(403);
);
【讨论】:
以上是关于BotFrameworkAdapter 缺少活动类型 - 在本地调试 Messenger的主要内容,如果未能解决你的问题,请参考以下文章
活动包缺少附加功能,即使它们应始终添加到 newIntance 方法中