更新Teams聊天机器人后无法主动发消息的解决方案咨询
问题分析
核心原因是机器人主动发消息依赖用户的会话引用(Conversation Reference),更新部署后,之前存储的会话引用可能失效,或是机器人的身份验证、服务配置出现异常,导致无法直接发起主动对话。
推荐处理方式
1. 重新获取并持久化目标用户的会话引用
如果之前未持久化会话引用,或原有引用已失效,可通过Microsoft Graph API批量创建主动会话并存储有效引用:
- 调用
/users/{user-id}/teamwork/conversations接口创建一对一会话,提取会话引用后存入外部数据库(如Azure Cosmos DB、SQL数据库)。 - Node.js代码示例:
const { Client } = require('@microsoft/microsoft-graph-client'); const { TokenCredentialAuthenticationProvider } = require('@microsoft/microsoft-graph-client/authProviders/azureTokenCredentials'); const { DefaultAzureCredential } = require('@azure/identity'); const credential = new DefaultAzureCredential(); const authProvider = new TokenCredentialAuthenticationProvider(credential, { scopes: ['https://graph.microsoft.com/.default'] }); const graphClient = Client.initWithMiddleware({ authProvider }); // 创建主动会话并存储引用 async function createUserConversation(userId) { const conversation = await graphClient.api(`/users/${userId}/teamwork/conversations`) .post({ chatType: 'oneOnOne', members: [ { '@odata.type': '#microsoft.graph.aadUserConversationMember', roles: ['owner'], user@odata.bind: `https://graph.microsoft.com/v1.0/users('${userId}')` } ] }); const conversationReference = { conversation: { id: conversation.id }, user: { id: userId }, bot: { id: process.env.BOT_ID }, serviceUrl: conversation.serviceUrl, channelId: 'msteams' }; // 替换为你的数据库存储逻辑 await saveConversationReferenceToDB(conversationReference); }
2. 验证机器人服务配置
- 检查Azure Function部署后的服务URL,确保与Azure Bot Service中注册的地址完全一致,若部署后域名/路径变更,需同步更新Bot Service配置。
- 确认环境变量中的
Microsoft App ID和Microsoft App Password配置正确,避免身份验证失败导致主动消息请求被拒绝。
3. 监听安装事件自动获取会话引用
在机器人代码中添加installationUpdate事件监听,当用户或管理员安装机器人时,自动捕获并存储会话引用:
// 机器人消息处理逻辑中添加安装事件监听 adapter.onTurn(async (context) => { if (context.activity.type === 'installationUpdate' && context.activity.action === 'add') { const conversationReference = TurnContext.getConversationReference(context.activity); // 存储会话引用到数据库 await saveConversationReferenceToDB(conversationReference); } });
4. 确认应用权限配置
- 机器人需申请
Chat.Create或Teamwork.Migrate.All等Graph API权限,且需组织管理员完成权限授予,否则无法批量创建主动会话。 - 在Azure AD应用注册后台检查权限状态,确保已获取所需权限的管理员同意。
部署时保留主动发消息能力的注意事项
- 会话引用存储独立于部署包:必须使用外部数据库存储会话引用,禁止存在本地文件或内存中,避免部署更新导致数据丢失。
- 部署前备份会话数据:若使用数据库存储,部署前备份现有会话引用数据,防止部署过程中出现数据异常。
- 自动化批量同步会话引用:部署完成后,运行批量脚本通过Graph API获取所有目标用户的会话引用并存储,快速恢复主动发消息能力。
内容的提问来源于stack exchange,提问作者Michael LeVan
相关产品推荐
相关产品推荐

