Отправка сообщений с задержкой - PullRequest
0 голосов
/ 09 ноября 2018

Я внедряю чат-мессенджер Facebook Messenger, и в одном из потоков разговоров бот должен отправлять 6 сообщений, одно за другим.

Я бы хотел, чтобы эти сообщения задерживались на 1 секунду, и между ними показывалось действие отправителя, чтобы разговор был естественным (вместо того, чтобы сбросить сразу 6 сообщений, что заставляет пользователя прокручивать вверх, чтобы прочитать их все).

Я пробовал 2 разных реализации webhook, но ни одна из них не работает. Один был в Python / Flask : между каждым сообщением я вставил time.sleep(delay), но это не сработало. Другой был в Javascript / NodeJS : между каждым сообщением я помещал setTimeout(function() {sendMessage(recipient_id);}, delay), но это также не работало. Обе версии отлично работают без задержки.

Может кто-нибудь помочь?

Ответы [ 4 ]

0 голосов
/ 20 января 2019

Вы можете использовать приведенный ниже код, он ждет 1 секунду, а затем отвечает обратно, используя async / await.

const messages = ["first", "second", "third", "forth", "fifth", "sixth"];

const sleep = delay => {
  return new Promise(function(resolve) {
    setTimeout(resolve, delay);
  });
};

const displayMessage = async messages => {
  for (let message of messages) {
    await sleep(1 * 1000);
    console.log(message);
  }
};

displayMessage(messages);
0 голосов
/ 12 ноября 2018

Было бы лучше, если бы вы задали больше кода, задавая вопрос. У меня есть подозрение, что вы на самом деле делаете это:

setTimeout(function() {sendMessage(recipient_id);}, delay)
setTimeout(function() {sendMessage(recipient_id);}, delay)
setTimeout(function() {sendMessage(recipient_id);}, delay)
setTimeout(function() {sendMessage(recipient_id);}, delay)
setTimeout(function() {sendMessage(recipient_id);}, delay)
setTimeout(function() {sendMessage(recipient_id);}, delay)

setTimeout является асинхронным, это означает, что ваш код будет ждать 1 секунду, а затем отправлять 6 сообщений подряд. Вы, вероятно, ищете что-то вроде этого:

await setTimeout(function() {sendMessage(recipient_id);}, delay)
await setTimeout(function() {sendMessage(recipient_id);}, delay)
await setTimeout(function() {sendMessage(recipient_id);}, delay)
await setTimeout(function() {sendMessage(recipient_id);}, delay)
await setTimeout(function() {sendMessage(recipient_id);}, delay)
await setTimeout(function() {sendMessage(recipient_id);}, delay)
0 голосов
/ 16 ноября 2018

Вы можете проверить библиотеку wingbot здесь, на github . Помогает в создании простого бота. Как это:

const { Router } = require('wingbot');

const bot = new Router();

bot.use('start', (req, res) => {
   res.typingOn()
      .wait(1000)
      .text('Hello');
});
0 голосов
/ 11 ноября 2018

Вы можете использовать settimeout для таких сценариев. Но для показа sender_action, скажем, если вы хотите показать текст типа typing... из бота внутри мессенджера, тогда в своем мессенджере Facebook предоставляет функциональные возможности для включения действий отправителя с различными тегами. Вот как я это делаю.

sender_action: 'typing...',
messaging_type: 'MESSAGE_TAG',
tag: 'NON_PROMOTIONAL_SUBSCRIPTION',

Пожалуйста, перейдите по следующей ссылке для получения дополнительной информации. https://developers.facebook.com/docs/messenger-platform/send-messages/sender-actions

...