Sende flere svarmeldinger på én postback på Facebook Messenger Bots

stemmer
1

Jeg ønsker å sende flere svar for en enkelt bruker-utløst postback på Messenger. Jeg har fulgt Messenger sin utviklerdokumentasjon og kunne egentlig ikke finne ut hvordan du gjør dette.

Min kodestruktur er svært lik den opplæring de har gitt på nettstedet, jeg har en ' handlePostback ' funksjon som identifiserer den mottatte tilbakesending og sammenligner den med et sett av forhåndsdefinerte nyttelaster for å finne den ' svar ' JSON objekt. Dette svaret er gitt til ' callSendAPI ' som setter dette JSON objekt i den grunnleggende format for å sende meldingen tilbake til Messenger API.

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
}

Dette blir den grunnleggende struktur, nå vil jeg sende flere meldinger som svar på en postback . Jeg gjorde noen graving, og jeg fant ut at løsningen kan være å opprette en melding [] array. Men hvordan gjør jeg dette? Fordi min 'svar' blir generert gjennom den funksjonen, og meldinger strukturen skal se slik ut (tror jeg):

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

Jeg håper jeg kan forklare mitt spørsmål, vennligst gi meg beskjed hvis jeg kan gi flere detaljer!

Publisert på 25/11/2017 klokken 06:17
kilden bruker
På andre språk...                            


4 svar

stemmer
-2

Ikke endre callSendAPIfunksjon. I handlePostbackfunksjon ringe callSendAPIflere ganger.

callsendAPI(sender_psid,response1);
callsendAPI(sender_psid,response2);
Svarte 26/11/2017 kl. 13:01
kilden bruker

stemmer
5

Nice spørsmålet. Hvis du ikke er kjent med node.js måten å gjøre det er ikke så opplagt, og dette er ikke dokumentert godt på Facebook Send API dokumentasjon.

For det første, din tilnærming til å sende flere meldinger, ved hjelp av en matrise, som du kanskje har observert vil ikke fungere. Facebook har en løsning for å sende opptil 100 API samtaler med en forespørsel, men etter min mening ikke er nødvendig i din situasjon. Hvis du ønsker å finne ut mer om det sjekk ut dosert be om dokumentasjon , vil du finne ut at implementeringen er annerledes enn din.

En løsning som vil fungere er å ringe callSendAPIfunksjon flere ganger. Men denne løsningen har én stor ulempe : Du vil ikke være i stand til å styre selve sekvensen av meldingene som er sendt. For eksempel hvis du ønsker å sende to separate meldinger, kan du ikke garantere noe som vil bli sendt først til brukeren .

For å løse dette problemet må du kjede dine callSendAPIfungerer på en måte som sikrer at den neste callSendAPIsamtalen vil skje først etter at den første meldingen er allerede sendt. Du kan gjøre dette i NodeJS ved hjelp av enten tilbakeanrop eller løfter . Hvis du ikke er kjent med noen av dem, kan du lese dette for tilbakekall og dette for løfter.

Du må endre callSendAPIfunksjon og spesielt den delen som sender POST-forespørsel til Facebook. Jeg vil presentere en løsning på problemet ved å bruke lover og modulen node-hente .

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

Svarte 26/11/2017 kl. 14:19
kilden bruker

stemmer
0

Jeg fant linken nedenfor nyttig å sortere ut måten å implementere flere svar på ett innlegg tilbake.

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

Som du sa, bør rekke fungere. Lag en matrise variabel med flere svarmeldinger

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

Og skyv rekke variable til funksjon

function callSendAPI(sender_psid,response) {

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

Endelig presse matrisen til funksjonen matrise

body.message.push(multipleResponse.messages);
Svarte 24/01/2018 kl. 22:10
kilden bruker

stemmer
0

@Christos Panagiotakopoulos. Jeg får ikke min mainMenuResponse som er lenket hjelp da. Snarere jeg får respons tre ganger. handlePostback funksjon =>

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

callSendAPI funksjon =>

// 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);
    }
  });
}
Svarte 21/04/2019 kl. 08:44
kilden bruker

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