Facebook Messenger nie bot w celu wysyłania wiadomości

głosy
9

Mam zabawy z budowy prostego Facebook Messenger chatbota i mam problem z wysyłaniem wiadomości w sekwencji.

wprowadzić

W powyższym przykładzie, powinien on drukowany „Hello!”, „1”, „2”, „3” w porządku. Obecnie jestem po facebooku Dokumenty znalezione tutaj , aby wdrożyć tę prostą funkcję SMS. Podaję mój ekspresowe node.js kod serwera poniżej:

Definiowanie sendTextMessage()funkcji:

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

Używanie go wysłać odpowiedź:

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

Próbowałem nawet wykonawczych prostą kolejkę że kolejki wiadomości i wysyła tylko jedną wiadomość na raz po każdym request„s sukces zwrotnego. To czyni mnie podejrzewać, że nie jestem interakcji z API Messenger poprawnie.

Czy ktoś napotkał ten problem? Jak mogę uzyskać wiadomości do wysłania w sekwencji? Dzięki!

EDYTOWAĆ

Bo realizowane prostą kolejkę, ale nadal występuje ten problem, jestem w tym kod dla mojego prostego systemu kolejek tutaj.

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

AKTUALIZACJA

Ten „błąd” został zgłoszony do Facebooka, ale wygląda na to, że nie będzie go naprawić . Proszę przeczytać wątek biletów na facebooku poście tutaj Szczegółowe informacje na temat tego, co mówią, jest w toku. (Dziękuję Louise uzyskania uwagę Facebooka na ten temat)

Utwórz 11/05/2016 o 02:57
źródło użytkownik
W innych językach...                            


11 odpowiedzi

głosy
-2

Można spróbować umieścić je wewnątrz funkcji setTimeout tak każdy jedzie po pewnym okresie czasu.

Więc zastąpić w ten sposób:

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

Z tym:

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)    

I powinny one iść jeden za drugim. Można również umieścić funkcje wewnątrz siebie, jeśli zajdzie taka potrzeba.

Odpowiedział 14/05/2016 o 01:39
źródło użytkownik

głosy
0

Zamiast dodawać timeoutów statyczne, chciałbym stworzyć struktury danych kolejki. Gdy bot chce wysłać wiadomość, dołącz zawartość na końcu kolejki. Na wiadomość Dodaj zwrotnego, sprawdź czy są jeszcze jakieś wiadomości w kolejce i wywołać funkcję ponownie za pomocą rekurencji i usunąć z kolejki odpowiednio.

Odpowiedział 14/05/2016 o 01:47
źródło użytkownik

głosy
0

Powinny one być odbierane w kolejności, w jakiej zostały wysłane. Upewnij się, że faktycznie wysyłając je w porządku i nie dzwoni funkcję ASYNC 4 razy (i wysłać zamówienie nie jest gwarantowana). (Czytałem, że testowałem to jednak we wszystkich moich testów nigdy nie widziałem otrzymać wyjdzie porządku jeśli zamówienie wyślij była gwarantowana).

Odpowiedział 17/05/2016 o 01:13
źródło użytkownik

głosy
4

Po wysłaniu posta do / Me / komunikatów, otrzymasz odpowiedź, która ma identyfikator wiadomości (kopalnia zacząć który może stoi za wiadomości id „połowy”.):

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

Po całkowicie odebrany przez API FB Messenger dostaniesz wezwanie do swojej webhook (bez zdarzeń komunikatów), który potwierdza otrzymanie:

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

Myślę, że pokwitowanie dostawy jest najlepszym sposobem, aby zapewnić dostawę, a następnie wysłać kolejną wiadomość.

Odpowiedział 27/05/2016 o 18:56
źródło użytkownik

głosy
8

Złożyłem raport o błędzie na Facebooku o tym, bo miałem ten sam problem. Uznali, że to rzeczywiście jest to błąd i pracujemy, aby je naprawić: https://developers.facebook.com/bugs/565416400306038

Odpowiedział 22/06/2016 o 20:57
źródło użytkownik

głosy
0

Wdrożenie wniosek wysłać jako obietnica i tylko wysyłać wiadomości konsekwentnych raz poprzedni został rozwiązany

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);
            }
        );    
    });
};
Odpowiedział 10/04/2017 o 12:24
źródło użytkownik

głosy
0

Dodałem licznik komunikatu do aplikacji, która resetuje do 0 na każdym początku messagehandling. Potem opóźnić z tym numerem * 100 ms. W ten sposób mogę dodać zamierzone opóźnień oraz z kodem jakmessageDelay += 15

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

sendMessage przedłużyć:

function sendTextMessage(recipientId, messageText) {
//...
  setTimeout(function() {
    callSendAPI(messageData);
  }, messageDelay++ * 100)    
}
Odpowiedział 17/06/2017 o 00:29
źródło użytkownik

głosy
0

Wiadomość nie wysyła w porządku, ponieważ wniosek jest wysyłany asynchronicznie na Facebooku, i mogą być wysyłane w dowolnej kolejności.

Aby rozwiązać ten problem trzeba zadzwonić następnego sendTextMessagegdy komunikat, który powinien być wysłany przed nim otrzymał odpowiedzi.

Odpowiedział 17/06/2017 o 06:35
źródło użytkownik

głosy
0

Opierając się na rekurencyjnym rozwiązania zaproponowanego przez @ user3884594, I niby to działało za pomocą tego (usunąłem błąd obsługi w celu uproszczenia):

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);
    });
}
Odpowiedział 21/09/2017 o 04:07
źródło użytkownik

głosy
0

Miałem dokładnie ten sam problem, że rozwiązanie pracował dla mnie:

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 jest moje pytanie: Sequential Wysyłanie wiadomości przez Facebooka send-API

Odpowiedział 20/01/2018 o 05:07
źródło użytkownik

głosy
0

Można to osiągnąć QUEUINGprzez obietnice.

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

Odpowiedział 20/12/2019 o 12:27
źródło użytkownik

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