Я успешно настроил веб-хук facebook-messenger. До вчерашнего дня я мог также отправлять и получать сообщения. Но сегодня, когда я отправляю одно сообщение от пользователя, я получаю несколько вызовов в POST API сервера. Кажется, они никогда не останавливаются.
Получение повторных вызовов на веб-хуке facebook-messenger
Ответы (4)
У всех этих вызовов одинаковое содержание или они разные? Вы можете зарегистрировать точную строку сообщения, которую Facebook отправляет вам, и посмотреть, что они включают.
Например, есть обратный вызов доставки сообщения, который информирует вас о том, что пользователь получил сообщение. JSON выглядит так:
{'delivery': {'mids': ['mid.146174459xxx:30a42600a95exxxxx'], 'seq': 429, 'watermark': 146174459xxx}, 'recipient': {'id': xxxxxxxx}, 'sender': {'id': xxxxxx}}
Редактировать: также может быть так, что вы не подтверждаете входящие вызовы с http-статусом 200. Если facebook получает сообщение об ошибке от вашего веб-перехватчика, сообщение будет отправлено несколько раз. .
res.status(200).send('EVENT_RECEIVED')
до того, как сработает моя функция, и это убивает мой бесконечный цикл
- person Mote Zart; 26.10.2019
Догадаться. Я отправлял ответ на каждое сообщение, пришедшее из facebook. Так что я закончил тем, что отвечал на сообщения ACK. В свою очередь пришел еще один ACK. Вот почему это привело к бесконечному циклу.
На этой странице мы можем найти различные структуры объектов для полученных сообщений:
текст
{
"object":"page",
"entry":[
{
"id":PAGE_ID,
"time":1457764198246,
"messaging":[
{
"sender":{
"id":USER_ID
},
"recipient":{
"id":PAGE_ID
},
"timestamp":1457764197627,
"message":{
"mid":"mid.1457764197618:41d102a3e1ae206a38",
"seq":73,
"text":"hello, world!"
}
}
]
}
]
}
Обратный вызов с доставкой сообщения
{
"object":"page",
"entry":[
{
"id":PAGE_ID,
"time":1458668856451,
"messaging":[
{
"sender":{
"id":USER_ID
},
"recipient":{
"id":PAGE_ID
},
"delivery":{
"mids":[
"mid.1458668856218:ed81099e15d3f4f233"
],
"watermark":1458668856253,
"seq":37
}
}
]
}
]
}
Таким образом, для дифференциации мы можем обратиться к entry[0].messaging[0].message
, которые существуют только в отправленном пользователем сообщении. Обратные вызовы или постбэки не содержат эту часть. Проверьте это, прежде чем отвечать. Если он существует, ответьте, иначе нет.
Моя проблема была похожей, но я получал сообщения о доставке нескольких сообщений. После нескольких часов разочарования я понял, что обратный вызов с доставкой сообщения вызывается каждый раз, когда сообщение доставляется на КАЖДОЕ УСТРОЙСТВО. Таким образом, если вы вошли и в веб-приложение, и в мобильное приложение, обратный вызов будет вызываться дважды.
При работе с мессенджером facebook после отправки сообщения необходимо учитывать две вещи:
Поскольку вы работаете с веб-перехватчиками, это будет срабатывать каждый раз, когда происходит одно из событий (получение сообщения, доставка отправленного вами сообщения, чтение сообщения пользователем). Поэтому, если вы активируете, например, message_deliveries в своем веб-перехватчике и отправляете сообщение в качестве действия, вы попадете в цикл.
Правильный способ справиться с этим находится в базовом коде. Пример PHP:
// Skipping delivery messages
if (!empty($message['delivery'])) {
#Do something here if you want
continue;
}
// Skipping read messages
if (!empty($message['read'])) {
#Do something here if you want
continue;
}
Надеюсь, поможет !