Facebook Messenger bot ne pas envoyer des messages dans l'ordre

voix
9

Je joue autour de la construction d'un simple Facebook Messenger chatbot et je vais avoir des problèmes pour envoyer des messages dans l'ordre.

entrez

Dans l'exemple ci - dessus, il aurait dû imprimer « Bonjour! », « 1 », « 2 », « 3 » dans l' ordre. Je suis actuellement en suivant les docs Facebook trouvés ici pour implémenter cette fonction simple message texte. J'ai inclus mon code serveur express Node.JS ci - dessous:

Définition de la sendTextMessage()fonction:

var request = require(request);
function sendTextMessage(user, text) {
    messageData = {
        text: text
    };
    request({
        url: https://graph.facebook.com/v2.6/me/messages,
        qs: {access_token: PAGE_ACCESS_TOKEN},
        method: POST,
        json: {
            recipient: {id: user},
            message: messageData
        }
    }, function(error, response, body) {
        if (error) {
            console.log(Error sending message: , error);
        } else if (response.body.error) {
            console.log(Error: , response.body.error);
        } else {
            console.log(Message successfully send.)
        }
    });
}

L'utiliser pour envoyer une réponse:

sendTextMessage(user, Hello!);
sendTextMessage(user, 1);
sendTextMessage(user, 2);
sendTextMessage(user, 3);

J'ai même essayé la mise en œuvre d' une simple file d' attente que les files d' attente des messages et envoie un seul message à la fois après chaque requestcallback de succès de ». Ce qui me fait l' impression que je ne suis pas en interaction avec l'API Messenger correctement.

Quelqu'un at-il rencontré ce problème? Comment puis-je obtenir des messages à envoyer dans l'ordre? Merci!

MODIFIER

Parce que je mis en œuvre une file d'attente simple mais connaît encore ce problème, je compris le code de mon système simple de file d'attente ici.

var queue = [];
var queueProcessing = false;

function queueRequest(request) {
    queue.push(request);
    if (queueProcessing) {
        return;
    }
    queueProcessing = true;
    processQueue();
}

function processQueue() {
    if (queue.length == 0) {
        queueProcessing = false;
        return;
    }
    var currentRequest = queue.shift();
    request(currentRequest, function(error, response, body) {
        if (error || response.body.error) {
            console.log(Error sending messages!);
        }
        processQueue();
    });
}

queueRequest(/* Message 1 */);
queueRequest(/* Message 2 */);
queueRequest(/* Message 3 */);

METTRE À JOUR

Ce « bug » a été signalé à Facebook , mais on dirait qu'ils ne vont pas réparer . S'il vous plaît lire le fil de billets sur le post de Facebook ici pour plus de détails sur ce qu'ils disent qui se passe. (Merci à Louise pour attirer l'attention de Facebook à ce sujet )

Créé 11/05/2016 à 02:57
source utilisateur
Dans d'autres langues...                            


11 réponses

voix
-2

Vous pouvez essayer de les mettre dans une fonction setTimeout pour que chacun va après une certaine période de temps.

remplacer Donc ceci:

sendTextMessage(user, "Hello!");
sendTextMessage(user, "1");
sendTextMessage(user, "2");
sendTextMessage(user, "3");

Avec ça:

sendTextMessage(user, "Hello!");              

// 1 second

setTimeout(function() {
    sendTextMessage(user, "1");
}, 1000)

// 2 seconds

setTimeout(function() {
    sendTextMessage(user, "2");
}, 2000)

// 3 seconds

setTimeout(function() {
    sendTextMessage(user, "3");
}, 3000)    

Et ils devraient aller un après l'autre. Vous pouvez également intégrer les fonctions dans l'autre en cas de besoin.

Créé 14/05/2016 à 01:39
source utilisateur

voix
0

Au lieu d'ajouter les délais d'attente statiques, je voudrais créer une structure de données de file d'attente. Lorsque le robot veut envoyer un message, ajoutez le contenu à la fin de la file d'attente. Sur le rappel de poste de message, vérifier s'il y a des messages encore dans la file d'attente et appeler à nouveau la fonction à l'aide récursivité et supprimer de la file d'attente en conséquence.

Créé 14/05/2016 à 01:47
source utilisateur

voix
0

Ils doivent être reçus dans l'ordre qu'ils sont envoyés. Assurez-vous de les envoyer en fait dans l'ordre et ne pas appeler une fonction async 4 fois (et envoyer la commande est non garantie). (Je lis que vous le testiez mais dans tous mes tests, je ne l'ai jamais vu une réception sortir de l'ordre si l'ordre d'envoi a été garantie.)

Créé 17/05/2016 à 01:13
source utilisateur

voix
4

Après avoir envoyé un POST / Me / messages, vous recevrez une réponse qui a un identifiant de message (le mien commencer par ce qui signifie peut-être pour id message « mi. »?):

