Facebook Messenger no Bot envío de mensajes con el fin

votos
9

Estoy jugando con la construcción de un simple conversacional Facebook Messenger y estoy teniendo problemas para enviar mensajes en secuencia.

introducir

En el ejemplo anterior, se debe tener impreso ¡Hola!, 1, 2, 3 en orden. Actualmente estoy siguiendo la documentación de Facebook se encuentran aquí para implementar esta función de mensajes de texto simple. He incluido mi código Server Express Node.JS a continuación:

La definición de la sendTextMessage()función:

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

Usarlo para enviar una respuesta:

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

Incluso he intentado implementar una cola sencilla que pone en cola los mensajes y sólo envía un mensaje a la vez después de cada request's de devolución de llamada de éxito. Esto me hace sospechar que no estoy interactuando con la API de Messenger correctamente.

Alguien ha encontrado este problema? ¿Cómo puedo obtener mensajes para enviar en la secuencia? ¡Gracias!

EDITAR

Debido a que he implementado una cola simple pero sigue experimentando este problema, estoy incluyendo el código de mi sistema simple cola de aquí.

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

ACTUALIZAR

Este error se informó a Facebook pero suena como que no van a solucionarlo . Por favor, lea el hilo de entradas en el post de Facebook aquí para más detalles sobre lo que dicen que está pasando. (¡Gracias a Louise para conseguir la atención de Facebook en esto)

Publicado el 10/05/2016 a las 23:57
fuente por usuario
En otros idiomas...                            


11 respuestas

votos
-2

Usted puede tratar de ponerlos dentro de una función setTimeout por lo que cada uno va después de un cierto período de tiempo.

Así sustituir este:

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

Con este:

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)    

Y deben ir uno tras otro. También podría incrustar las funciones dentro de la otra si es necesario.

Respondida el 13/05/2016 a las 22:39
fuente por usuario

votos
0

En lugar de añadir los tiempos de espera estáticas, me gustaría crear una estructura de datos de la cola. Cuando el robot quiere enviar un mensaje, añadir el contenido al final de la cola. En el mensaje de envío de devolución de llamada, compruebe si hay algún mensaje todavía en la cola y llamar a la función de nuevo utilizando la recursividad y eliminar de la cola en consecuencia.

Respondida el 13/05/2016 a las 22:47
fuente por usuario

votos
0

Deben ser recibidos en el orden en que se envían. Asegúrese de que en realidad se está enviando en orden y no llamar a una función asíncrona 4 veces (y enviar el fin no está garantizada). (He leído que lo probó pero en todos mis pruebas nunca he visto un recibimos vienen fuera de orden si la orden de envío estaba garantizada.)

Respondida el 16/05/2016 a las 22:13
fuente por usuario

votos
4

Después de enviar un POST a / me / mensajes, recibirá una respuesta que tiene un mensaje de Identificación (mina de empezar con lo que tal vez es sinónimo de mensaje ID 'mid.'?):

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

Después de ser recibido por completo por la API FB Messenger, que obtendrá una llamada a su web hook (sin eventos de aviso) que confirma la recepción:

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

Creo que recibo de entrega es la mejor manera de asegurar la entrega, a continuación, enviar el siguiente mensaje.

Respondida el 27/05/2016 a las 15:56
fuente por usuario

votos
8

Presenté un informe de error a Facebook sobre esto porque yo estaba teniendo el mismo problema. Reconocieron que es de hecho un error y están trabajando para solucionarlo: https://developers.facebook.com/bugs/565416400306038

Respondida el 22/06/2016 a las 17:57
fuente por usuario

votos
0

Implementar la solicitud de envío como una promesa y sólo enviar mensajes consiguientes vez que el anterior se resuelve

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);
            }
        );    
    });
};
Respondida el 10/04/2017 a las 09:24
fuente por usuario

votos
0

He añadido un contador de messageId a la aplicación que restablece en 0 en cada inicio de messagehandling. Entonces me retraso con ese número * 100 ms. De esta manera puedo añadir retrasos intencionales, así como con el código demessageDelay += 15

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

sendMessage extienden:

function sendTextMessage(recipientId, messageText) {
//...
  setTimeout(function() {
    callSendAPI(messageData);
  }, messageDelay++ * 100)    
}
Respondida el 16/06/2017 a las 21:29
fuente por usuario

votos
0

El mensaje no está enviando el fin porque, la solicitud se envía de forma asíncrona a facebook, y puede enviarse en cualquier orden.

Para solucionar esto tiene que llamar al siguiente sendTextMessagecuando el mensaje que debe ser enviado antes de que haya recibido una respuesta.

Respondida el 17/06/2017 a las 03:35
fuente por usuario

votos
0

Sobre la base de la solución recursiva propuesto por @ user3884594, que tipo de hacer que funcione el uso de este (Quité el manejo con el fin de simplificar el error):

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);
    });
}
Respondida el 21/09/2017 a las 01:07
fuente por usuario

votos
0

Tenía exactamente el mismo problema, que la solución que funcionó para 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);

Esa es mi pregunta: Envío de mensajes secuenciales usando Facebook Enviar-API

Respondida el 20/01/2018 a las 02:07
fuente por usuario

votos
0

Se puede lograr QUEUINGmediante promesas.

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

Respondida el 20/12/2019 a las 12:27
fuente por usuario

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