Envoi de plusieurs messages de réponse sur postback unique Facebook Messenger Bots

voix
1

Je veux envoyer plusieurs réponses pour une publication unique déclenchée par l' utilisateur sur Messenger. J'ai suivi de Messenger documentation développeur et ne pouvait pas vraiment trouver comment faire cela.

Ma structure de code est très similaire aux tutoriels qu'ils ont donnés sur le site, j'ai une « handlePostback fonction » qui identifie le reçu postback et il se compare à un ensemble de charges utiles prédéfinies pour trouver la « réponse objet JSON. Cette réponse est donnée à « callSendAPI » qui met cet objet JSON dans le format de base d'envoyer le message à l'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
}

Ceci étant la structure de base, maintenant je veux envoyer plusieurs messages en réponse à un postback . Je l' ai fait quelques recherches, et j'ai trouvé que la solution pourrait être de créer un message tableau []. Mais comment puis-je faire cela? Parce que ma « réponse » est générée par cette fonction et la structure des messages devrait ressembler à ceci (je pense):

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

J'espère que je pourrais expliquer ma question, s'il vous plaît laissez-moi savoir si je peux fournir plus de détails!

Créé 25/11/2017 à 06:17
source utilisateur
Dans d'autres langues...                            


4 réponses

voix
-1

Ne modifiez pas la callSendAPIfonction. Dans votre handlePostbackappel de fonction à callSendAPIplusieurs reprises.

callsendAPI(sender_psid,response1);
callsendAPI(sender_psid,response2);
Créé 26/11/2017 à 13:01
source utilisateur

voix
1

Bonne question. Si vous n'êtes pas familier avec Node.js la façon de le faire est pas trop évident et ce n'est pas documenté bien sur Envoyer API Documentation Facebook.

Tout d' abord, votre approche d'envoyer plusieurs messages, en utilisant un tableau, comme vous avez pu le constater ne fonctionnera pas. Facebook a une solution pour envoyer jusqu'à 100 appels API avec une demande , mais à mon avis , ce n'est pas nécessaire dans votre situation. Si vous voulez en savoir plus sur le vérifier la lots # Demande de documentation , vous trouverez que la mise en œuvre est différente de la vôtre.

Une solution qui fonctionne est d'appeler le callSendAPIplusieurs fois la fonction. Mais cette solution présente un inconvénient majeur : Vous ne serez pas en mesure de contrôler la séquence réelle des messages envoyés. Par exemple , si vous voulez envoyer deux messages distincts, vous ne pouvez pas garantir qui sera d' abord envoyé à l'utilisateur .

Pour résoudre ce problème , vous devez chaîne vos callSendAPIfonctions d'une manière qui garantit que le prochain callSendAPIappel se produira seulement après que le premier message est déjà envoyé. Vous pouvez le faire en NodeJS en utilisant soit callbacks ou promesses . Si vous n'êtes pas familier avec l' un d'eux, vous pouvez lire ce pour callbacks et ce pour les promesses.

Vous devrez modifier votre callSendAPIfonction et en particulier la partie qui envoie la requête POST à Facebook. Je présenterai une solution à votre problème en utilisant des promesses et le module nœud-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),
  });
}

Créé 26/11/2017 à 14:19
source utilisateur

voix
0

J'ai trouvé le lien ci-dessous utile pour trier la façon de mettre en œuvre des réponses multiples sur monoposte dos.

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

Comme vous l'avez dit, un tableau devrait fonctionner. Créer une variable tableau avec plusieurs messages de réponse

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

Et pousser la variable tableau à votre fonction

function callSendAPI(sender_psid,response) {

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

Enfin pousser le tableau à votre tableau de fonction

body.message.push(multipleResponse.messages);
Créé 24/01/2018 à 22:10
source utilisateur

voix
0

@Christos Panagiotakopoulos. Je ne reçois pas mon mainMenuResponse qui est enchaînée en utilisant ensuite. Au contraire, je reçois trois fois la réponse. fonction 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)
  });

fonction 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);
    }
  });
}
Créé 21/04/2019 à 08:44
source utilisateur

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