Facebook Messenger nu bot trimiterea de mesaje în ordine

voturi
9

Mă joc în jurul cu construirea unui simplu chatbot Facebook Messenger și am probleme la trimiterea de mesaje în ordine.

introduceți

In exemplul de mai sus, ar fi imprimat Bună ziua!, 1, 2, 3 , în ordine. Eu sunt în prezent în urma docs Facebook găsit aici pentru a pune în aplicare această funcție simplă mesaj de tip text. Am inclus codul meu server de Express Node.JS de mai jos:

Definirea sendTextMessage()funcției:

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

Folosindu-l pentru a trimite un răspuns:

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

Am încercat chiar punerea în aplicare o coadă simplă , care cozile de mesaje și doar trimite un mesaj la un moment dat după fiecare requeste de apel invers de succes. Acest lucru mă face să bănuiesc că nu sunt corect interactiunea cu API - ul Messenger.

Are cineva întâlnit această problemă? Cum pot obține pentru a trimite mesaje în ordine? Mulțumiri!

EDITAȚI | ×

Pentru că am pus în aplicare o coadă simplă, dar încă se confruntă cu această problemă, eu sunt inclusiv codul pentru sistemul meu coadă simplu aici.

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

ACTUALIZAȚI

Acest „bug“ a fost raportat la Facebook , dar se pare că acestea nu sunt de gând să - l repare . Vă rugăm să citiți firul bilet pentru postarea Facebook aici pentru detalii despre ceea ce spun se întâmplă. (Vă mulțumesc pentru Louise pentru a obține atenția Facebook de pe acest)

Întrebat 11/05/2016 la 02:57
sursa de către utilizator
În alte limbi...                            


11 răspunsuri

voturi
-2

Puteți încerca punerea lor în interiorul unei funcții setTimeout astfel încât fiecare dintre ele se duce după o anumită perioadă de timp.

Deci, înlocuiți acest lucru:

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

Cu asta:

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)    

Și ei ar trebui să meargă unul după altul. Ai putea încorpora, de asemenea, funcțiile în interiorul reciproc, dacă este nevoie.

Publicat 14/05/2016 la 01:39
sursa de către utilizator

voturi
0

In loc de a adăuga timeout-uri statice, aș crea o structură de date coadă. În cazul în care bot vrea să trimită un mesaj, adăugați conținutul la sfârșitul cozii de așteptare. La mesajul de după apel invers, verificați dacă există mesaje încă în coada de așteptare și apelați funcția din nou folosind recursiune și scoateți din coadă în consecință.

Publicat 14/05/2016 la 01:47
sursa de către utilizator

voturi
0

Acestea ar trebui să fie primite în ordinea în care acestea sunt trimise. Asigurați-vă că sunteți de fapt, le trimite în ordine și cel care nu o funcție async de 4 ori (și trimite comanda nu este garantată). (Am citit că ați testat, dar în toate testele mea nu am mai văzut o primesc ieșirea de ordine în cazul în care ordinul de trimitere a fost garantată.)

Publicat 17/05/2016 la 01:13
sursa de către utilizator

voturi
4

După trimiterea unui post / mi / mesaje, veți primi un răspuns care are un mesaj de ID (a mea începe cu care poate standuri pentru mesajul id „mijlocul lui.“?):

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

După ce a fost complet primit de API-ul FB Messenger, veți primi un apel la webhook dvs. (fara evenimente de mesaje), care confirmă primirea:

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

Cred că primirea de livrare este cel mai bun mod de a asigura livrarea, apoi trimite mesajul următor.

Publicat 27/05/2016 la 18:56
sursa de către utilizator

voturi
8

Am prezentat un raport de eroare la Facebook despre acest lucru pentru că am fost cu aceeași problemă. Ei au recunoscut că aceasta este într - adevăr o eroare și sunt de lucru pentru a remedia problema: https://developers.facebook.com/bugs/565416400306038

Publicat 22/06/2016 la 20:57
sursa de către utilizator

voturi
0

Punerea în aplicare a cererii trimite ca o promisiune și doar trimite mesaje consecutive o dată cea anterioară este rezolvată

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);
            }
        );    
    });
};
Publicat 10/04/2017 la 12:24
sursa de către utilizator

voturi
0

Am adăugat un contor messageId în aplicația care resetează la 0 la fiecare pornire a messagehandling. Apoi am întârziere cu acel număr * 100 ms. În acest fel pot adăuga întârzieri intenționate precum și cu un cod camessageDelay += 15

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

SendMessage extinde:

function sendTextMessage(recipientId, messageText) {
//...
  setTimeout(function() {
    callSendAPI(messageData);
  }, messageDelay++ * 100)    
}
Publicat 17/06/2017 la 00:29
sursa de către utilizator

voturi
0

Mesajul nu este de a trimite în ordine, deoarece, cererea este trimisă la asincronă facebook, și pot fi trimise în orice ordine.

Pentru a rezolva acest lucru , trebuie să sunați la următorul sendTextMessageatunci când mesajul pe care ar trebui să fie trimis înainte de a primit un răspuns.

Publicat 17/06/2017 la 06:35
sursa de către utilizator

voturi
0

Pe baza soluției recursive propusă de @ user3884594, am un fel de a face să funcționeze folosind acest (am scos eroarea de manipulare pentru a simplifica):

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);
    });
}
Publicat 21/09/2017 la 04:07
sursa de către utilizator

voturi
0

Am avut exact aceeași problemă, această soluție a lucrat pentru mine:

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

Asta e întrebarea mea: Mesaj Secvențial Trimiterea folosind Facebook Trimite-API

Publicat 20/01/2018 la 05:07
sursa de către utilizator

voturi
0

Puteți realiza QUEUINGprin promisiuni.

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

Publicat 20/12/2019 la 12:27
sursa de către utilizator

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