如何通过Microsoft Graph订阅Teams机器人的一对一聊天消息通知?
一、关于appCatalogs/teamsApps/{installed-app-id}/installedToChats/getAllMessages订阅无效的问题
目前Beta版的appCatalogs/teamsApps/{installed-app-id}/installedToChats/getAllMessages订阅端点不支持个人上下文的一对一聊天消息。该端点设计目标覆盖机器人被安装到群聊场景的消息,用户与机器人的一对一聊天属于个人上下文会话,不在其覆盖范围内,因此无法通过此订阅接收这类消息。
二、获取所有安装机器人的用户的Chat ID
你提到的GET /beta/appCatalogs/teamsApps/{installed-app-id}/installedToChats目前未正式实现,无法获取相关Chat ID,可通过以下两种方式解决:
1. 实时捕获机器人安装事件
当用户将机器人添加到个人上下文时,Teams会向机器人的webhook地址发送conversationUpdate事件。事件的conversation字段包含对应Chat ID,可在机器人的事件处理逻辑中捕获该ID,用于后续创建消息订阅。
示例事件片段:
{ "type": "conversationUpdate", "conversation": { "id": "19:xxxxxx@unq.gbl.spaces", "conversationType": "personal" }, "membersAdded": [ { "id": "{bot-app-id}" } ] }
2. 批量查询所有包含机器人的聊天
若需回溯已安装机器人的Chat ID,可使用应用权限Chat.Read.All调用以下Graph API,筛选出所有包含机器人成员的聊天:
GET https://graph.microsoft.com/beta/chats?$filter=members/any(m: m/id eq '{bot-app-id}')&$select=id,conversationType
返回结果需通过conversationType字段筛选出personal类型的会话,即一对一聊天。
三、实现一对一聊天消息通知的正确方案
目前MS Graph API无法通过单个全局订阅接收所有机器人所在一对一聊天的消息,需采用逐个聊天订阅的方式,结合实时安装事件或批量查询覆盖所有会话:
步骤1:获取目标Chat ID
通过上述两种方式(实时捕获安装事件或批量查询),获取所有机器人所在的一对一Chat ID。
步骤2:创建单个聊天的消息订阅
针对每个Chat ID,创建chats/{chat-id}/messages的订阅,示例请求如下:
curl -H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' --data-binary '{ "changeType": "created", "notificationUrl": "EventHub:<kv-secret-uri>?tenantId=<tenant-uuid>", "lifecycleNotificationUrl": "EventHub:<kv-secret-uri>?tenantId=<tenant-uuid>", "resource": "chats/<chat-id>/messages", "expirationDateTime":"2023-10-19T12:00:00.000000Z", "clientState": "secretClientValue", }' https://graph.microsoft.com/beta/subscriptions
权限验证
确保应用具备以下权限:
- 应用权限:
ChatMessage.Read.All或Chat.ReadWrite.WhereInstalled(优先使用后者,符合最小权限原则) - 资源特定权限(RSC):
ChatMessage.Read.Chat(已在manifest中配置,需确保在Teams Admin Center完成权限审批)
补充说明
- 订阅的
expirationDateTime最长为3天,需实现自动续期逻辑,避免通知中断。
内容的提问来源于stack exchange,提问作者Bittrance

