Inviare più messaggi di risposta su un singolo postback a Facebook Messenger Bots

voti
1

Voglio inviare risposte multiple per un singolo postback user-triggered su Messenger. Ho seguito del Messaggero documentazione per gli sviluppatori e non poteva davvero trovare come fare questo.

La mia struttura del codice è molto simile ai tutorial che ho dato sul sito, ho un ' handlePostback funzione' che identifica il postback ricevuto e lo confronta con una serie di payload predefiniti per trovare la ' risposta oggetto JSON'. Questa risposta è dato a ' callSendAPI ' che mette l'oggetto JSON nel formato di base di invio del messaggio al API Messenger.

function handlePostback(sender_psid,receivedPostback)
{ if(payload== 'defined_payload') {
  response = {
  text: 'Some text'
  };
callSendAPI(sender_psid,response);
}

function callSendAPI(sender_psid,response) {
let body = {
recipient: {
id= sender_psid
},
message: response
};
// Followed by code for POST request to the webhook
}

Questa essendo la struttura di base, ora voglio inviare più messaggi come risposta ad un postback . Ho fatto qualche ricerca e ho trovato che la soluzione potrebbe essere quella di creare un array messaggio []. Ma come faccio a fare questo? Perché la mia 'risposta' viene generato attraverso quella funzione, e la struttura dei messaggi dovrebbe essere simile a questo (credo):

let body = {
 recipient: {
 id=sender_psid
 },
 messages: [ {
  response1
  },
  {
  response2
  }
 ]
};

Spero di poter spiegare la mia domanda, per favore fatemi sapere se posso fornire ulteriori dettagli!

È pubblicato 25/11/2017 alle 06:17
fonte dall'utente
In altre lingue...                            


4 risposte

voti
-1

Non modificare callSendAPIla funzione. Nella vostra handlePostbackfunzione di chiamare callSendAPIpiù volte.

callsendAPI(sender_psid,response1);
callsendAPI(sender_psid,response2);
Risposto il 26/11/2017 a 13:01
fonte dall'utente

voti
1

Nizza domanda. Se non si ha familiarità con Node.js il modo per farlo non è troppo evidente e questo non è documentato bene su Facebook Invia documentazione API.

In primo luogo, il vostro approccio di invio di messaggi multipli, utilizzando una matrice, come si può avere osservato non funzionerà. Facebook ha una soluzione per l'invio di fino a 100 chiamate API con una richiesta, ma a mio parere questo non è necessario nella vostra situazione. Se volete saperne di più su di esso controlla la a batch richiedere documentazione , scoprirete che l'implementazione è diversa dalla vostra.

Una soluzione che funziona è quello di chiamare la callSendAPIfunzione di più volte. Ma questa soluzione ha un grave inconveniente : Non sarà in grado di controllare l'effettiva sequenza dei messaggi inviati. Per esempio, se si desidera inviare due messaggi separati, non è possibile garantire che sarà inviato prima per l'utente .

Per risolvere questo problema è necessario catena vostre callSendAPIfunzioni in modo da garantire che la prossima callSendAPIchiamata avverrà solo dopo il primo messaggio viene già spedito. È possibile farlo in NodeJS da utilizzando sia callback o promesse . Se non si ha familiarità con uno di loro, è possibile leggere questo per callback e questo per le promesse.

Sarà necessario modificare la callSendAPIfunzione ed in particolare la parte che invia la richiesta POST a Facebook. Presenterò una soluzione al tuo problema utilizzando promesse e il modulo node-fetch .

const fetch = require('node-fetch');

function handlePostback(sender_psid,receivedPostback){ 
  if (payload == 'defined_payload') {
    response = {
      text: 'Some text'
    };
    response2 = //... Another response
    response3 = //... Another response
  callSendAPI(sender_psid,response).then(() => {
    return callSendAPI(sender_psid, response2).then(() => {
      return callSendAPI(sender_psid, response3); // You can add as many calls as you want
      });
   });
  }
}

function callSendAPI(sender_psid,response) {
  let body = {
    recipient: {
      id= sender_psid
    },
    message: response
  };
  const qs = 'access_token=' + encodeURIComponent(FB_PAGE_TOKEN); // Here you'll need to add your PAGE TOKEN from Facebook
  return fetch('https://graph.facebook.com/me/messages?' + qs, {
    method: 'POST',
    headers: {'Content-Type': 'application/json'},
    body: JSON.stringify(body),
  });
}

Risposto il 26/11/2017 a 14:19
fonte dall'utente

voti
0

Ho trovato sul link qui sotto utile per risolvere il modo di implementare le risposte multiple su singolo palo.

https://codingislove.com/build-facebook-chat-bot-javascript/

Come hai detto tu, un array dovrebbe funzionare. Creare una variabile di array con più messaggi di risposta

var multipleResponse = {
   messages: [{
      response1
   },
   {
      response2
   }]
};

E spingere la variabile di matrice alla funzione

function callSendAPI(sender_psid,response) {

    let body = {
         recipient: {
            id= sender_psid
         },
         message: []
    };
    // Followed by code for POST request to the webhook
}

Infine spingere l'array per l'array funzione

body.message.push(multipleResponse.messages);
Risposto il 24/01/2018 a 22:10
fonte dall'utente

voti
0

@Christos Panagiotakopoulos. Non ricevo la mia mainMenuResponse che viene incatenato utilizza poi. Piuttosto, sto ottenendo risposta tre volte. Funzione handlePostback =>

// Handles messaging_postbacks events
function handlePostback(sender_psid, received_postback) {
  let response;

  // Get the payload for the postback
  let payload = received_postback.payload;

  // Set the response based on the postback payload
  if (payload === 'fashionTip') {
    response = { "text": getFashionTip() } // calls a function which gives a fashion-tip

  // Send the message to acknowledge the postback
  callSendAPI(sender_psid, response).then(() => {
    return callSendAPI(sender_psid, mainMenuResponse)
  });

Funzione callSendAPI =>

// Sends response messages via the Send API
function callSendAPI(sender_psid, response) {
  // construct the message body
  let request_body = {
    "recipient": {
      "id": sender_psid
    },
    "message": response
  }

  // Send the HTTP request to the messenger platform
  request({
    "uri": "https://graph.facebook.com/v2.6/me/messages",
    "qs": {"access_token": PAGE_ACCESS_TOKEN},
    "method": "POST",
    "json": request_body
  }, (err, res, body) => {
    if (!err) {
      console.log("Message sent!");
    } else {
      console.error("Unable to send mesage:" + err);
    }
  });
}
Risposto il 21/04/2019 a 08:44
fonte dall'utente

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