Het versturen van meerdere antwoord berichten op enkele postback in Facebook Messenger Bots

stemmen
1

Ik wil meerdere antwoorden te sturen voor een single-user geactiveerd postback op Messenger. Ik volg Messenger documentatie voor ontwikkelaars en kon niet echt vinden hoe dit te doen.

Mijn code structuur is zeer vergelijkbaar met de lessen die ze hebben gegeven op de site, ik heb een ' handlePostback functie', die de ontvangen postback identificeert en vergelijkt het met een set voorgedefinieerde payloads aan de 'vinden response ' JSON object. Dit antwoord wordt gegeven aan ' callSendAPI ', die deze JSON object zet in de basis formaat van het bericht terug te sturen naar de 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
}

Dit gezegd zijnde de basisstructuur, nu wil ik meerdere berichten als antwoord op te sturen een postback . Ik heb een aantal graven, en ik vond dat de oplossing zou kunnen zijn om een bericht [] array te maken. Maar hoe doe ik dat? Omdat mijn 'response' wordt gegenereerd door middel van die functie, en de berichten structuur moet er als volgt uitzien (denk ik):

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

Ik hoop dat ik kon verklaren mijn vraag, laat het me weten als ik meer details kan bieden!

De vraag is gesteld op 25/11/2017 om 06:17
bron van user
In andere talen...                            


4 antwoorden

stemmen
-1

Niet wijzigen callSendAPIfunctie. In je handlePostbackfunctie aan te roepen callSendAPImeerdere keren.

callsendAPI(sender_psid,response1);
callsendAPI(sender_psid,response2);
antwoordde op 26/11/2017 om 13:01
bron van user

stemmen
1

Goede vraag. Als u niet bekend bent met Node.js de manier om het te doen, is niet al te voor de hand liggend en dit is niet goed gedocumenteerd op Facebook Send API Documentatie.

Ten eerste, je aanpak van het verzenden van meerdere berichten, met behulp van een array, zoals je misschien wel eens opgevallen zal niet werken. Facebook heeft een oplossing voor het verzenden van maximaal 100 API Gesprekken met één verzoek, maar naar mijn mening is dit niet nodig is in uw situatie. Als u meer wilt weten over het te proberen het uit te vinden Batched Aanvraag documentatie , kom je erachter dat de uitvoering is anders dan de jouwe.

Een oplossing die zal werken is om het te bellen callSendAPIfunctie meerdere keren. Maar deze oplossing heeft één groot nadeel : U zult niet in staat om de werkelijke volgorde van de verzonden berichten te controleren. Bijvoorbeeld als u twee afzonderlijke berichten te verzenden, kunt u niet garanderen dat voor het eerst zal worden verzonden naar de gebruiker .

Om dit probleem moet je ketting je lossen callSendAPIfunctioneert op een manier die garandeert dat de volgende callSendAPIoproep pas zal gebeuren na het eerste bericht al wordt verzonden. U kunt dit doen in NodeJS door met behulp van callbacks of beloften . Als u niet bekend bent met een van hen, kunt u lezen dit voor callbacks en dit voor beloften.

Je moet je aan te passen callSendAPIfunctie en met name het deel dat de POST-aanvraag naar Facebook stuurt. Ik zal een oplossing voor uw probleem te presenteren met behulp van beloften en de module knooppunt-halen .

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

antwoordde op 26/11/2017 om 14:19
bron van user

stemmen
0

Ik vond de onderstaande link nuttig te sorteren op de manier om meerdere antwoorden op enkele post terug te voeren.

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

Zoals je al zei, moet reeks werken. Een reeksvariabele met meerdere antwoordberichten

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

En druk op de arrayvariabele aan uw functie

function callSendAPI(sender_psid,response) {

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

duwen eindelijk de array aan uw functie matrix

body.message.push(multipleResponse.messages);
antwoordde op 24/01/2018 om 22:10
bron van user

stemmen
0

@Christos Panagiotakopoulos. Ik krijg niet mijn mainMenuResponse die geketend is met behulp van toen. In plaats daarvan, ik ben driemaal krijgen reactie. handlePostback functie =>

// 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 functie =>

// 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);
    }
  });
}
antwoordde op 21/04/2019 om 08:44
bron van user

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