【问题标题】:Microsoft Bot Framework send message without having an user talk to the botMicrosoft Bot Framework 无需用户与机器人对话即可发送消息
【发布时间】:2020-01-30 19:59:35
【问题描述】:

我需要使用 Javascript 制作一个机器人每十分钟发送一条消息。我正在使用 Microsoft Bot Framework,这是入口代码:

const restify = require('restify');
const botbuilder = require('botbuilder');

var adapter = new botbuilder.BotFrameworkAdapter({
    appId: process.env.MicrosoftAppId,
    appPassword: process.env.MicrosoftAppPassword
});

let server = restify.createServer();
server.listen(process.env.port || process.env.PORT || 3978, function () {
    console.log(`\n${server.name} listening to ${server.url}`);
    console.log(`\nGet Bot Framework Emulator: https://aka.ms/botframework-emulator`);
});

server.post('/api/messages', (req, res) => {
    adapter.processActivity(req, res, async (turnContext) => {
        if (turnContext.activity.type === 'message') {            
            const text = turnContext.activity.text;
            await turnContext.sendActivity(`You just said: ${ text }`);
        }
    });
});

基本上,无论与机器人交谈的人说什么,它都会以“你刚刚说:x”来回应。

我需要的是 Skype 中的聊天机器人,每十分钟发送一条消息。

但是,在我的示例中,服务器等待对 /api/messages 的 POST,然后它使用适配器处理该请求并从来自 processActivity 方法的 turnContext 中触发“sendActivity”方法。

我怎样才能以固定的时间间隔发送一条消息,而忽略所有消息/提及。

【问题讨论】:

  • 不确定这是否可行,但您是否查看过主动消息?我认为您可以使用此处的方法,但将消息发送到计时器而不是基于通知。 docs.microsoft.com/en-us/azure/bot-service/…
  • 我一直在寻找一种方法来执行此操作,但 Microsoft 文档提供的主动消息示例取决于用户至少与机器人联系一次,以便它可以捕获并存储对话 ID 以供进一步使用相互作用。如果我正确理解了这个问题(这将是我正在寻找的问题)@nick 正在尝试联系用户,而不管之前的交互如何。

标签: javascript botframework bots


【解决方案1】:

您想要做的就是主动消息传递。您可以查看 this documentthe sample it references 以更好地了解如何执行此操作。

如果您希望您的主动消息由计时器触发,那么您可以在机器人的线程上运行计时器,但通常建议让计时器在外部运行。

要为您的机器人禁用消息传递,只需在您的 channel configuration 中选择该选项即可。不过,我不确定如果您禁用消息传递,您将如何检索对话 ID。

如果您仍希望您的机器人接收消息但不想回复它们,只需编辑您的机器人代码中响应条件turnContext.activity.type === 'message' 的部分。

请记住,Skype 机器人功能可能会变得越来越有限。你应该会在你的 Skype 频道配置中看到一条官方消息,上面写着:

自 2019 年 10 月 31 日起,Skype 频道将不再接受新的 Bot 注册。当前的 Skype 机器人将继续不间断地运行。

【讨论】:

  • 谢谢,我使用了主动消息传递,它有效!我将把 GET 放在另一个进程的计时器上。虽然每次我将更改推送到机器人时都会遇到问题,但它会停止服务器重新加载更改,因此我需要再次标记机器人以使其正常工作。我需要在数据库中保留聊天的引用来解决这个问题吗?
  • 是的,机器人不应该在自己的记忆中存储任何需要在回合之间持续存在的东西。传统的机器人状态使用来自传入活动的对话 ID 和/或用户 ID 作为从存储中访问正确数据的密钥,但是您的主动消息传递机器人不会对传入的活动做出反应,因此您需要定义自己的类型使用常量键存储状态。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-10
  • 2020-05-16
  • 2019-04-18
  • 2018-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多