Facebook Messenger sırayla mesaj gönderme değil Bot

oy
9

Basit bir Facebook Messenger chatbot bina etrafında oynuyorum ve sorun sırayla mesaj gönderme yaşıyorum.

Burada

Yukarıdaki örnekte, sırayla Hello!, 1, 2, 3 basılmış olması gerekirdi. Şu anda bulunan Facebook docs takip ediyorum burada bu basit metin mesajı işlevi uygulamak için. Aşağıda benim Ekspres node.js sunucu kodu yer verdik:

Tanımlanması sendTextMessage()fonksiyonunu:

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

Bir yanıt göndermek için kullanma:

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

Hatta basit bir kuyruk uygulanması denenmiş iletileri sıralar ve sadece her sonra bir defada bir mesaj gönderir requestbaşarısı callback'inde. Bu bana doğru Messenger API ile etkileşim değilim şüpheli yapıyor.

Herkes bu sorunu karşılaştı? Nasıl mesajlar sırayla göndermeye alabilirim? Teşekkürler!

DÜZENLE

Ben basit bir kuyruk etmediniz, ancak burada benim basit kuyruk sistemi için kodu dahil ediyorum, bu sorun yaşıyor çünkü.

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

GÜNCELLEŞTİRME

Bu böcek Facebook'a bildirildi ancak gibi geliyor düzeltmek için gidiş değildir . Facebook'un yayında bilet iplik okuyunuz burada onlar oluyor demek dair ayrıntılı bilgi için. (Bu konuda Facebook'un dikkatini çekmenin için Louise teşekkür ederiz)

Oluştur 11/05/2016 saat 02:57
kaynak kullanıcı
Diğer dillerde...                            


11 cevaplar

oy
-2

Her biri belli bir süre sonra gider böylece bir setTimeout işlevi içinde koyarak deneyebilirsiniz.

Yani bu değiştirin:

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

Bununla:

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)    

Ve birbiri ardına gitmek gerekir. Eğer gerekirse de birbirinin içine fonksiyonları yerleştirebilir.

Cevap 14/05/2016 saat 01:39
kaynak kullanıcı

oy
0

Bunun yerine statik zaman aşımları ekleme, bir kuyruk veri yapısını oluşturacak. bot mesaj göndermek istediğinde, sıranın sonuna içeriğini ekleyin. mesajı sonrası geri çağırma, kuyruktaki hala herhangi bir mesaj olup olmadığını kontrol edin ve çağrı işlevini tekrar özyineleme kullanarak ve buna göre kuyruğundan kaldırın.

Cevap 14/05/2016 saat 01:47
kaynak kullanıcı

oy
0

Onlar gönderildikleri sırayla ulaşmalıdır. aslında sırayla göndererek değil, bir zaman uyumsuz fonksiyonu 4 kez aradığını emin olun (ve siparişi gönderin garanti edilmez). (Ben bunu test okumak ama bütün testlerde ben bir gönderme sipariş garanti olsaydı düzenin çıkıp almak görmedim.)

Cevap 17/05/2016 saat 01:13
kaynak kullanıcı

oy
4

Bana / / iletilere POST gönderdikten sonra bir mesaj kimliği olan bir yanıt alacaksınız (mayın ile başlayan belki mesaj kimliği açılımı 'mid.'?):

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

Tamamen FB Messenger API tarafından alındıktan sonra, makbuz onaylar (hiçbir mesaj olaylar ile) webhook için bir çağrı alırsınız:

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

Ben teslimat makbuzu sonra, teslim edilmesini sağlamak sonraki mesaj göndermek için en iyi yol olduğunu düşünüyorum.

Cevap 27/05/2016 saat 18:56
kaynak kullanıcı

oy
8

Ben de aynı sorunu vardı çünkü bu konuda Facebook'a bir hata raporu sundu. Onlar gerçekten bir hata olduğunu kabul etti ve bunu düzeltmek için çalışıyoruz: https://developers.facebook.com/bugs/565416400306038

Cevap 22/06/2016 saat 20:57
kaynak kullanıcı

oy
0

Bir Promise'in olarak gönderme isteği uygulanması ve önceki bir çözüldüğü zaman sadece bunun sonucunda mesajlar göndermek

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);
            }
        );    
    });
};
Cevap 10/04/2017 saat 12:24
kaynak kullanıcı

oy
0

Ben messagehandling her başlangıcında üzerinde 0'a sıfırlar uygulamaya bir MessageID sayacı eklendi. Sonra bu sayı * 100 ms ile geciktirir. Ben gibi koduyla yanı kasıtlı gecikmeler ekleyebilir Bu şekildemessageDelay += 15

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

sendMessage uzatmak:

function sendTextMessage(recipientId, messageText) {
//...
  setTimeout(function() {
    callSendAPI(messageData);
  }, messageDelay++ * 100)    
}
Cevap 17/06/2017 saat 00:29
kaynak kullanıcı

oy
0

mesajı isteği Facebook'a uyumsuz gönderilir, çünkü sırayla göndermiyor ve herhangi bir sırada gönderilebilir.

Bunu çözmek için bir sonraki aramak zorunda sendTextMessageondan önce gönderilmesi gereken mesaj bir yanıt aldığında.

Cevap 17/06/2017 saat 06:35
kaynak kullanıcı

oy
0

@ User3884594 önerdiği özyinelemeli dayanan bir çözüm, bir şekilde (ı basitleştirmek için taşıma hata kaldırıldı) Bu kullanılarak çalışması:

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);
    });
}
Cevap 21/09/2017 saat 04:07
kaynak kullanıcı

oy
0

Ben çözüm benim için çalıştı, tam olarak aynı sorun vardı:

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

Bu benim sorum: Sıralı Mesaj Facebook Send-API kullanarak gönderme

Cevap 20/01/2018 saat 05:07
kaynak kullanıcı

oy
0

Sen elde edebilirsiniz QUEUINGsözlerle.

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

Cevap 20/12/2019 saat 12:27
kaynak kullanıcı

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