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的主要内容,如果未能解决你的问题,请参考以下文章

Azure 门户中缺少活动订阅

活动包缺少附加功能,即使它们应始终添加到 newIntance 方法中

清除旧 SDK(缺少 FLAG_ACTIVITY_CLEAR_TASK)上的完整 Android 活动堆栈

对于缺少Mac必备神器的小伙伴 怎么在618大促时候薅羊毛

缺少一些简单的东西(按钮 OnClick 导致空指针)

UIActivityViewController 上缺少关闭按钮