Facebook Messenger δεν bot αποστολή μηνυμάτων για

ψήφοι
9

Παίζω γύρω με τη δημιουργία ενός απλού chatbot Facebook Messenger και είμαι έχοντας προβλήματα με την αποστολή μηνυμάτων στη σειρά.

εισάγετε

Στο παραπάνω παράδειγμα, θα πρέπει να εκτυπωθεί «Hello!», «1», «2», «3» με τη σειρά. Είμαι σήμερα ακολουθώντας τα έγγραφα του Facebook βρίσκονται εδώ για να εφαρμόσει αυτό το απλό λειτουργία μηνυμάτων κειμένου. Έχω συμπεριληφθεί μου κώδικα διακομιστή Express 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 εδώ για λεπτομέρειες σχετικά με το τι λένε συμβαίνει. (Σας ευχαριστώ για την Louise για να πάρει την προσοχή του 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

Αντί της προσθήκης στατική χρονικά όρια, θα δημιουργήσει μια δομή δεδομένων ουράς. Όταν το bot θέλει να στείλει ένα μήνυμα, προσθέστε τα περιεχόμενα στο τέλος της ουράς. Στο μήνυμα μετά την επιστροφή κλήσης, ελέγξτε αν υπάρχουν οποιαδήποτε μηνύματα ακόμα στην ουρά και να καλέσει τη λειτουργία ξανά χρησιμοποιώντας αναδρομή και αφαιρέστε από την ουρά αναλόγως.

Απαντήθηκε 14/05/2016 στις 01:47
πηγή χρήστη

ψήφοι
0

Θα πρέπει να λαμβάνονται με τη σειρά που έχουν σταλεί. Βεβαιωθείτε ότι είστε πράγματι την αποστολή τους στην τάξη και όχι καλώντας μια λειτουργία ασύγχρονη 4 φορές (και αποστολή της παραγγελίας δεν είναι εγγυημένη). (Διάβασα ότι έχετε δοκιμάσει, αλλά σε όλες τις δοκιμές μου ποτέ δεν έχω δει να λαμβάνετε έρχονται εκτός λειτουργίας αν εξασφαλίστηκε η εντολή αποστολής.)

Απαντήθηκε 17/05/2016 στις 01:13
πηγή χρήστη

ψήφοι
4

Αφού σας στείλουμε ένα POST σε / με / μηνύματα, θα λάβετε μια απάντηση που έχει ένα αναγνωριστικό μηνύματος (η δική μου ξεκινήσουμε με το οποίο σημαίνει ίσως για το μήνυμα id «μέσα.»;):

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

Αφού έλαβε πλήρως από την ΑΡΙ FB Messenger, θα έχετε μια κλήση σε webhook σας (χωρίς τα γεγονότα του μηνύματος), η οποία επιβεβαιώνει την παραλαβή:

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

Νομίζω ότι η απόδειξη παράδοσης είναι ο καλύτερος τρόπος για να εξασφαλίσει την παράδοση, τότε στείλτε το επόμενο μήνυμα.

Απαντήθηκε 27/05/2016 στις 18:56
πηγή χρήστη

ψήφοι
8

Υπέβαλα μια αναφορά σφάλματος στο Facebook σχετικά με αυτό, επειδή είχα το ίδιο πρόβλημα. Αναγνώρισαν ότι είναι πράγματι ένα bug και εργαζόμαστε για να το διορθώσετε: 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 ms. Με αυτό τον τρόπο μπορώ να προσθέσω εκ προθέσεως καθυστερήσεις, καθώς και με τον κωδικό όπως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);

Αυτή είναι η ερώτησή μου: Διαδοχική Μήνυμα Αποστολή Χρησιμοποιώντας 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