Facebook Messenger bot ikke sende meldinger for

stemmer
10

Jeg spiller rundt med å bygge en enkel Facebook Messenger chatbot og jeg har problemer med å sende meldinger i sekvens.

skriv

I eksempelet ovenfor, bør det ha trykt Hei!, 1, 2, 3 i orden. Jeg er for tiden å følge Facebook-docs funnet her for å gjennomføre dette enkel tekstmelding funksjon. Jeg har tatt mitt Express node.js serveren koden under:

Definere sendTextMessage()funksjon:

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

Bruke den til å sende et svar:

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

Jeg prøvde å gjennomføre en enkel kø som køer meldinger og bare sender en melding om gangen etter hver requestsuksess tilbakeringing. Dette gjør meg mistenker at jeg ikke er i samspill med Messenger API riktig.

Har noen støtt på dette problemet? Hvordan kan jeg få meldinger til å sende i rekkefølge? Takk!

REDIGERE

Fordi jeg implementert en enkel kø, men likevel opplever dette problemet, jeg er inkludert koden for min enkle køsystem her.

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

OPPDATER

Denne bug ble rapportert til Facebook, men det høres ut som de ikke kommer til å fikse det . Vennligst les billetten tråden på Facebook innlegg her for mer informasjon om hva de sier som skjer. (Takk til Louise for å få Facebook oppmerksomhet på dette)

Publisert på 11/05/2016 klokken 02:57
kilden bruker
På andre språk...                            


11 svar

stemmer
-2

Du kan prøve å sette dem inne i en setTimeout funksjon slik at hver man går etter en viss tid.

Så erstatte dette:

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

Med dette:

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)    

Og de bør gå en etter en. Du kan også legge inn funksjonene i hverandre ved behov.

Svarte 14/05/2016 kl. 01:39
kilden bruker

stemmer
0

I stedet for å legge statiske tidsavbrudd, ville jeg skape en kø datastruktur. Når bot ønsker å sende en melding, legge innholdet til slutten av køen. På meldings post tilbakeringing, sjekk om det er noen meldinger fortsatt i kø og kaller funksjonen igjen ved hjelp av rekursjon og fjerne fra køen tilsvarende.

Svarte 14/05/2016 kl. 01:47
kilden bruker

stemmer
0

De bør bli mottatt i den rekkefølgen de sendes. Sørg for at du faktisk sender dem i orden og ikke ringer en asynkron funksjon 4 ganger (og sende ordre er ikke garantert). (Jeg leste at du testet det, men i min testing jeg har aldri sett en får komme ut av drift hvis sende ordren ble garantert.)

Svarte 17/05/2016 kl. 01:13
kilden bruker

stemmer
4

Når du har sendt en POST til / Me / meldinger, vil du motta et svar som har et budskap id (mine begynne med som kanskje står for melding id 'midten.?):

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

Etter å ha blitt fullstendig mottatt av FB Messenger API, får du en samtale til din webhook (uten beskjed hendelser) som bekrefter mottak:

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

Jeg tror at leveringsbekreftelse er den beste måten å sikre levering, deretter sende neste melding.

Svarte 27/05/2016 kl. 18:56
kilden bruker

stemmer
8

Jeg sendte inn en feilrapport til Facebook om dette fordi jeg hadde det samme problemet. De erkjente at det faktisk er en feil og jobber med å fikse det: https://developers.facebook.com/bugs/565416400306038

Svarte 22/06/2016 kl. 20:57
kilden bruker

stemmer
1

Implementere sende forespørsel som et løfte, og bare sende påfølgende meldinger når den forrige er løst

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);
            }
        );    
    });
};
Svarte 10/04/2017 kl. 12:24
kilden bruker

stemmer
0

Jeg har lagt en messageId strid med app som tilbakestilles til 0 på hver start av messagehandling. Da forsinke jeg med det nummeret * 100 ms. Denne måten jeg kan legge tilsiktet forsinkelser i tillegg med kode sommessageDelay += 15

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

Sendmessage forlenge:

function sendTextMessage(recipientId, messageText) {
//...
  setTimeout(function() {
    callSendAPI(messageData);
  }, messageDelay++ * 100)    
}
Svarte 17/06/2017 kl. 00:29
kilden bruker

stemmer
0

Meldingen kan ikke sende for fordi forespørselen er sendt asynkront til facebook, og kan sendes i den rekkefølgen.

For å løse dette må du ringe neste sendTextMessagenår meldingen som skal sendes før den har mottatt et svar.

Svarte 17/06/2017 kl. 06:35
kilden bruker

stemmer
0

Basert på den rekursive løsning som foreslås ved @ user3884594, type av at det skal fungere ved hjelp av denne (I fjernet feilhåndtering for å forenkle):

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);
    });
}
Svarte 21/09/2017 kl. 04:07
kilden bruker

stemmer
0

Jeg hadde nøyaktig samme problem, at løsningen fungerte for meg:

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

Det er mitt spørsmål: Sekvensiell sending av melding Bruke Facebook Send-API

Svarte 20/01/2018 kl. 05:07
kilden bruker

stemmer
0

Du kan oppnå QUEUINGved løftene.

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

Svarte 20/12/2019 kl. 12:27
kilden bruker

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