Facebook Коммуникатор не ЪоТ отправки сообщений в порядке

голоса
9

Я играл с созданием простой Facebook Messenger Chatbot и у меня возникают проблемы с отправкой сообщений в последовательности.

введите

В приведенном выше примере, он должен быть напечатан «Hello!», «1», «2», «3» в порядке. Я в настоящее время следуя документацию Facebook найденной здесь , чтобы реализовать эту простую функцию текстового сообщения. Я включил мой код сервера Экспресс Node.js ниже:

Определение sendTextMessage()функции:

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

С его помощью, чтобы отправить ответ:

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

Я даже пытался реализации простой очереди , что очередей сообщений и посылает только одно сообщение в то время , после каждого requestобратного вызова успеха «s. Это заставляет меня подозревать , что я не взаимодействующий с API Messenger , правильно.

Кто-нибудь сталкивался с такой вопрос? Как я могу получить сообщения для отправки в последовательности? Благодаря!

РЕДАКТИРОВАТЬ

Потому что я реализовал простой очереди, но по-прежнему сталкиваются с этой проблемой, я в том числе код для моей простой системы очередей здесь.

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

ОБНОВИТЬ

Эта «ошибка» , как сообщается , Facebook , но это звучит как они не собираются , чтобы исправить это . Пожалуйста , прочитайте нить билет на пост Facebook, здесь для получения подробной информации о том , что они говорят , что происходит. (Спасибо Луизы для привлечения внимания Facebook на это)

Задан 11/05/2016 в 02:57
источник пользователем
На других языках...                            


11 ответов

голоса
-2

Вы можете попробовать положить их внутри функции SetTimeout так каждый идет по истечении определенного периода времени.

Так заменить это:

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

С этим:

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)    

И они должны идти друг за другом. Кроме того, можно встраивать функции внутри друг друга, если это будет необходимо.

Ответил 14/05/2016 в 01:39
источник пользователем

голоса
0

Вместо добавления статических таймаутов, я хотел бы создать структуру данных очереди. Когда бот хочет, чтобы отправить сообщение, добавить содержимое в конец очереди. На сообщение после обратного вызова, проверьте, есть ли какие-либо сообщения по-прежнему в очереди и повторный вызов функции с использованием рекурсии и удалить из очереди соответственно.

Ответил 14/05/2016 в 01:47
источник пользователем

голоса
0

Они должны быть получены в порядке их отправки. Убедитесь, что вы на самом деле отправки их в порядок и не вызывая функцию ASync 4 раза (и отправить заказ не гарантируется). (Я читал, что вы испытали его, но во всех моих тестах я никогда не видел, получить выйти из строя, если порядок отправки гарантируется.)

Ответил 17/05/2016 в 01:13
источник пользователем

голоса
4

После отправки POST к / мне / сообщениям, вы получите ответ, который имеет идентификатор сообщения (мои начать, с которым, возможно, означает сообщение с идентификатором 'середины.):

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

После того, как полностью принят API FB Посланника, вы получите вызов к вашему webhook (без каких-либо событий, сообщений), что подтверждает получение:

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

Я думаю, что получение доставки лучший способ обеспечить доставку, а затем отправить следующее сообщение.

Ответил 27/05/2016 в 18:56
источник пользователем

голоса
8

Я представил отчет об ошибке в Facebook об этом , потому что у меня была такая же проблема. Они признали , что это действительно ошибка и работают , чтобы исправить это: https://developers.facebook.com/bugs/565416400306038

Ответил 22/06/2016 в 20:57
источник пользователем

голоса
0

Реализовать запрос посыла как обещание и только послать последующие сообщения после того, как предыдущий разрешен

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);
            }
        );    
    });
};
Ответил 10/04/2017 в 12:24
источник пользователем

голоса
0

Я добавил MessageId счетчик на приложение, которое сбрасывает в 0 при каждом запуске messagehandling. Тогда я оттянуть с этим номером * 100 мс. Таким образом, я могу добавить умышленные задержки, а также с помощью следующего кодаmessageDelay += 15

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

SendMessage удлиняет:

function sendTextMessage(recipientId, messageText) {
//...
  setTimeout(function() {
    callSendAPI(messageData);
  }, messageDelay++ * 100)    
}
Ответил 17/06/2017 в 00:29
источник пользователем

голоса
0

Сообщение не посылает в порядке, потому что, запрос отправляется асинхронно Facebook, и могут быть отправлены в любом порядке.

Чтобы решить эту проблему , вы должны позвонить в следующий sendTextMessageмомент , когда сообщение , которое должно быть отправлено до него получил ответ.

Ответил 17/06/2017 в 06:35
источник пользователем

голоса
0

На основе рекурсивного решения, предложенный @ user3884594, я как бы сделать его работу с помощью этого (я удалил обработки ошибок в целях упрощения):

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);
    });
}
Ответил 21/09/2017 в 04:07
источник пользователем

голоса
0

У меня была точно такая же проблема, что решение работает для меня:

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

Вот мой вопрос: Sequential Отправка сообщения с помощью Facebook Отправить-API

Ответил 20/01/2018 в 05:07
источник пользователем

голоса
0

Вы можете достичь QUEUINGобещаний.

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

Ответил 20/12/2019 в 12:27
источник пользователем

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