Facebook Messenger bot nem küld üzeneteket érdekében

szavazat
9

Én játék körül épület egy egyszerű Facebook Messenger chatbot és Gondjaim üzeneteket ebben a sorrendben.

írja

A fenti példában, akkor kellett volna nyomtatott „Hello!”, „1”, „2”, „3” érdekében. Én jelenleg követő Facebook docs talált itt , hogy végre ezt az egyszerű szöveges üzenet funkciót. Én már bele én Express node.js kiszolgáló alábbi kódot:

Meghatározó sendTextMessage()funkció:

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

Használja, hogy küldjön egy választ:

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

Én is próbáltam végrehajtási egyszerű sorból , hogy sorba üzenetek, és csak küld egy üzenetet egy időben mindegyik után requestsikere visszahívás. Ez így nekem azt gyanítják, hogy én nem használ a Messenger API helyesen.

Van valaki találkozott ezzel a kérdéssel? Hogyan kaphatok üzeneteket küldeni a sorozatot? Kösz!

EDIT

Mert én végre egy egyszerű sorba, de probléma továbbra is fennáll, én többek között a kódot én egyszerű queue rendszer itt.

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

UPDATE

Ez a „bug” számoltak Facebookon de úgy hangzik, mintha nem fogja megjavítani . Kérjük, olvassa el a jegy szál Facebook bejegyzésére itt a részleteket, hogy mit mondanak folyik. (Köszönöm, hogy Louise-szerzés Facebook figyelmét erre)

A kérdést 11/05/2016 02:57
a forrás felhasználó
Más nyelveken...                            


11 válasz

szavazat
-2

Meg lehet próbálni, amivel azokat egy setTimeout függvény így mindegyik után megy egy bizonyos ideig.

Így cserélje ki ezt:

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

Ezzel:

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)    

És kell menni egymás után. Azt is beágyazni a funkciókat belsejében egymást, ha kell.

Válaszolt 14/05/2016 01:39
a forrás felhasználó

szavazat
0

Ahelyett, hogy statikus timeouts, azt hozzon létre egy sorban adatszerkezet. Amikor a bot akar küldeni egy üzenetet, csatolja a tartalmát, hogy a végén a sorban. Az üzenet utáni visszahívás, ellenőrizze, hogy nincs-e üzenet mindig a sorban, és hívja meg a függvényt újra a rekurzió, és távolítsa el a sorból kell.

Válaszolt 14/05/2016 01:47
a forrás felhasználó

szavazat
0

Úgy kell fogadni abban a sorrendben küldik őket. Győződjön meg róla, hogy valóban elküldi őket annak érdekében, és nem hív egy aszinkron funkció 4-szer (és megrendelés elküldése nem garantált). (Azt olvastam, hogy tesztelte, de az én tesztelés még soha nem láttam egy vételi jön ki annak érdekében, hogy a megrendelés elküldése garantált volt.)

Válaszolt 17/05/2016 01:13
a forrás felhasználó

szavazat
4

Miután elküldte a POST / me / üzeneteket, akkor kap választ, hogy van egy üzenet azonosítója (az enyém kezdődnie: „mid.”, Ami talán áll a message id?):

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

Miután teljesen érkezett a FB Messenger API, kapsz egy hívást a webhook (nincs üzenet események), hogy nyugtázza:

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

Úgy vélem, hogy átvételi elismervényt a legjobb módja annak, hogy a szállítás, majd küldje el a következő üzenetet.

Válaszolt 27/05/2016 18:56
a forrás felhasználó

szavazat
8

Én be egy hibajelentést Facebookon erről, mert én volt ugyanaz a probléma. Elismerték, hogy ez valóban egy hiba, és azon dolgoznak, hogy rögzítse: https://developers.facebook.com/bugs/565416400306038

Válaszolt 22/06/2016 20:57
a forrás felhasználó

szavazat
0

Végre kell hajtani a kérelem küldése a Promise, és csak küldeni következtében üzenetek egyszer az előző megoldódott

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);
            }
        );    
    });
};
Válaszolt 10/04/2017 12:24
a forrás felhasználó

szavazat
0

Hozzáadtam egy MessageID ellentétes az alkalmazást, ami visszaállítja 0 minden kezdete messagehandling. Aztán késlekedik azt a számot * 100 ms. Így tudok hozzá szándékos késedelem, valamint a kódot, mintmessageDelay += 15

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

sendmessage kiterjeszteni:

function sendTextMessage(recipientId, messageText) {
//...
  setTimeout(function() {
    callSendAPI(messageData);
  }, messageDelay++ * 100)    
}
Válaszolt 17/06/2017 00:29
a forrás felhasználó

szavazat
0

Az üzenet elküldése nem azért, mert a kérést aszinkron módon, hogy a Facebook, és lehet küldeni bármilyen sorrendben.

Megoldani ezt meg kell hívni a következő sendTextMessage, ha az üzenetet kell küldeni, mielőtt megkapta a választ.

Válaszolt 17/06/2017 06:35
a forrás felhasználó

szavazat
0

Ennek alapján a rekurzív által javasolt megoldás @ user3884594, valahogy ez a munka ezzel a (eltávolítottam a hiba kezelése egyszerűsítése érdekében):

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);
    });
}
Válaszolt 21/09/2017 04:07
a forrás felhasználó

szavazat
0

Volt pontosan ugyanaz a probléma, hogy a megoldás működött nekem:

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

Ez a kérdés: szekvenciális Üzenet küldése a Facebook segítségével Send-API

Válaszolt 20/01/2018 05:07
a forrás felhasználó

szavazat
0

Akkor elérni QUEUINGígéretekkel.

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

Válaszolt 20/12/2019 12:27
a forrás felhasználó

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