Получение повторных вызовов на веб-хуке facebook-messenger

Я успешно настроил веб-хук facebook-messenger. До вчерашнего дня я мог также отправлять и получать сообщения. Но сегодня, когда я отправляю одно сообщение от пользователя, я получаю несколько вызовов в POST API сервера. Кажется, они никогда не останавливаются.


person n.arrow001    schedule 26.04.2016    source источник


Ответы (4)


У всех этих вызовов одинаковое содержание или они разные? Вы можете зарегистрировать точную строку сообщения, которую Facebook отправляет вам, и посмотреть, что они включают.

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

{'delivery': {'mids': ['mid.146174459xxx:30a42600a95exxxxx'], 'seq': 429, 'watermark': 146174459xxx}, 'recipient': {'id': xxxxxxxx}, 'sender': {'id': xxxxxx}}

Редактировать: также может быть так, что вы не подтверждаете входящие вызовы с http-статусом 200. Если facebook получает сообщение об ошибке от вашего веб-перехватчика, сообщение будет отправлено несколько раз. .

person Juergen    schedule 27.04.2016
comment
Я попытался подтвердить зацикленное сообщение с помощью res.status(200), но оно продолжает поступать. Есть ли способ проверить, подтверждается ли сообщение как полученное? - person hoodsy; 22.12.2016
comment
Используя паруса js, мне пришлось отправить res.ok() [который равен res.status(200)], и facebook перестал отправлять мне несколько полезных данных. - person fardin; 08.06.2018
comment
+1 b/c Я пропустил ответ 200, и вы напомнили мне об этом. Я добавил 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, которые существуют только в отправленном пользователем сообщении. Обратные вызовы или постбэки не содержат эту часть. Проверьте это, прежде чем отвечать. Если он существует, ответьте, иначе нет.

person n.arrow001    schedule 28.04.2016
comment
Итак, как вы избежали этого... как вы можете различать их.... можете ли вы поделиться примером кода вашего запроса. спасибо - person ARK; 05.05.2016

Моя проблема была похожей, но я получал сообщения о доставке нескольких сообщений. После нескольких часов разочарования я понял, что обратный вызов с доставкой сообщения вызывается каждый раз, когда сообщение доставляется на КАЖДОЕ УСТРОЙСТВО. Таким образом, если вы вошли и в веб-приложение, и в мобильное приложение, обратный вызов будет вызываться дважды.

person Partinder Singh    schedule 30.05.2017
comment
Вот почему я получаю 3 одинаковых подтверждения доставки, лол. Огромное спасибо ! - person sonlexqt; 31.08.2017
comment
Господи, это сводило меня с ума! Не знал, что у меня было 6 ОТКРЫТЫХ ВКЛАДОК, ВСЕ ПОЛУЧАЮЩИЕ ЧЕКИ! - person MikeHolford; 24.07.2018

При работе с мессенджером 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;
        }

Надеюсь, поможет !

person Rodrigo Lopez Guerra    schedule 01.10.2016