如何删除Microsoft Teams中仅通知型Bot发送的主动消息?
解决方案:删除Teams通知型Bot的主动消息
核心前提:提前存储关键数据
通知型Bot发送主动消息时不会自动留存对话上下文,所以必须在发送每条通知时记录以下信息,否则后续无法定位并删除消息:
- 每条消息的
Activity ID(调用发送消息接口后,返回结果中会包含该ID) - 对应的
Conversation Reference(包含用户ID、会话ID、服务URL等核心信息,用于重建对话上下文)
可以将这些数据存储到数据库(如SQL、Cosmos DB)或缓存系统中,关联用户ID做统一管理。
具体实现步骤(.NET示例)
1. 发送通知时存储必要数据
发送主动消息后,捕获返回结果中的Activity ID,并将其与Conversation Reference一同保存:
// 假设已构建好conversationReference var response = await turnContext.Adapter.CreateConversationAsync( conversationReference, async (context, token) => { var activity = MessageFactory.Text("这是一条主动通知"); var sendResponse = await context.SendActivityAsync(activity); // 将用户ID、消息Activity ID、对话引用存入数据库 await SaveMessageRecordAsync(conversationReference.User.Id, sendResponse.Id, conversationReference); return Task.CompletedTask; }, cancellationToken);
2. 批量删除所有用户的通知
从数据库中取出所有消息记录,通过保存的Conversation Reference重建对话上下文,再调用删除接口移除消息:
// 获取所有需要删除的消息记录 var messageRecords = await GetAllMessageRecordsAsync(); foreach (var record in messageRecords) { // 用保存的对话引用创建临时上下文 await turnContext.Adapter.ContinueConversationAsync( botAppId, record.ConversationReference, async (context, token) => { // 根据Activity ID删除对应消息 await context.DeleteActivityAsync(record.ActivityId, token); return Task.CompletedTask; }, cancellationToken); // 删除后清理数据库中的对应记录 await DeleteMessageRecordAsync(record.Id); }
注意事项
- 若发送通知时未存储上述数据,后续无法追溯并删除消息,这是实现的核心前提。
- Bot默认拥有自己发送消息的删除权限,无需额外配置,但需确保Bot在对应会话范围内的身份有效。
- 批量删除时建议加入限流或异步批量处理逻辑,避免因频繁调用接口触发Teams平台的限流机制。
内容的提问来源于stack exchange,提问作者santhosh mohan
相关产品推荐
相关产品推荐

