Wysyłanie wielu wiadomości odpowiedź na pojedynczych odświeżenie strony w Facebook Messenger boty

głosy
1

Chcę wysłać wiele odpowiedzi dla pojedynczego użytkownika odświeżenie wyzwalane na Messenger. Śledzę Messenger w dokumentacji dla programistów i nie można naprawdę znaleźć jak to zrobić.

Moja struktura kodu jest bardzo podobny do tutoriali oni podanych na stronie, mam „ handlePostback funkcji”, który identyfikuje odbierany odświeżenie i porównuje go do zestawu predefiniowanych ładowności do znalezienia „ reakcji ” obiekt JSON. Ta odpowiedź jest podana na „ callSendAPI ”, która stawia ten obiekt JSON w podstawowym formatem wysyłania wiadomości z powrotem do 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
}

To jest podstawowa struktura, teraz chcę, aby wysłać wiele wiadomości jako odpowiedź na jedno odświeżenie strony . I tak niektóre kopania, i okazało się, że rozwiązanie może być utworzenie wiadomości [] tablicy. Ale jak to zrobić? Ponieważ moja „odpowiedź” jest generowany za pośrednictwem tej funkcji, a struktura wiadomości powinien wyglądać tak (chyba):

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

Mam nadzieję, że mogę wyjaśnić moje pytanie, proszę dać mi znać, jeśli mogę podać więcej szczegółów!

Utwórz 25/11/2017 o 06:17
źródło użytkownik
W innych językach...                            


4 odpowiedzi

głosy
-1

Nie należy modyfikować callSendAPIfunkcję. W swojej handlePostbackfunkcji wywołać callSendAPIwiele razy.

callsendAPI(sender_psid,response1);
callsendAPI(sender_psid,response2);
Odpowiedział 26/11/2017 o 13:01
źródło użytkownik

głosy
1

Fajne pytanie. Jeśli nie są zaznajomieni z node.js sposób to zrobić nie jest zbyt oczywiste, a to nie jest dobrze udokumentowane na Facebook'u Wyślij Dokumentacja API.

Po pierwsze, twoje podejście do wysyłania wielu wiadomości, za pomocą tablicy, jak można zaobserwować już nie zadziała. Facebook ma rozwiązanie do wysyłania do 100 wywołań API z jednym wniosku, ale moim zdaniem to nie jest potrzebne w danej sytuacji. Jeśli chcesz dowiedzieć się więcej na ten temat: sprawdzeniu batched wymagać dokumentacji , dowiesz się, że realizacja jest inna niż Twoja.

Jednym z rozwiązań, które będą pracować jest wywołanie callSendAPIfunkcję wielokrotnie. Ale to rozwiązanie ma jedną poważną wadę : nie będzie w stanie kontrolować rzeczywistą kolejność komunikatów wysyłanych. Na przykład, jeśli chcesz wysłać dwie oddzielne wiadomości, nie można zagwarantować, która zostanie pierwszy wysyłane do użytkownika .

Aby rozwiązać ten problem, czego potrzeba do łańcucha swoje callSendAPIfunkcje w sposób, który gwarantuje, że następne callSendAPIwywołanie nastąpi dopiero pierwsza wiadomość została już wysłana. Można to zrobić w NodeJS przez korzystając albo zwrotnych ani obietnic . Jeśli nie są zaznajomieni z jednym z nich, można przeczytać to do wywołania zwrotne i to na obietnicach.

Musisz zmodyfikować swoją callSendAPIfunkcję, a zwłaszcza część, która wysyła żądanie POST na Facebooku. Będę przedstawić rozwiązanie problemu za pomocą obietnic i moduł node-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),
  });
}

Odpowiedział 26/11/2017 o 14:19
źródło użytkownik

głosy
0

Znalazłem link poniżej warto uporządkować drogę do realizacji wielu odpowiedzi na pojedynczym stanowisku powrotem.

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

Tak jak powiedziałeś, tablica powinna działać. Utwórz zmienną tablicową z wielu wiadomości odpowiedzi

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

I przesunąć zmienną tablicową do funkcji

function callSendAPI(sender_psid,response) {

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

Na koniec wcisnąć macierz do macierzy funkcji

body.message.push(multipleResponse.messages);
Odpowiedział 24/01/2018 o 22:10
źródło użytkownik

głosy
0

@Christos Panagiotakopoulos. Nie otrzymuję moje mainMenuResponse który jest przykuty używając wtedy. Raczej otrzymuję odpowiedź trzykrotnie. Funkcja 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)
  });

Funkcja 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);
    }
  });
}
Odpowiedział 21/04/2019 o 08:44
źródło użytkownik

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