Стикеры и Gif вызывают зависание бота Facebook Messenger

API Facebook Messenger в целом довольно приятный. Однако всякий раз, когда пользователь отправляет наклейку (например, наклейку с большим пальцем вверх) моему боту, он всегда зависает примерно на 20 секунд. Если пользователь отправит много наклеек, бот просто выйдет из строя, и Facebook отправит мне предупреждение разработчика «Сбой веб-перехватчика».

Я подозреваю, что с моим кодом что-то не так, но я не смог найти никакой ошибки. Что-то интересное, что я обнаружил, заключается в том, что когда бот дает сбой и Facebook отправляет мне предупреждение «Сбой веб-перехватчика», бот будет восстановлен и вернется к ответу на сообщения, если я повторно подпишу свое приложение на страницу, введя следующее в командной строке.

curl -X POST "https://graph.facebook.com/v2.6/me/subscribed_apps?access_token=<PAGE_ACCESS_TOKEN>"

Вот некоторая информация, которая может быть вам полезна.

Репозиторий: https://github.com/lorix-lpan/r-score-god

Server.js: https://github.com/lorix-lpan/r-score-god/blob/master/src/server.js

Страница Facebook: https://www.facebook.com/rscoregod/

Примечание. В настоящее время бот по-прежнему недоступен для публики, отправьте сообщение, чтобы я мог добавить вас в качестве тестового пользователя.

Большое спасибо!


person lpan    schedule 26.04.2016    source источник


Ответы (1)


В итоге сам разобрался с проблемой. С моим кодом действительно что-то не так (или с кодом для начала работы с facebook;)).

С страницы, посвященной началу работы с платформой Messenger.

Обработчик сообщений определяется следующим образом

app.post('/webhook/', function (req, res) {
  messaging_events = req.body.entry[0].messaging;
  for (i = 0; i < messaging_events.length; i++) {
    event = req.body.entry[0].messaging[i];
    sender = event.sender.id;
    if (event.message && event.message.text) {
      text = event.message.text;
      sendTextMessage(sender, "Text received, echo: "+ text.substring(0, 200));
    }
  }
  res.sendStatus(200);
});

Однако при отправке стикера или GIF на сервер поле «сообщение» переменной «событие» будет пустым. Таким образом, код внутри следующего блока не будет оцениваться, и HTTP-запрос не будет выполнен с момента отправки функции sendTextMessage POST на сервер Facebook.

if (event.message && event.message.text) {
  text = event.message.text;
  sendTextMessage(sender, "Text received, echo: "+ text.substring(0, 200));
}

Я решил проблему, просто добавив еще один простой оператор if для наклеек и GIF (или других вложений). Когда пользователь отправляет вложение (GIF или стикер), переменная «событие» будет иметь свойство «вложения». Другими словами, будет определено event.attachments. Мое решение следующее:

app.post('/webhook/', function (req, res) {
  messaging_events = req.body.entry[0].messaging;
  for (i = 0; i < messaging_events.length; i++) {
    event = req.body.entry[0].messaging[i];
    sender = event.sender.id;
    if (event.attachments) {
      sendTextMessage(sender, 'I am an attachment');
    }
    if (event.message && event.message.text) {
      text = event.message.text;
      sendTextMessage(sender, "Text received, echo: "+ text.substring(0, 200));
    }
  }
  res.sendStatus(200);
});

Ознакомьтесь с этим фиксацией для более подробной информации.

person lpan    schedule 26.04.2016
comment
Привет Наткнулся на этот вопрос, когда искал решение аналогичной проблемы в своем боте. Не могли бы вы взглянуть на мою проблему, опубликованную здесь, и сообщить мне, что мне не хватает? stackoverflow.com /вопросы/48255932/ - person SamT; 19.01.2018