Senden mehrerer Antwortnachrichten auf einzelne Postbacks in Facebook Messenger Bots

stimmen
1

Ich möchte auf Messenger mehrere Antworten für einen einzelnen Benutzer ausgelöste Postbacks senden. Ich verfolge Messenger Entwicklerdokumentation und konnte nicht wirklich finden , wie dies zu tun.

Meine Code - Struktur ist sehr ähnlich zu den Tutorials sie auf der Website gegeben hat, ich habe eine ‚ handlePostback ‘ Funktion , die das empfangene Postbacks identifiziert und vergleicht sie mit einem Satz vordefinierter Nutzlasten das ‚zu finden Antwort ‘ JSON - Objekt. Diese Antwort wird zu ‚gegeben callSendAPI ‘ , die die Nachricht von zurückschicken an die Messenger - API dieses JSON - Objekt in das Basisformat setzt.

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
}

Dies ist die Grundstruktur, jetzt habe ich mehrere Nachrichten als Antwort auf senden möchten ein Postback . Ich habe einige graben, und ich fand , dass die Lösung sein könnte , eine Nachricht [] Array zu erstellen. Aber wie mache ich das? Weil meine ‚Antwort‘ wird durch diese Funktion erzeugt, und die Nachrichten - Struktur sollte wie folgt aussehen (glaube ich):

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

Ich hoffe, ich konnte meine Frage erklären, lassen Sie es mich wissen, wenn ich weitere Informationen zur Verfügung stellen kann!

Veröffentlicht am 25/11/2017 um 06:17
quelle vom benutzer
In anderen Sprachen...                            


4 antworten

stimmen
-1

Nicht ändern callSendAPIFunktion. In Ihrer handlePostbackFunktion aufrufen , callSendAPImehrere Male.

callsendAPI(sender_psid,response1);
callsendAPI(sender_psid,response2);
Beantwortet am 26/11/2017 um 13:01
quelle vom benutzer

stimmen
1

Gute Frage. Wenn Sie nicht vertraut mit Node.js die Art und Weise, es zu tun ist nicht zu offensichtlich und das ist nicht gut dokumentiert, auf Facebook Send API-Dokumentation.

Erstens Ihr Ansatz mehrere Nachrichten zu senden, unter Verwendung eines Arrays, wie Sie beobachtet haben , möglicherweise nicht. Facebook hat eine Lösung für das Senden von bis zu 100 API - Aufrufen mit einer Anfrage aber meiner Meinung nach ist dies nicht in Ihrer Situation erforderlich. Wenn Sie mehr erfahren möchten über den Check - out Batched anfordern Dokumentation , finden Sie heraus , dass die Umsetzung als deine anders.

Eine Lösung , die funktioniert ist die anrufen callSendAPIFunktion mehrmals. Aber diese Lösung hat einen großen Nachteil : Sie werden nicht in der Lage sein , geschickt , um die tatsächliche Reihenfolge der Nachrichten zu steuern. Wenn Sie zum Beispiel zwei getrennte Nachrichten senden möchten, können Sie nicht garantieren , welche zuerst an den Benutzer gesendet werden .

Zur Lösung dieses Problems Sie Ihre zu Kette benötigen callSendAPIFunktionen in einer Weise , die gewährleistet , dass der nächste callSendAPIAnruf nur geschehen wird , nachdem die erste Nachricht bereits gesendet wird. Sie können dies in NodeJS tun entweder Rückrufe oder Versprechungen . Wenn Sie nicht vertraut mit einem von ihnen sind, können Sie lesen dies für Rückrufe und dies für Versprechungen.

Sie müssen Ihre ändern callSendAPIFunktion und vor allem den Teil, der die POST - Anforderung an Facebook sendet. Ich werde eine Lösung für Ihr Problem darstellen , indem Sie verspricht und das Modul Knoten holen .

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

Beantwortet am 26/11/2017 um 14:19
quelle vom benutzer

stimmen
0

Ich fand den untenstehenden Link nützlich, um die Art und Weise zu sortieren, wieder mehrere Antworten auf einzelne Post zu implementieren.

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

Wie Sie gesagt haben, sollten Array arbeiten. Erstellen eine Feldvariable mit mehreren Antwortnachrichten

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

Und drücken Sie die Array-Variable auf Ihre Funktion

function callSendAPI(sender_psid,response) {

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

Schließlich drücken Sie den Array an Ihre Funktion Array

body.message.push(multipleResponse.messages);
Beantwortet am 24/01/2018 um 22:10
quelle vom benutzer

stimmen
0

@Christos Panagiotakopoulos. Ich bin nicht meinen mainMenuResponse bekommen, die dann angekettet verwendet. Vielmehr ich bin immer dreimal Antwort. handlePostback Funktion =>

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

// 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);
    }
  });
}
Beantwortet am 21/04/2019 um 08:44
quelle vom benutzer

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