Facebook Messenger non Bot invio di messaggi in ordine

voti
9

Sto giocando intorno con la costruzione di un semplice chatbot Facebook Messenger e sto avendo problemi a inviare messaggi in sequenza.

entrare

Nell'esempio di cui sopra, si dovrebbe aver scritto Ciao!, 1, 2, 3 in ordine. Attualmente sto seguendo la documentazione di Facebook trovate qui di attuare questa semplice funzione messaggio di testo. Ho incluso il mio codice Server Express Node.JS qui di seguito:

Definire la sendTextMessage()funzione di:

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.)
        }
    });
}

Usandolo per inviare una risposta:

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

Ho anche cercato di attuare una semplice coda che mette in coda i messaggi e invia solo un messaggio alla volta dopo ogni request's callback successo. Questo mi sta facendo il sospetto che io non sono l'interazione con l'API Messenger in modo corretto.

Qualcuno ha riscontrato questo problema? Come posso ottenere messaggi da inviare in sequenza? Grazie!

MODIFICARE

Perché ho implementato un semplice coda, ma ancora si verifica questo problema, ho compreso il codice per il mio sistema semplice coda di qui.

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 */);

AGGIORNARE

Questo bug è stato segnalato per Facebook, ma suona come se non si ha intenzione di risolvere il problema . Si prega di leggere il thread biglietto sul post di Facebook qui per maggiori dettagli su quello che dicono che sta succedendo. (Grazie a Louise per ottenere l'attenzione di Facebook su questo)

È pubblicato 11/05/2016 alle 02:57
fonte dall'utente
In altre lingue...                            


11 risposte

voti
-2

Si può provare a metterli all'interno di una funzione setTimeout così ognuno va dopo un certo periodo di tempo.

Quindi sostituire questo:

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

Con questo:

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)    

E dovrebbero andare uno dopo l'altro. Si potrebbe anche incorporare le funzioni dentro l'altro in caso di necessità.

Risposto il 14/05/2016 a 01:39
fonte dall'utente

voti
0

Invece di aggiungere timeout statici, vorrei creare una struttura dati della coda. Quando il bot vuole inviare un messaggio, aggiungere il contenuto alla fine della coda. Sul posto richiamata messaggio, controllare se ci sono eventuali messaggi ancora in coda e chiamare la funzione di nuovo utilizzando la ricorsione e rimuovere dalla coda di conseguenza.

Risposto il 14/05/2016 a 01:47
fonte dall'utente

voti
0

Essi dovrebbero essere ricevuti nell'ordine in cui vengono inviati. Assicurarsi che si sta effettivamente mandarli in ordine e non si chiama una funzione asincrona 4 volte (e l'ordine invio non è garantito). (Ho letto che si è verificato, ma in tutta la mia sperimentazione non ho mai visto una ricezione venuto fuori ordine se l'ordine di invio è stata garantita.)

Risposto il 17/05/2016 a 01:13
fonte dall'utente

voti
4

Dopo aver inviato un POST / ME / messaggi, riceverai una risposta che ha un messaggio id (miniera di iniziare con il quale forse sta per ID messaggio 'a metà.'?):

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

Dopo essere stato completamente ricevuto dalle API FB Messenger, si otterrà una chiamata al webhook (senza eventi di segnalazione) che conferma il ricevimento:

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

Credo che ricevuta di consegna è il modo migliore per garantire la consegna, quindi inviare il messaggio successivo.

Risposto il 27/05/2016 a 18:56
fonte dall'utente

voti
8

Ho presentato un bug report a Facebook di questo perché ho avuto lo stesso problema. Essi hanno riconosciuto che è davvero un bug e stanno lavorando per risolvere il problema: https://developers.facebook.com/bugs/565416400306038

Risposto il 22/06/2016 a 20:57
fonte dall'utente

voti
0

Implementare la richiesta di trasmissione come una promessa e solo inviare conseguenti messaggi una volta quello precedente è stato risolto

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);
            }
        );    
    });
};
Risposto il 10/04/2017 a 12:24
fonte dall'utente

voti
0

Ho aggiunto un contatore messageId per l'applicazione che ritorna a 0 a ogni avvio di messagehandling. Poi ho ritardare con quel numero * 100 ms. In questo modo posso aggiungere ritardi intenzionali e con codice comemessageDelay += 15

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

sendMessage estendere:

function sendTextMessage(recipientId, messageText) {
//...
  setTimeout(function() {
    callSendAPI(messageData);
  }, messageDelay++ * 100)    
}
Risposto il 17/06/2017 a 00:29
fonte dall'utente

voti
0

Il messaggio non sta inviando in ordine perché, la richiesta viene inviata in modo asincrono con i tuoi amici, e può essere inviato in qualsiasi ordine.

Per risolvere questo si deve chiamare il successivo sendTextMessagequando il messaggio che deve essere inviato prima di aver ricevuto una risposta.

Risposto il 17/06/2017 a 06:35
fonte dall'utente

voti
0

Basato sulla soluzione ricorsiva proposta da @ user3884594, io tipo di farlo funzionare usando questo (ho rimosso la movimentazione per semplificare errore):

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);
    });
}
Risposto il 21/09/2017 a 04:07
fonte dall'utente

voti
0

Ho avuto esattamente lo stesso problema, che la soluzione ha funzionato per me:

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);

Questa è la mia domanda: Messaggio sequenziale invio utilizzando Facebook Send-API

Risposto il 20/01/2018 a 05:07
fonte dall'utente

voti
0

È possibile ottenere QUEUINGdalle promesse.

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');
    })
  })
})

Risposto il 20/12/2019 a 12:27
fonte dall'utente

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