Facebook Messenger Bot keine Nachrichten, um das Senden

stimmen
9

Ich spiele um mit einem einfachen Facebook Messenger chatbot Aufbau und ich habe Probleme Nachrichten nacheinander gesendet werden.

Geben

In dem obigen Beispiel sollte es gedruckt Hallo! Hat, 1, 2, 3 , um. Ich verfolge derzeit die Facebook - Dokumente gefunden hier diese einfache Textnachricht - Funktion zu implementieren. Ich habe meinen Express Node.JS Server - Code unten enthalten:

Definition der sendTextMessage()Funktion:

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

Mit ihm eine Antwort zu senden:

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

Ich habe sogar versucht , eine einfache Warteschlange Implementierung , die Nachrichten - Warteschlangen und sendet nur eine Nachricht zu einem Zeitpunkt nach jedem requestErfolg Rückruf s‘. Das macht mich vermuten , dass ich nicht richtig mit der Messenger - API interagieren.

Hat jemand dieses Problem gestoßen? Wie kann ich Nachrichten erhalten in Folge zu schicken? Vielen Dank!

BEARBEITEN

Da ich eine einfache Warteschlange implementiert, aber noch erlebe dieses Problem, ich bin auch den Code für mein einfaches Warteschlangensystem 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 */);

AKTUALISIEREN

Dieser „Fehler“ wurde auf Facebook berichtet , aber es klingt wie sie gehen zu beheben es nicht . Bitte lesen Sie die Ticket - Thread auf Facebook Post hier für Details auf , was sie sagen , vor sich geht. (Vielen Dank an Louise für Facebook , die Aufmerksamkeit auf diese bekommen)

Veröffentlicht am 11/05/2016 um 02:57
quelle vom benutzer
In anderen Sprachen...                            


11 antworten

stimmen
-2

Sie können versuchen, sie in einer setTimeout-Funktion setzen, so dass jeder eine nach einer gewissen Zeit geht.

So ersetzen Sie diese:

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

Mit diesem:

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)    

Und sie sollten einer nach dem anderen gehen. Sie könnten auch einbetten die Funktionen ineinander, wenn es sein muss.

Beantwortet am 14/05/2016 um 01:39
quelle vom benutzer

stimmen
0

Statt statische Timeouts des Hinzufügens, würde ich eine Warteschlange Datenstruktur erstellen. Wenn der Bot will eine Nachricht senden, um den Inhalt an das Ende der Warteschlange anhängen. Auf der Nachricht sendet Rückruf, ob es irgendwelche Nachrichten noch in der Warteschlange befindet und rufen Sie die Funktion erneut Rekursion und aus der Warteschlange entsprechend entfernen.

Beantwortet am 14/05/2016 um 01:47
quelle vom benutzer

stimmen
0

Sie sollten in der Reihenfolge empfangen werden, dass sie gesendet werden. Stellen Sie sicher, Sie senden ihnen tatsächlich um und nicht eine Funktion Asynchron 4 mal aufrufen (und Bestellung abschicken kann nicht garantiert werden). (Ich habe gelesen, dass Sie es getestet, aber in allen meinen Tests habe ich noch nie ein kommt aus Bestellung zu sehen, ob der Sendeauftrag garantiert wurde.)

Beantwortet am 17/05/2016 um 01:13
quelle vom benutzer

stimmen
4

Nachdem Sie eine POST / me / Nachrichten senden, erhalten Sie eine Antwort erhalten, die eine Nachrichten-ID hat (meine mit beginnen, die vielleicht für Nachrichten-ID steht ‚Mitte‘.?):

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

Nach vollständig von der FB Messenger API empfangen wird, erhalten Sie einen Anruf zu Ihrem Webhook (ohne Meldeereignisse) erhalten, den Empfang bestätigt:

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

Ich denke, dass die Lieferung Eingang der beste Weg ist die Lieferung zu gewährleisten, dann die nächste Nachricht.

Beantwortet am 27/05/2016 um 18:56
quelle vom benutzer

stimmen
8

Ich legte einen Fehlerbericht zu Facebook über das , weil ich das gleiche Problem wurde. Sie erkannten , dass es sich tatsächlich um einen Fehler und arbeiten daran , es zu beheben: https://developers.facebook.com/bugs/565416400306038

Beantwortet am 22/06/2016 um 20:57
quelle vom benutzer

stimmen
0

Implementieren Sie die Sendeanforderung als ein Versprechen und nur konsequent, Nachrichten senden, sobald die vorherige behoben

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);
            }
        );    
    });
};
Beantwortet am 10/04/2017 um 12:24
quelle vom benutzer

stimmen
0

Ich habe einen messageId gegen die Anwendung, die bei jedem Start von messagehandling auf 0 zurücksetzt. Dann verzögern ich mit dieser Nummer * 100 ms. So kann ich mit Code als auch vorsätzliche Verzögerungen hinzufügen kann wiemessageDelay += 15

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

nachrichts verlängern:

function sendTextMessage(recipientId, messageText) {
//...
  setTimeout(function() {
    callSendAPI(messageData);
  }, messageDelay++ * 100)    
}
Beantwortet am 17/06/2017 um 00:29
quelle vom benutzer

stimmen
0

Die Nachricht sendet nicht in Ordnung, da wird die Anforderung asynchron an Facebook gesendet und kann in beliebiger Reihenfolge gesendet werden.

Um dies zu lösen , müssen Sie die nächste anrufen , sendTextMessagewenn die Nachricht , die , bevor sie gesendet werden sollen , hat eine Antwort erhalten.

Beantwortet am 17/06/2017 um 06:35
quelle vom benutzer

stimmen
0

Basierend auf der rekursiven Lösung von @ user3884594 vorgeschlagen, ich es irgendwie funktioniert dies mit (entfernte ich den Fehler, um die Handhabung zu vereinfachen):

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);
    });
}
Beantwortet am 21/09/2017 um 04:07
quelle vom benutzer

stimmen
0

Ich hatte genau gleiches Problem, diese Lösung für mich gearbeitet:

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

Das ist meine Frage: Sequential Nachricht Senden mit Facebook senden-API

Beantwortet am 20/01/2018 um 05:07
quelle vom benutzer

stimmen
0

Sie können erreichen , QUEUINGdurch Versprechungen.

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

Beantwortet am 20/12/2019 um 12:27
quelle vom benutzer

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