如何创建可主动监控并发送消息的Azure聊天机器人(无需用户触发)
嘿,兄弟,我刚好做过类似的Azure主动推送机器人,给你梳理下核心步骤,应该能帮你搞定!
实现Azure机器人主动推送消息的核心方案
1. 先搞定对话上下文的存储
机器人要主动发消息,必须先和用户建立过至少一次对话——这是前提。因为只有这样,你才能获取到用户的conversation reference(对话引用),这个信息是后续主动推送的关键,得存在数据库或者Azure存储服务里,比如Azure Table Storage或者Cosmos DB。
当用户第一次和机器人对话时,你可以在消息处理逻辑里捕获并保存这个引用:
protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken) { // 提取当前对话的引用信息 var conversationReference = turnContext.Activity.GetConversationReference(); // 把引用存到你的存储服务里,这里用模拟的存储类举例 await _conversationStore.SaveConversationReferenceAsync(conversationReference); // 其他常规对话逻辑... await turnContext.SendActivityAsync("已完成初始化,后续系统异常会主动通知你!"); }
2. 搭建监控+触发推送的服务
你需要一个独立的后台服务来监控系统状态,比如用Azure Function(定时触发)、Web Job,或者自己写的后台程序。当检测到异常时,调用机器人的主动消息接口。
用Azure Function做监控推送的示例:
假设你用定时触发器每5分钟检查一次系统状态,发现异常就推送:
public async Task Run([TimerTrigger("0 */5 * * * *")] TimerInfo myTimer, ILogger log) { // 1. 模拟监控逻辑:检查系统是否出现异常 bool systemHasError = CheckSystemHealthStatus(); if (!systemHasError) return; // 2. 从存储中取出所有需要通知的用户对话引用 var targetConversations = await _conversationStore.GetAllValidReferencesAsync(); // 3. 初始化机器人适配器,用来建立连接 var adapter = new BotFrameworkAdapter(new ConfigurationCredentialProvider(_configuration)); // 4. 遍历用户,逐个发送告警消息 foreach (var reference in targetConversations) { await adapter.ContinueConversationAsync( _configuration["MicrosoftAppId"], reference, async (context, token) => { await context.SendActivityAsync(MessageFactory.Text("⚠️ 系统告警:XX服务数据库连接超时,请尽快排查!"), token); }, CancellationToken.None); } }
3. 配置机器人的权限和访问规则
- 确保监控服务里配置了正确的机器人
MicrosoftAppId和MicrosoftAppPassword,这样适配器才能通过Azure的身份验证。 - 如果机器人部署在Azure App Service,要检查CORS设置,允许监控服务的域名访问(测试阶段可以暂时放开所有域名)。
- 确认机器人的消息端点(比如
/api/messages)没有被防火墙、NSG规则或者App Service的IP限制挡住,要能被外部服务访问。
4. 几个要注意的细节
- 对话引用的有效性:如果用户删除了对话、更换了设备,之前保存的引用可能失效,记得在推送失败时清理这些无效数据,或者定期做校验。
- 推送频率控制:别一股脑狂发消息打扰用户,监控服务里加个防抖或者频率限制逻辑,比如同一异常5分钟内只推一次。
- 多渠道适配:如果你的机器人支持Teams、Web Chat等多渠道,不同渠道的对话引用格式略有差异,存储的时候最好把渠道类型也记录下来。
其实核心就是利用Bot Framework的ContinueConversationAsync方法,结合预先存储的对话引用,实现主动触发消息。之前你没找到方法,可能是没聚焦到「Proactive Messages」这个官方关键词,这就是Azure机器人实现主动推送的标准方案。
内容的提问来源于stack exchange,提问作者D. Manjali
相关产品推荐
相关产品推荐