{ recipient_id: '1015411228555555',
  message_id: 'mid.1464375085492:b9606c00ca33c12345' }

Après avoir été complètement reçu par l'API Messenger FB, vous recevez un appel à votre webhook (sans événements de message) qui confirme la réception:

{ sender: { id: '1015411228555555' },
  recipient: { id: '566031806XXXXXX' },
  delivery:
   { mids: [ 'mid.1464375085492:b9606c00ca33c12345' ],
     watermark: 1464375085604,
     seq: 176 } }

Je pense que la réception de la livraison est la meilleure façon d'assurer la livraison, puis envoyez le message suivant.

Créé 27/05/2016 à 18:56
source utilisateur

voix
8

J'ai présenté un rapport de bogue à Facebook sur ce parce que je le même problème. Ils ont reconnu qu'il est en effet un bug et travaillent à corriger: https://developers.facebook.com/bugs/565416400306038

Créé 22/06/2016 à 20:57
source utilisateur

voix
0

Mettre en œuvre la demande d'envoi en tant que promesse et n'envoyer des messages consécutifs une fois que le précédent est résolu

const send = (userId, messageData)  => {

      return new Promise((resolve, reject) => {
        request
        (
            {
                url     : BASE_URL + "me/messages",
                qs      : { access_token : PAGE_ACCESS_TOKEN },
                method  : "POST",
                json    : 
                        {
                            recipient: { id : userId },
                            message: messageData,
                        }
            }, (error, response, body) => 
            {
                if (error) { console.log("Error sending message: " + response.error); return reject(response.error); }
                else if (response.body.error) { console.log('Response body Error: ' + response.body.error); return reject(response.body.error); }

                console.log("Message sent successfully to " + userId); 
                return resolve(response);
            }
        );    
    });
};
Créé 10/04/2017 à 12:24
source utilisateur

voix
0

J'ai ajouté un compteur de messageId à l'application qui remet à zéro à 0 à chaque démarrage de messagehandling. Ensuite, je retarde avec ce numéro * 100 ms. De cette façon, je peux ajouter des retards intentionnels et avec le code commemessageDelay += 15

receivedMessage(event) {
  messageDelay = 0;
  //...

sendMessage étendre:

function sendTextMessage(recipientId, messageText) {
//...
  setTimeout(function() {
    callSendAPI(messageData);
  }, messageDelay++ * 100)    
}
Créé 17/06/2017 à 00:29
source utilisateur

voix
0

Le message n'envoie pas pour cause, la demande est envoyée de manière asynchrone à facebook, et peut être envoyé dans un ordre quelconque.

Pour résoudre cela , vous devez appeler le prochain sendTextMessagelorsque le message qui doit être envoyé avant qu'il ait reçu une réponse.

Créé 17/06/2017 à 06:35
source utilisateur

voix
0

Sur la base de la solution récursive proposée par @ user3884594, je sorte de le faire fonctionner en utilisant ce (j'ai enlevé la gestion des erreurs afin de simplifier):

send_messages (["message 01", "message 02", "message 03"]);

function send_messages (which, i = 0)
{
    request({
        url: 'https://graph.facebook.com/v2.10/me/messages',
        qs: { access_token: FACEBOOK_ACCESS_TOKEN },
        method: 'POST',
        json: { recipient: { id: senderId }, message: { text: which [i] }
    }, (error, response, body) => 
    {
        // You need to put your error handling logic here
        if (i++ < which.length - 1)
            send_messages (which, i);
    });
}
Créé 21/09/2017 à 04:07
source utilisateur

voix
0

J'ai eu exactement le même problème, cette solution a fonctionné pour moi:

function sendMessage(recipient, messages, accessToken, i) {


    axios.post(baseURL + 'v2.11/me/messages/?access_token=' + accessToken,
        Object.assign({}, {
            messaging_type: "RESPONSE",
            recipient: {
                id: recipient
            }
        }, messages[i]['payload']) )
        .then(response => {

            if(i < messages.length) sendMessage( recipient, messages, accessToken, i+1 );

            },
            error => {})
        .catch(error => {});

}
sendMessage(recipient, flow['messages'], flow['page']['accessToken'], 0);

Voilà ma question: message séquentiel Envoi utilisant Facebook Envoyer API

Créé 20/01/2018 à 05:07
source utilisateur

voix
0

Vous pouvez obtenir QUEUINGdes promesses.

function delay(time) {
  return new Promise(function(resolve, reject) {
    setTimeout(resolve, time);
  });
}

delay(2000).then(() => {
  console.log('hi');
  delay(2000).then(() => {
    console.log('hello');
    delay(2000).then(() => {
      console.log('welcome');
    })
  })
})

Créé 20/12/2019 à 12:27
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more