Добавление всплывающей подсказки действия отправителя 'typing_on' перед каждым ответом от чат-бота Wit.ai

Я создал чат-бота на основе потока, используя мессенджер FB, Wit.ai и node.js. Это работает хорошо, но для того, чтобы взаимодействие выглядело более естественным, я хочу, чтобы мой бот ненадолго останавливался и, казалось, печатал каждый из своих ответов.

Я хочу, чтобы всплывающее окно «ввода текста» отображалось на короткое время перед каждым ответом, который отправляет мой бот, в идеале, имея возможность определить время, в течение которого всплывающее окно отображается до отправки ответа. На данный момент есть разделы моего разговора, где бот отправляет последовательные сообщения, и все они отправляются слишком быстро одновременно.

FB Messenger Send API говорит, что либо "сообщение", либо " должно быть установлено свойство sender_action. Я попытался установить оба так:

const fbMessage = (id, text) => {

if(fruits.apples.indexOf(text) >= 0 || fruits.oranges.indexOf(text) >= 0) {

    var body = JSON.stringify({
        recipient: { id },
        "sender_action":"typing_on",
        message: {
            attachment: {
                  "type": "image",
                  "payload": {
                      "url": text
                  }
              }
          },
    });


} else {
    var body = JSON.stringify({
        recipient: { id },
        "sender_action":"typing_on",
        message: { text },
    });
}

const qs = 'access_token=' + encodeURIComponent(FB_PAGE_TOKEN);
return fetch('https://graph.facebook.com/me/messages?' + qs, {
    method: 'POST',
    headers: {'Content-Type': 'application/json'},
    body,
})
.then(rsp => rsp.json())
.then(json => {
    if (json.error && json.error.message) {
    throw new Error(json.error.message);
    }
    return json;
});
};

Но я получаю следующую ошибку:

введите здесь описание изображения

Я не уверен, что мне нужно делать - я предполагаю, что мне нужно настроить какой-то ответ бота "sender_action", который запускается перед каждым диалоговым ответом, но я не знаю, как бы я это сделал.


person wanstan    schedule 07.11.2016    source источник


Ответы (2)


Чтобы отобразить всплывающую подсказку, вы просто отправляете действие отправителя typing_on. Это отображает индикатор ввода до 20 секунд, в течение которых вы отправите фактическое сообщение, которое хотите отправить.

JSON для этого будет:

{
  "recipient":{
    "id":"USER_ID"
  },
  "sender_action":"typing_on"
}

Вызов задокументирован здесь

person Keith Coughtrey    schedule 08.11.2016

У меня все работает, не могу понять, как контролировать время пузырьков, но пока все в порядке. Приведенный ниже код заставит ненадолго отображаться всплывающую подсказку перед каждым ответом моего бота, не искажая ход моего разговора.

Код мессенджера ФБ:

const typingBubble = (id, text) => {

  var body = JSON.stringify({
      recipient: { id },
      "sender_action":"typing_on"
  });

  const qs = 'access_token=' + encodeURIComponent(FB_PAGE_TOKEN);
  return fetch('https://graph.facebook.com/me/messages?' + qs, {
    method: 'POST',
    headers: {'Content-Type': 'application/json'},
    body,
  })
  .then(rsp => rsp.json())
  .then(json => {
    if (json.error && json.error.message) {
      throw new Error(json.error.message);
    }
    return json;
  });
};

const fbMessage = (id, text) => {

  if(scenarioCombos.trends.indexOf(text) >= 0 || scenarioCombos.disruptions.indexOf(text) >= 0) {

    var body = JSON.stringify({
        recipient: { id },
        message: {
            attachment: {
                  "type": "image",
                  "payload": {
                      "url": text
                  }
              }
          },
    });


  } else {
    var body = JSON.stringify({
        recipient: { id },
        message: { text },
    });
  }

  const qs = 'access_token=' + encodeURIComponent(FB_PAGE_TOKEN);
  return fetch('https://graph.facebook.com/me/messages?' + qs, {
    method: 'POST',
    headers: {'Content-Type': 'application/json'},
    body,
  })
  .then(rsp => rsp.json())
  .then(json => {
    if (json.error && json.error.message) {
      throw new Error(json.error.message);
    }
    return json;
  });
};

Wit.ai отправляет код действия (в «действиях»):

send({sessionId}, {text}) {
    const recipientId = sessions[sessionId].fbid;
    if (recipientId) {
      return typingBubble(recipientId, text), fbMessage(recipientId, text)
    .then(() => null)
    .catch((err) => {
        console.error(
        'Oops! An error occurred while forwarding the response to',
        recipientId,
        ':',
        err.stack || err
        );
    });
    } else {
    console.error('Oops! Couldn\'t find user for session:', sessionId);
    return Promise.resolve()
    }
},
person wanstan    schedule 10.11.2016