我正在实现一个Facebook Messenger Chatbot,并且在其中一个对话流程中,该机器人应该发送6条消息,一个又一个。
我希望将这些消息延迟1秒,然后在它们之间显示一个发件人操作,以使对话感觉自然(与一次转储6条消息相比,这迫使用户向上滚动以阅读)全部)。
我尝试了2种不同的Webhook实现,但是它们都不起作用。一个在 Python / Flask 中:在每条消息之间,我放了time.sleep(delay)
,但没有用。另一个在 Javascript / NodeJS 中:在每条消息之间,我都输入了setTimeout(function() {sendMessage(recipient_id);}, delay)
,但它也没有用。两种版本都能完美运行,而不会延迟。
有人可以帮忙吗?
答案 0 :(得分:1)
您可以使用下面的代码,它等待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);
答案 1 :(得分:0)
您可以在此类情况下使用settimeout。但是,对于显示sender_action而言,如果您想从Messenger中显示来自机器人的typing...
之类的文字,那么facebook在其Messenger API中提供了功能,以包括具有不同标签的发送者动作。这就是我的做法。
sender_action: 'typing...',
messaging_type: 'MESSAGE_TAG',
tag: 'NON_PROMOTIONAL_SUBSCRIPTION',
请查看以下链接以获取更多信息。 https://developers.facebook.com/docs/messenger-platform/send-messages/sender-actions
答案 2 :(得分:0)
在提出问题时提供更多代码会更好。我怀疑您实际上是这样做的:
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)
答案 3 :(得分:-1)
您可以检出wingbot库here on the github。它有助于构建一个简单的机器人。像这样:
const { Router } = require('wingbot');
const bot = new Router();
bot.use('start', (req, res) => {
res.typingOn()
.wait(1000)
.text('Hello');
});