2016-04-26 4 views
0

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

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

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

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

Repo: 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/

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

спасибо!

ответ

2

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

От Посланника самой платформы начала работы page

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

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» будет иметь свойство «вложения». Другими словами, 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); 
}); 

Заканчивать этот commit подробнее

+0

Привет Наткнулся на этот вопрос, как я искал решение по аналогичному вопросу в моем боте. Не возражаете ли вы взглянуть на мою проблему, размещенную здесь, и сообщите мне, чего я не хватает? https://stackoverflow.com/questions/48255932/res-send200-issue-on-facebook-messenger-bot/48255982#48255982 – SamT

Смежные вопросы