如何让Microsoft Bot Framework机器人获取已加入的Skype群组永久引用?
我帮你梳理下如何实现这个需求——让Bot主动给Skype特定群组推送CI构建通知,核心就是永久保存群组引用对吧?下面是具体的步骤和注意事项:
实现Skype群组主动推送CI通知的方案
1. 捕获并持久化Skype群组的Conversation Reference
当你把机器人加入Skype群组时,Bot确实会收到一条ConversationUpdate活动。你需要在Bot的代码里监听这个活动,提取关键的ConversationReference信息,然后把它存到可靠的存储(比如数据库、Redis)里,这样后续就能随时调用了。
给你贴一段C#的示例代码(基于Bot Framework SDK v4):
protected override async Task OnConversationUpdateActivityAsync(ITurnContext<IConversationUpdateActivity> turnContext, CancellationToken cancellationToken) { // 判断是否是Bot被加入群组的事件 if (turnContext.Activity.MembersAdded != null && turnContext.Activity.MembersAdded.Any(m => m.Id == turnContext.Activity.Recipient.Id)) { // 获取群组的ConversationReference var conversationReference = turnContext.Activity.GetConversationReference(); // 序列化后存入存储服务,这里用JSON举例 var jsonRef = JsonConvert.SerializeObject(conversationReference); // 假设你有个自定义的存储类GroupStorage await GroupStorage.SaveGroupReferenceAsync("Skype-Build-Notification-Group", jsonRef); } await base.OnConversationUpdateActivityAsync(turnContext, cancellationToken); }
划重点:Skype的群组ID是稳定的,只要群组不被删除,这个引用就一直有效,不用频繁更新。
2. 从CI触发Bot主动发送消息
当CI服务器触发构建通知时,你需要调用Bot的API,用之前保存的ConversationReference主动发起对话。这里可以用BotFrameworkAdapter的ContinueConversationAsync方法来实现。
示例代码如下:
// 假设CI通知触发这个方法 public async Task SendBuildAlertToSkype(string buildStatus, string buildDetailUrl) { // 从存储中取出之前保存的群组引用 var jsonRef = await GroupStorage.GetGroupReferenceAsync("Skype-Build-Notification-Group"); var conversationReference = JsonConvert.DeserializeObject<ConversationReference>(jsonRef); // 初始化BotAdapter,要和你Azure Bot Service里的配置一致 var adapter = new BotFrameworkAdapter(new BotFrameworkAuthenticationSettings { MicrosoftAppId = Configuration["MicrosoftAppId"], MicrosoftAppPassword = Configuration["MicrosoftAppPassword"] }); // 主动发送构建通知消息 await adapter.ContinueConversationAsync( Configuration["MicrosoftAppId"], conversationReference, async (turnContext, ct) => { var alertMessage = $"📢 CI构建通知\n状态:{buildStatus}\n详情链接:{buildDetailUrl}"; await turnContext.SendActivityAsync(MessageFactory.Text(alertMessage), ct); }, CancellationToken.None); }
3. 几个关键注意事项
- 权限配置要到位:确保你的Bot已经启用了Skype频道,并且Azure Bot Service里的Microsoft App ID和密码和代码里的配置完全一致,否则会调用失败。
- 存储要可靠:
ConversationReference是Bot主动发消息的唯一凭证,一定要存在不会轻易丢失的地方,要是丢了就得重新把Bot加入群组获取新的引用。 - 注意Skype的限流:Skype对群组Bot的消息发送频率有限制,别短时间内发大量消息,不然可能会被暂时限流。
这样就能实现你要的功能:CI服务器触发后,Bot自动给指定Skype群组推送构建事件通知了。
内容的提问来源于stack exchange,提问作者Maxim V. Pavlov
相关产品推荐
相关产品推荐

