Facebook Messenger Bot niet het verzenden van berichten in orde

stemmen
9

Ik speel rond met het bouwen van een eenvoudige Facebook Messenger chatbot en ik heb problemen met het verzenden van berichten in de juiste volgorde.

voer

In het bovenstaande voorbeeld, zou het Hallo!, 1, 2, 3 zijn afgedrukt in orde is. Ik ben momenteel naar aanleiding van de Facebook-docs vonden hier om dit eenvoudige sms-functie uit te voeren. Ik heb mijn Express node.js server code hieronder opgenomen:

Het definiëren van de sendTextMessage()functie:

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

Te gebruiken om een ​​reactie te sturen naar:

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

Ik heb zelfs geprobeerd de implementatie van een eenvoudige rij dat de berichten in de wachtrij en stuurt alleen een boodschap op een moment na elke request's succes callback. Dit maakt me vermoed dat ik niet de interactie met de Messenger API correct.

Heeft iemand ontmoet deze kwestie? Hoe kan ik berichten te sturen in de juiste volgorde? Bedankt!

BEWERK

Omdat ik implementeerde een eenvoudige wachtrij, maar nog altijd problemen ondervindt, ik ben met inbegrip van de code voor mijn eenvoudige wachtrij-systeem hier.

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

BIJWERKEN

Deze bug werd gemeld aan Facebook, maar het klinkt alsof ze niet van plan om het te repareren . Lees de ticket draad op Facebook's post hier voor meer informatie over wat ze zeggen er gaande is. (Dank u aan Louise voor het krijgen van Facebook de aandacht op deze)

De vraag is gesteld op 11/05/2016 om 02:57
bron van user
In andere talen...                            


11 antwoorden

stemmen
-2

U kunt proberen te zetten in een setTimeout functie, zodat een ieder gaat na een bepaalde periode van tijd.

Dus vervang deze:

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

Hiermee:

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)    

En ze moeten een na de ander te gaan. Je zou ook kunnen insluiten van de functies in elkaar als dat nodig is.

antwoordde op 14/05/2016 om 01:39
bron van user

stemmen
0

In plaats van het toevoegen van statische time-outs, zou ik een wachtrij datastructuur te creëren. Wanneer het bot wil een bericht te sturen, voeg de inhoud aan het eind van de wachtrij. Op het bericht post callback, kijk of er geen berichten zijn nog steeds in de wachtrij en bel de functie opnieuw met behulp van recursie en verwijderen uit de wachtrij dienovereenkomstig.

antwoordde op 14/05/2016 om 01:47
bron van user

stemmen
0

Zij moeten worden ontvangen in de volgorde waarin ze worden verzonden. Zorg ervoor dat je ze eigenlijk het verzenden van in orde zijn en niet het bellen van een asynchrone functie 4 keer (en stuur bestelling is niet gegarandeerd). (Ik las dat je het getest, maar in al mijn tests heb ik nog nooit gezien een te ontvangen uit te komen na bestelling, indien de send order is gegarandeerd.)

antwoordde op 17/05/2016 om 01:13
bron van user

stemmen
4

Nadat u een POST te sturen naar / me / messages, zult u een reactie dat een bericht id heeft ontvangen (mine beginnen met die misschien staat voor bericht id 'mid.'?):

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

Na te zijn door de FB Messenger API volledig ontvangen, krijgt u een oproep om uw webhook (zonder boodschap evenementen) te krijgen dat de ontvangst bevestigt:

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

Ik denk dat de levering ontvangst is de beste manier om levering te garanderen, stuur dan het volgende bericht.

antwoordde op 27/05/2016 om 18:56
bron van user

stemmen
8

Ik diende een bug report aan Facebook over deze, want ik had het zelfde probleem. Zij erkenden dat het inderdaad een bug en zijn bezig om het te repareren: https://developers.facebook.com/bugs/565416400306038

antwoordde op 22/06/2016 om 20:57
bron van user

stemmen
0

Implementeren van de aanvraag tot verzenden als een belofte en alleen daaruit voortvloeiende berichten verzenden zodra de vorige is opgelost

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);
            }
        );    
    });
};
antwoordde op 10/04/2017 om 12:24
bron van user

stemmen
0

Ik voegde een MessageID strijd zijn met de app die gaat terug naar 0 op elke start van messagehandling. Dan vertraging ik met dat nummer * 100 ms. Op deze manier kan ik opzettelijke vertragingen eveneens toe te voegen met code zoalsmessageDelay += 15

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

sendMessage breiden:

function sendTextMessage(recipientId, messageText) {
//...
  setTimeout(function() {
    callSendAPI(messageData);
  }, messageDelay++ * 100)    
}
antwoordde op 17/06/2017 om 00:29
bron van user

stemmen
0

Het bericht wordt niet verzenden in orde omdat het verzoek asynchroon wordt verzonden naar facebook, en kunnen in willekeurige volgorde worden verzonden.

Om dit op te lossen moet je bellen met de volgende sendTextMessagewanneer het bericht dat voordat het moet worden verzonden een reactie heeft ontvangen.

antwoordde op 17/06/2017 om 06:35
bron van user

stemmen
0

Op basis van de door @ user3884594 voorgesteld recursieve oplossing, ik soort van het te laten werken met behulp van deze (Ik verwijderde de foutafhandeling teneinde deze te vereenvoudigen):

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);
    });
}
antwoordde op 21/09/2017 om 04:07
bron van user

stemmen
0

Ik had precies hetzelfde probleem, dat de oplossing werkte voor mij:

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

Dat is mijn vraag: Sequential Message verzenden via facebook Foto-API

antwoordde op 20/01/2018 om 05:07
bron van user

stemmen
0

Je kunt bereiken QUEUINGdoor beloften.

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

antwoordde op 20/12/2019 om 12:27
bron van user

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