Отправка нескольких сообщений ответа на одном постбэка в Facebook Messenger, Боты

голоса
1

Я хочу отправить несколько ответов для одного пользователя запускаемых постбэка на Messenger. Я после Посланника документации разработчика и не мог найти , как это сделать.

Моя структура коды очень похожа на учебники , они дали на сайте, у меня есть « handlePostback функция» , которая идентифицирует принятый постбэк и сравнивает его с набором предопределенных полезных данных , чтобы найти « ответ » объект JSON. Этот ответ дается « callSendAPI » , который ставит этот объект JSON в основной формат отправки сообщения обратно в 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
}

Это является основной структурой, теперь я хочу , чтобы отправить несколько сообщений в ответ на один постбэка . Я сделал некоторые рыть, и я обнаружил , что решение может быть , чтобы создать сообщение [] массив. Но как мне это сделать? Потому что мой «ответ» генерируются с помощью этой функции, и структура сообщения должна выглядеть следующим образом (я думаю):

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

Я надеюсь, что я мог бы объяснить мой вопрос, пожалуйста, дайте мне знать, если я могу предоставить больше информации!

Задан 25/11/2017 в 06:17
источник пользователем
На других языках...                            


4 ответов

голоса
-1

Не изменяйте callSendAPIфункцию. В вашей handlePostbackфункции называют callSendAPIнесколько раз.

callsendAPI(sender_psid,response1);
callsendAPI(sender_psid,response2);
Ответил 26/11/2017 в 13:01
источник пользователем

голоса
1

Хороший вопрос. Если вы не знакомы с Node.js способ сделать это не так уж очевидно, и это не документированы хорошо на Send API документации Facebook.

Во - первых, ваш подход отправки нескольких сообщений, используя массив, как вы могли заметить , не будет работать. Facebook имеет решение для передачи до 100 API вызовов с одного запроса , но на мой взгляд это не требуется в вашей ситуации. Если вы хотите узнать больше об этом проверить порционный Запрос документации , вы узнаете , что реализация отличается от вашего.

Одно решение , которое будет работать, чтобы назвать callSendAPIфункцию несколько раз. Но это решение имеет один существенный недостаток : Вы не будете в состоянии контролировать фактическую последовательность отправленных сообщений. Например , если вы хотите отправить два отдельных сообщений, вы не можете гарантировать , который будет отправлен первым пользователю .

Для решения этой проблемы необходимо приковать свои callSendAPIфункции таким образом , что гарантирует , что следующий callSendAPIвызов будет происходить только после того , как первое сообщение уже отправлено. Вы можете сделать это в NodeJS путем использования либо обратных вызовов или обещаний . Если вы не знакомы ни с одним из них, вы можете прочитать это для обратных вызовов и это обещаний.

Вам нужно модифицировать callSendAPIфункцию и особенно ту часть , которая отправляет запрос POST на Facebook. Я представлю решение вашей проблемы с помощью обещаний и модуль узла выборки .

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

Ответил 26/11/2017 в 14:19
источник пользователем

голоса
0

Я нашел ссылку ниже полезно разобраться в способ реализации нескольких ответов на одно сообщение назад.

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

Как вы сказали, массив должен работать. Создайте переменный массив с несколькими сообщениями ответа

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

И подтолкнуть переменный массив к вашей функции

function callSendAPI(sender_psid,response) {

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

Наконец нажмите массив в массив функции

body.message.push(multipleResponse.messages);
Ответил 24/01/2018 в 22:10
источник пользователем

голоса
0

@Christos Panagiotakopoulos. Я не получаю мой mainMenuResponse, который прикован используя то. Скорее, я получаю ответ трижды. Функция 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)
  });

Функция 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);
    }
  });
}
Ответил 21/04/2019 в 08:44
источник пользователем

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