2016-04-19 1 views
5

J'apprends à travailler avec Facebook Messenger API. J'ai réussi à installer un webhook, je suis abonné à l'application. Mais quand j'envoie un message à ma page, je reçois plusieurs instances du même message comme une rafale.Facebook Messenger Webhook envoyer des messages en continu

Je stocke les messages que j'envoie de mon application lorsqu'elle est reçue sur le Webhook.

Une vue de ma base de données ressemble à la capture d'écran ci-dessous.

http://prntscr.com/au3emz

Je devine que ce peut être parce que le message est encore non lu? Juste une supposition sauvage peut être quelqu'un d'autre sait à coup sûr. J'ai essayé un exemple exact de Facebook Office (Node) et ça se passe aussi.

Merci.

+1

J'ai également rencontré ce problème. Quand je l'envoie au message du bouton de l'utilisateur, mon hook Web commence à envoyer des messages de bouton non-stop. –

+0

Avoir ce problème en utilisant ClaudiaJS et AWS Lambda pour un bot de chat facebook. On lui a dit d'augmenter le délai d'attente, l'a fait durer jusqu'à 3 minutes et ça arrive toujours. – SMT

Répondre

0

Solution

J'ai envoyé une demande de souscription à nouveau à ma demande d'arrêter ces messages.

Donc, essentiellement ce que j'ai expérimenté, c'est que webhook ré-abonnement application après avoir reçu le message va arrêter toute autre réception jusqu'au prochain message.

Ceci est bien la solution au cœur de "Pourquoi cela arrive?" n'est pas encore connu. Sera heureux si quelqu'un peut contribuer.

Merci.

+0

Je me rends compte que c'est un vieux message, mais vous devez envoyer explicitement une réponse '200 OK' aussi vite que possible sur Facebook, sinon cela retardera considérablement les réponses ultérieures. Fondamentalement, les choses deviennent farfelues si vous ne le faites pas. –

1

J'ai eu le même problème avec mon application de test. Je suis encore nouveau sur l'API Messenger et ma solution peut être naïve.

Dans un premier temps, le code était comme:

if (text) { 
    sendTextMessage(sender, 'Response 1'); 
} else { 
    queryDB(
    sendTextMessage(sender, 'Response 2'); 
) 
} 
res.sendStatus(200); 

qui a gardé l'envoi de réponse 1 pour toujours. Le code correct est:

if (text) { 
    sendTextMessage(sender, 'Response 1'); 
    res.sendStatus(200); 
} else { 
    queryDB(
    sendTextMessage(sender, 'Response 2'); 
    res.sendStatus(200); 
) 
} 

Vous devez toujours envoyer un message après l'envoi d'un message.

2

Cela est souvent causé si vous vous abonnez au echo message callback event.

De la documentation;

Ce rappel se produira lorsqu'un message a été envoyé par votre page.

Cela signifie que vous recevrez une copie de tout message envoyé par votre bot. De votre code, cela provoquera une forme de boucle infinie; vous continuerez à recevoir Response 1.

Vous pouvez facilement confirmer cela en inspectant la valeur de text; Vous trouverez également Response 1 et lors de l'inspection de la charge utile entière, le champ "is_echo":true sera affiché.

Solution: Modifier votre abonnement page à exclure message_echoes

enter image description here

1

Je détectons que Situés entre l'invocation de facebook et ma réponse avec 200 statuscode mon code attendait 2 secondes, mon code est syncronous, ainsi , mon code total répond avec 200 code 2 secondes après ..
De nombreuses sondes résultats pour moi que si je ne pas envoyer 200 code de statut à facebook en une seconde facebook renvoyer un message à webhook. Pour moi l'aolution était analyser le message entrant et obtenir la clé d'horodatage (A), puis j'obtiens un timestamp.from une base de données (B). compare A == B .. si c'est vrai, je ne sais pas et finit mon traitement webhook, si c'est faux alors écris dans la base de données le nouvel horodatage (A) et continue avec webhook proceasing.