Trimiterea mai multe mesaje de răspuns pe un singur Facebook Messenger postback Bots

voturi
1

Vreau să trimit mai multe răspunsuri pentru un singur utilizator postback declanșat de pe Messenger. Am urmărit Messenger documentație pentru dezvoltatori și nu a putut găsi într - adevăr cum să facă acest lucru.

Structura mea de cod este foarte similar cu tutoriale care le - am dat pe site - ul, am un „ handlePostback funcție“ , care identifică postback a primit și o compară cu un set de sarcini utile predefinite pentru a găsi „ răspuns obiect JSON“. Acest răspuns este dat „ callSendAPI “ , care pune acest obiect JSON în formatul de bază al trimiterea mesajului înapoi la 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
}

Aceasta fiind structura de bază, acum vreau să trimit mai multe mesaje ca răspuns la o postback . Am făcut niște cercetări și am constatat că soluția ar putea fi de a crea un mesaj [] matrice. Dar cum fac acest lucru? Pentru că „răspunsul“ meu este generat prin această funcție, și structura mesajelor ar trebui să arate acest lucru (cred):

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

Sper că am putea explica întrebarea mea, te rog lasă-mă să știu dacă pot oferi mai multe detalii!

Întrebat 25/11/2017 la 06:17
sursa de către utilizator
În alte limbi...                            


4 răspunsuri

voturi
-1

Nu modificați callSendAPIfuncția. În dvs. de handlePostbackapel în funcție de callSendAPImai multe ori.

callsendAPI(sender_psid,response1);
callsendAPI(sender_psid,response2);
Publicat 26/11/2017 la 13:01
sursa de către utilizator

voturi
1

Nisa întrebare. Dacă nu sunteți familiarizați cu Node.js mod de a face acest lucru nu este prea evident și acest lucru nu este documentat bine pe Facebook Trimite API-ul de documentare.

În primul rând, abordarea de a trimite mai multe mesaje, utilizând o matrice, așa cum este posibil să fi observat nu va funcționa. Facebook are o soluție pentru trimiterea de până la 100 de apeluri API cu o singură cerere , dar în opinia mea , acest lucru nu este necesar în situația dumneavoastră. Dacă doriți să aflați mai multe despre el verifica afară Cerere porționare Documentația , veți afla că punerea în aplicare este diferită de a ta.

O soluție care va lucra este de a apela callSendAPIfuncția de mai multe ori. Dar această soluție are un dezavantaj major : Tu nu va fi capabil să controleze secvența reală a mesajelor trimise. De exemplu , dacă doriți să trimiteți două mesaje separate, nu poate garanta care va fi trimis mai întâi la utilizator .

Pentru a rezolva această problemă trebuie să lanțul callSendAPIfuncții într - un mod care să garanteze că următorul callSendAPIapel se va întâmpla numai după ce primul mesaj este deja trimis. Puteți face acest lucru în NodeJS prin utilizarea fie callbacks sau promisiuni . Dacă nu sunteți familiarizați cu oricare dintre ele, puteți citi acest lucru pentru callback și acest lucru pentru promisiuni.

Va trebui să modificați dvs. callSendAPIfuncția și în special partea care trimite cererea POST la Facebook. Voi prezenta o soluție pentru problema dvs. folosind promisiuni și modulul de nod-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),
  });
}

Publicat 26/11/2017 la 14:19
sursa de către utilizator

voturi
0

Am găsit link-ul de mai jos util pentru a sorta modul de a pune în aplicare răspunsuri multiple pe un singur mesaj.

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

Așa cum ai spus, matrice ar trebui să funcționeze. Creați o variabilă array cu mesaje de răspuns multiple

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

Și împinge variabila matrice pentru funcția

function callSendAPI(sender_psid,response) {

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

În cele din urmă împinge matrice pentru a matrice dvs. funcție

body.message.push(multipleResponse.messages);
Publicat 24/01/2018 la 22:10
sursa de către utilizator

voturi
0

@Christos Panagiotakopoulos. Eu nu sunt obtinerea mainMenuResponse meu, care este legat cu lanțuri, folosind apoi. Mai degrabă, eu sunt obtinerea de răspuns de trei ori. Funcția 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)
  });

Funcția 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);
    }
  });
}
Publicat 21/04/2019 la 08:44
sursa de către utilizator

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