В BotFrameworkAdapter отсутствует тип активности - локальная отладка Messenger

Я работаю в своем боте локально, используя эмулятор бота. Вроде все нормально работает. Пришло время интегрироваться с Messenger, и я тоже пытаюсь запустить его локально.

От Messenger к моему локальному боту через ngrok.

Я в основном пытаюсь перейти по этой ссылке здесь < / а>.

Когда я отправляю сообщение из своего мессенджера, кажется, что до моей конечной точки (и точки останова) требуется некоторое время, но когда это происходит, я получаю следующую ошибку:

/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 я вижу 400 запросов и иногда 502 то же самое в журнале ошибок приложения facebook.

Вот точка, в которой это происходит:

// using restify
server.post('/api/messages', (req, res) => {
  console.log('/api/messages - POST');
  adapter.processActivity(req, res, async turnContext => {
    await bot.run(turnContext);
  });
});

По сути, бот вообще не работает, но я провел тест с использованием адаптера боткита для подключения к мессенджеру facebook, и, похоже, он почти работает в большинстве случаев, за исключением специальных сообщений, таких как Prompt Choice, Carousel и HeroCards. В основном это работает только с простым текстом.

BotFrameworkAdapter должен нормально переводить. Есть идеи о том, что происходит? Не уверен, что я что-то упускаю.


person Thiago C. S Ventura    schedule 10.07.2019    source источник
comment
Три вопроса: 1) Какую команду ngrok вы используете для запуска ngrok? 2) Заменили ли вы конечную точку обмена сообщениями в настройках бота Azure на конечную точку ngrok (например, 8823f95d.ngrok.io / api / messages)? 3) Включили ли вы appId и appPassword из своего бота Azure в локальный бот и в эмулятор?   -  person Steven Kanberg    schedule 16.07.2019
comment
Привет, извините за мой поздний ответ. 1) ./ngrok http 3978 -host-header = localhost: 3978 2) да (я использую HTTPS) 3) да, у меня есть файл app.bot, в котором есть appId и appPassword.   -  person Thiago C. S Ventura    schedule 07.08.2019
comment
Боковое примечание: я бы посоветовал вам отказаться от файла .bot, поскольку он устарел из-за трудностей с его управлением и интеграцией. Инструкции о том, как это сделать, можно найти на здесь. Это маловероятно, но что-то там могло блокировать.   -  person Steven Kanberg    schedule 09.08.2019
comment
Можете ли вы опубликовать полный код для своего индекса и файлов mainBot.js (скрывая любые ключи / пароли)?   -  person Steven Kanberg    schedule 09.08.2019
comment
Я думаю, что нашел проблему. Теперь он работает, единственное, что я изменил, - это ссылка обратного вызова приложения facebook. Раньше я использовал ссылку ngrok в качестве обратного вызова после перехода на ссылку обратного вызова Azure, все работало нормально. Имеет ли это смысл?   -  person Thiago C. S Ventura    schedule 09.08.2019


Ответы (1)


Ok. Проблема заключалась в обратной ссылке в приложении Facebook.

Поскольку у меня есть токен подтверждения в моем коде, как вы можете видеть ниже, я указывал URL-адрес обратного вызова facebook на свою ссылку ngrok, и проверка работала нормально. Но похоже, что для отладки в конфигурациях Azure вы должны использовать ссылку обратного вызова, которую вам предоставляет Azure. Что-то вроде "https://facebook.botframework.com/api ...", которое вы можете найти по каналам / facebook.

Как только я настроил приложение facebook на использование ссылки обратного вызова лазурного цвета, все работает нормально.

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);
    }
  }
});
person Thiago C. S Ventura    schedule 10.08.2019