Facebook Messenger Bot není odesílání zpráv za účelem

hlasů
9

Hraju si s budování jednoduchého Facebook Messenger Chatbot a mám potíže s odesíláním zpráv v pořadí.

zadejte

Ve výše uvedeném příkladu, měl by mít tištěný „Dobrý den!“, „1“, „2“, „3“ v uvedeném pořadí. Jsem v současné době v návaznosti na dokumenty Facebook nalezené zde provádět tuto jednoduchou funkci textových zpráv. Já jsem součástí mého Express Node.js serveru níže uvedený kód:

Definování sendTextMessage()funkce:

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

Používat to, aby odeslat odpověď:

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

Dokonce jsem se snažil se provádí jednoduchou fronty , který fronty zpráv a odesílá pouze jednu zprávu v době po každém requestÚspěch zpětné volání. To je, že mě podezření, že nejsem interakci s API Messenger správně.

Má někdo narazil tento problém vyřešit? Jak mohu získat zprávy odesílat v pořadí? Dík!

UPRAVIT

Vzhledem k tomu, jsem implementoval jednoduchý frontu, ale stále dochází k tomuto problému, jsem včetně kód pro můj jednoduchý systém fronty zde.

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

AKTUALIZACE

Tento „chyba“ byla hlášena na Facebooku, ale to vypadá, že se nebude to opravit . Přečtěte si vlákno vstupenek na tyči Facebooku zde podrobnosti o tom, co říkají, že se děje. (Děkuji Louise k získání služby Facebook pozornost na to)

Položena 11/05/2016 v 02:57
zdroj uživatelem
V jiných jazycích...                            


11 odpovědí

hlasů
-2

Můžete zkusit dávat je uvnitř funkce setTimeout, takže každý, kdo jde po určité časové období.

Takže nahradit takto:

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

S tím:

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)    

A měly by jít jeden po druhém. Dalo by se také vložit funkcí uvnitř sebe, pokud to bude nutné.

Odpovězeno 14/05/2016 v 01:39
zdroj uživatelem

hlasů
0

Namísto přidání statické časové limity, chtěl bych vytvořit datovou strukturu fronty. Když bot chce poslat zprávu, přidat obsah na konec fronty. Na zprávu Odeslat zpětné volání, zkontrolujte, zda existují nějaké zprávy stále ve frontě a volání funkce znovu pomocí rekurze a odstranit z fronty způsobem.

Odpovězeno 14/05/2016 v 01:47
zdroj uživatelem

hlasů
0

Měly by být přijaty v pořadí, v jakém jsou zasílány. Ujistěte se, že jste je ve skutečnosti vysílá v pořádku a není volat funkci asynchronní 4krát (a odeslat objednávku není zaručena). (Četl jsem, že jste to zkouší, ale ve vší mého testování jsem neviděl příjem přijde mimo provoz, pokud byla zaručena příkaz send.)

Odpovězeno 17/05/2016 v 01:13
zdroj uživatelem

hlasů
4

Po odeslání poštou na adresu / Me / zpráv, dostanete odpověď, která má identifikaci zprávy (moje začít s nímž možná stojí za zprávy id ‚střední‘.?):

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

Poté, co byl přijat celý API FB Messenger, dostanete výzvu k vaší webhook (bez událostí zprávy), která potvrdí příjem:

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

Myslím, že o doručení je nejlepší způsob, jak zajistit dodávky, pak poslat další zprávu.

Odpovězeno 27/05/2016 v 18:56
zdroj uživatelem

hlasů
8

Odeslal jsem hlášení o chybě na Facebook o tom, protože jsem měl stejný problém. Uznali, že je to opravdu o chybu a snaží se ji opravit: https://developers.facebook.com/bugs/565416400306038

Odpovězeno 22/06/2016 v 20:57
zdroj uživatelem

hlasů
0

Implementovat požadavek odeslání jako příslib a odeslat pouze následné zprávy, jakmile bude ten předchozí vyřešen

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);
            }
        );    
    });
};
Odpovězeno 10/04/2017 v 12:24
zdroj uživatelem

hlasů
0

Přidal jsem počítadlo MessageID k aplikaci, která resetuje na 0 na každém startu messagehandling. Pak jsem se zdržovat s tímto číslem x 100 ms. Tento způsob, jak mohu přidat úmyslné zpoždění, stejně jako s kódemmessageDelay += 15

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

SendMessage rozšířit:

function sendTextMessage(recipientId, messageText) {
//...
  setTimeout(function() {
    callSendAPI(messageData);
  }, messageDelay++ * 100)    
}
Odpovězeno 17/06/2017 v 00:29
zdroj uživatelem

hlasů
0

Zpráva se neposílají v pořadí, protože je požadavek odeslán asynchronně na facebooku, a mohou být zaslány v libovolném pořadí.

K vyřešení tohoto problému musíte zavolat další sendTextMessagejakmile se objeví hlášení, které by měly být zaslány do něj obdržel odpověď.

Odpovězeno 17/06/2017 v 06:35
zdroj uživatelem

hlasů
0

na rekurzivním řešení navržené @ user3884594 základě I druh, aby to fungovalo pomocí tohoto (I odstranil manipulaci, aby se zjednodušilo chybě):

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);
    });
}
Odpovězeno 21/09/2017 v 04:07
zdroj uživatelem

hlasů
0

Měl jsem přesně stejný problém, že řešení pracoval pro mě:

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

To je moje otázka: Sequential zasílání zpráv přes Facebook send-API

Odpovězeno 20/01/2018 v 05:07
zdroj uživatelem

hlasů
0

Můžete dosáhnout QUEUINGsliby.

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

Odpovězeno 20/12/2019 v 12:27
zdroj uživatelem

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