12 votes

Obtention d'appels répétés sur le webhook facebook-messenger

J'ai réussi à configurer un webhook facebook-messenger. Jusqu'à hier, j'étais capable d'envoyer et de recevoir des messages. Mais aujourd'hui, lorsque j'envoie un message d'un utilisateur, je reçois plusieurs appels à l'API POST du webhook du serveur. Ils ne semblent jamais s'arrêter.

12voto

Juergen Points 567

Ces appels ont-ils tous le même contenu ou sont-ils différents ? Vous pourriez enregistrer la chaîne de messages exacte que facebook vous envoie et voir ce qu'ils contiennent.

Par exemple, il y a un callback de livraison de message qui vous informe que l'utilisateur a reçu le message. Le JSON ressemble à ceci :

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

Edit : Il se peut aussi que vous soyez no confirmer les appels entrants avec un statut http 200. Si facebook reçoit une erreur de votre webhook, le message sera envoyé plusieurs fois.

7voto

n.arrow001 Points 544

J'ai compris. J'envoyais des réponses à chaque communication provenant de Facebook. Donc j'ai fini par répondre aux messages ACK aussi. A son tour, un autre ACK est arrivé. C'est pourquoi il y a eu une boucle infinie.

Sur este nous pouvons trouver différentes structures d'objets pour les messages reçus :

texte

{
"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!"
      }
    }
  ]
}
]
}

Rappel du message délivré

{
 "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
           }
        }
     ]
  }
 ]
}

Ainsi, pour différencier, nous pouvons nous référer à entry[0].messaging[0].message ceci n'existe que dans le message envoyé par l'utilisateur. Le callback ou les postbacks ne contiennent pas cette partie. Vérifiez si elle existe, avant de répondre. Si elle existe, répondez, sinon ne le faites pas.

6voto

Partinder Singh Points 121

Mon problème était similaire, mais je recevais des messages multiples. Après quelques heures de frustration, j'ai réalisé que Appel du message délivré est appelé chaque fois que le message est délivré à CHAQUE DISPOSITIF. Ainsi, si vous êtes connecté à la fois à l'application web et à l'application mobile, le callback sera appelé deux fois.

0voto

Lorsque vous travaillez avec le messager de Facebook, vous devez prendre en compte deux choses après avoir envoyé le message :

A) Transmission des messages

B) Message lu

Puisque vous travaillez avec des webhooks, cela se déclenchera chaque fois qu'un des événements se produira (recevoir un message, livrer le message que vous avez envoyé, l'utilisateur a lu le message). Donc si vous activez par exemple messages_livraisons dans votre webhook et que vous envoyez un message comme action, vous vous retrouverez dans une boucle.

La manière correcte de gérer cela se trouve dans le code de base. Exemple 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;
        }

J'espère que cela vous aidera !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X