Teams 导出 API 允许从 Microsoft Teams 导出一对一、群组聊天、会议聊天和频道消息。 如果你的组织需要导出 Microsoft Teams 消息,则可以使用 Teams 导出 API 将其提取。 对话助手消息表示频道或聊天中的单个聊天消息。 聊天消息可以是根聊天消息,也可以是聊天消息中 replyToId 属性定义的回复线程的一部分。
下面是有关如何使用这些导出 API 的一些示例:
示例 1:如果在组织中启用了 Microsoft Teams,并希望通过传递给定用户或团队的日期范围,以编程方式导出所有 Microsoft Teams 消息到现在为止。
示例 2:如果要通过提供日期范围每天以编程方式导出所有用户或团队消息。 导出 API 可以检索在给定日期范围内创建或更新的所有消息。
示例 3:如果要以编程方式导出给定会议组织者的 Teams 会议录制链接,然后下载实际录制内容。
示例 4:如果要以编程方式导出给定会议组织者的 Teams 会议脚本链接,然后下载实际脚本。
Teams 导出 API 支持哪些内容?
批量导出 Teams 消息: 请参阅 Teams 导出 API 限制。 有了这些限制,你应该能够批量导出 Teams 消息。
Teams 消息的上限: 建议将 Teams 消息 API 的 TOP 筛选器限制设置为 250,作为性能将受到限制的最大限制。
注意
$top值是最大提示值,而不是保证的页面大小。 由于如何从多个基础 Outlook 文件夹/邮箱中提取邮件,响应返回的邮件数可能少于请求的邮件,并包含继续 @odata.nextLink 从其他文件夹检索的邮件。 此行为是设计使然。
应用程序上下文:若要调用 Microsoft Graph,应用必须从 Microsoft 标识平台获取访问令牌。 访问令牌包含有关应用的信息以及它对通过 Microsoft Graph 提供的资源和 API 所具有的权限。 若要获取访问令牌,必须向 Microsoft 标识平台注册应用。 用户或管理员必须授权它访问所需的 Microsoft Graph 资源。 如果已熟悉将应用与 Microsoft 标识平台集成以获取令牌,请参阅后续步骤部分,以了解特定于 Microsoft Graph 的信息和示例。
混合环境: 导出 API 支持在混合环境 (本地 Exchange 和 Teams) 上预配的用户发送的消息。 为混合环境配置的用户发送的任何消息都可使用导出 API 访问。
用户删除的消息: 自删除之日起最多 21 天内,可以使用导出 API 访问用户从 Teams 客户端删除的消息。
邮件附件: 导出 API 包括在邮件中发送的文件的附件信息。 附件可能显示为元数据,在某些情况下,可能显示为链接 (例如,在邮件正文中) ASM URL。 消息的
attachments集合应用于检索附加文件,因为可能无法直接访问正文中嵌入的 URL。反应: 导出 API 支持用户在 Teams 消息上发起的回应。 目前支持的反应是心、愤怒、喜欢、悲伤、惊讶和大笑。 除了回应,导出 API 还支持回应编辑历史记录,其中包括对邮件回应所做的更改和更新。
注意
导出 API 当前不支持使用颜色更改自定义的反应。
共享频道消息: 导出 API 支持从共享频道捕获消息。
已删除的团队: 导出 API 支持 从已删除的团队 以及已删除的标准、专用和共享频道捕获消息,最长为删除之日起 30 天。 30 天后,团队和频道将被硬删除,并且无法检索消息。
已删除用户:导出 API 支持从删除用户起最多 30 天内捕获已删除用户的消息。 若要查找已删除用户的列表,请参阅 已删除邮件。
非活动用户:导出 API 支持从用户变得非活动后 30 天内为非活动用户捕获消息。 若要查找非活动邮箱的列表,请参阅 非活动邮箱。
对话助手消息属性:请参阅 Teams 导出 API 支持的属性的完整列表。
控制消息: 除了用户生成的消息外,导出 API 还支持捕获控制消息。 控制消息是系统生成的消息,显示在 Teams 客户端上。 它们带有重要信息,例如“用户 A,将用户 B 添加到聊天中,并共享了所有聊天历史记录”以及时间戳。 系统消息使调用方能够深入了解团队、频道或聊天中发生的事件。 请参阅导出 API 当前支持的 控制消息列表 。
注意
导出 API 当前不支持与会议相关的控制消息。
编辑历史记录: 如果 租户设置了 Teams 保留策略,导出 API 支持捕获个人和群组聊天的消息编辑历史记录,以及公共频道和共享频道中的帖子和评论。
若要了解有关 Teams 保留策略的详细信息,请参阅 管理 Microsoft Teams 的保留策略 以了解更多详细信息。
会议脚本: 从指定用户作为组织者的计划联机会议实例获取所有脚本。 此 API 目前仅支持私人计划会议。
详细了解如何 导出会议脚本。
会议录制: 从指定用户作为组织者的计划联机会议实例获取所有录制内容。 此 API 目前仅支持私人计划会议。
详细 了解如何导出会议录制内容。
目标消息: 代理或机器人发送给用户的消息即使在 24 小时后从客户端清除后也可以导出。 了解如何 导出定向邮件 以及如何 删除定向邮件。
如何访问 Teams 导出 API
示例 1 是一个简单查询,用于检索用户或团队的所有消息,而不使用任何筛选器:
GET https://graph.microsoft.com/v1.0/users/{id}/chats/getAllMessagesGET https://graph.microsoft.com/v1.0/teams/{id}/channels/getAllMessages示例 2 是一个示例查询,用于通过指定日期时间筛选器和前 50 条消息来检索用户或团队的所有消息:
GET https://graph.microsoft.com/v1.0/users/{id}/chats/getAllMessages?$top=50&$filter=lastModifiedDateTime gt 2020-06-04T18:03:11.591Z and lastModifiedDateTime lt 2020-06-05T21:00:09.413ZGET https://graph.microsoft.com/v1.0/teams/{id}/channels/getAllMessages?$top=50&$filter=lastModifiedDateTime gt 2020-06-04T18:03:11.591Z and lastModifiedDateTime lt 2020-06-05T21:00:09.413Z示例 3 是一个示例查询,用于检索指向用户的所有可用 Teams 会议录制的链接。 支持日期范围筛选。 支持 TOP n 过滤器,类似于对话助手消息:
GET https://graph.microsoft.com/v1.0/users/{id}/onlineMeetings/getAllRecordings?$filter=MeetingOrganizer/User/Id eq ‘{id}’GET https://graph.microsoft.com/v1.0/users/{id}/onlineMeetings/getAllRecordings(meetingOrganizerUserId='{userId}',startDateTime={startDateTime},endDateTime={endDateTime})示例 4 是一个示例查询,用于检索指向用户的所有可用 Teams 会议脚本的链接。 支持日期范围筛选。 支持 TOP n 过滤器,类似于对话助手消息:
GET https://graph.microsoft.com/v1.0/users/{id}/onlineMeetings/getAllTranscripts?$filter=MeetingOrganizer/User/Id eq ‘{id}’GET https://graph.microsoft.com/v1.0/users/{id}/onlineMeetings/getAllTranscripts(meetingOrganizerUserId='{userId}',startDateTime={startDateTime},endDateTime={endDateTime})示例 5 是一个示例链接查询,用于首先获取用户的所有可用转录 Teams 会议,然后检索所有可用的 AI 见解:
GET https://graph.microsoft.com/v1.0/users/{id}/onlineMeetings/getAllTranscripts?$filter=MeetingOrganizer/User/Id eq '{id}'然后,检索上述请求返回的每个
meetingIdAI 见解。GET https://graph.microsoft.com/v1.0/copilot/users/{id}/onlineMeetings/{meetingId}/aiInsights注意
如果有多个结果,API 将返回带有下一页链接的响应。 要获取下一组结果,请从 Url @odata.nextlink调用 GET。 如果不存在或为 null,则 @odata.nextlink 检索所有消息。
注意
响应中的消息顺序不保证按任何日期时间排序,例如 createdDateTime 或 lastModifiedDateTime。
访问 Teams 导出 API 的先决条件
访问敏感数据的 Microsoft Graph 中的 Microsoft Teams API 被视为受保护的 API。 只要满足 无用户访问 的要求,就可以调用这些 API。
应用程序权限由在没有登录用户的情况下运行的应用使用。 只有管理员才能批准应用程序权限。 需要以下权限:
对话助手。Read.All:允许访问所有一对一聊天、群组聊天和会议聊天消息。
ChannelMessage.Read.All:允许访问所有频道消息。
User.Read.All:允许访问租户的用户列表。
OnlineMeetingTranscript.Read.All:允许访问所有 1:n 计划 Teams 会议的脚本。
OnlineMeetingRecording.Read.All:允许访问所有 1:n 计划 Teams 会议的录制内容。
Teams 导出 API 的许可证要求
若要使用 Microsoft Teams 导出 API,组织必须拥有为要导出其数据的用户分配的活动 Microsoft Teams 许可证。
注意
使用 Microsoft Teams 导出 API 不需要 Microsoft Purview 数据丢失防护 (DLP) 服务计划或任何其他 DLP 许可。
导出 API 独立于 Microsoft Purview DLP 功能运行,并可供具有支持通过 Microsoft Graph 导出 API 访问数据的相应 Teams 许可证的租户使用。
| 合作伙伴名称 | 合作伙伴解决方案 |
|---|---|
|
Microsoft Teams 存档和合规性 |
|
Microsoft Teams 的 Proofpoint 内容记录 |
以下合作伙伴已获得认证。 您的公司可以选择与企业内这些合作伙伴的任意组合合作。
| 合作伙伴名称 | 合作伙伴解决方案 |
|---|---|
|
Microsoft Teams 备份和恢复 |
|
Microsoft Teams 备份和恢复 |
后续步骤
如果您是寻求加入认证计划的供应商,请填写 此表单 作为下一步。 如果需要提供更多上下文和详细信息,请向 MS Teams 生态系统团队 (TeamsCategoryPartner@microsoft.com) 发送邮件。
默认) (评估模式
没有模型声明允许访问每个请求应用程序的使用量有限的 API,从而进行评估。
JSON 表示形式
以下示例是聊天资源的 JSON 表示形式:
命名空间:microsoft.graph
{ "id": "string (identifier)", "replyToId": "string (identifier)", "from": {"@odata.type": "microsoft.graph.identitySet"}, "etag": "string", "messageType": "string", "createdDateTime": "string (timestamp)", "lastModifiedDateTime": "string (timestamp)", "deletedDateTime": "string (timestamp)", "subject": "string", "from": { "application": null, "device": null, "conversation": null, "user": { "id": [{"@odata.type": "microsoft.graph.user"}], "displayName": "User Name", "userIdentityType": "aadUser" } }, "body": {"@odata.type": "microsoft.graph.itemBody"}, "summary": "string", "chatId": [{"@odata.type": "microsoft.graph.chat"}] "attachments": [{"@odata.type": "microsoft.graph.chatMessageAttachment"}], "mentions": [{"@odata.type": "microsoft.graph.chatMessageMention"}], "importance": "string", "locale": "string", }注意
有关 chatMessage 资源的详细信息,请参阅 chatMessage 资源类型 一文。
以下示例是录制资源的 JSON 表示形式:
命名空间:microsoft.graph
{ "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#Collection(meetingRecording)", "@odata.count": 2, "@odata.nextLink": "https://graph.microsoft.com/v1.0/users('{userId}')/onlineMeetings/getAllRecordings?$filter=MeetingOrganizer%2fUser%2fId+eq+%27{userId}%27&$skiptoken=MSMjMCMjTkNaYVNIQjVVbXRPYWxaV1dscGFWVGg1V2pOb1IxUXpRWGxrUm1oTFVrWmtTV1ZyYkhwUlZVWm9UMWR3VEdWWGRFTlJWVVpDVVZFOVBRPT0%3d", "value": [ { "@odata.type": "#microsoft.graph.meetingRecording", "id": "6263af16-b660-41d0-a17b-83fbd15a39c7", "meetingId": "MSoxMjczYTAxNi0yMDFkRLTmOTUtODA5My0xYjdmOTliM2VkZWIqMCoqMTk6bWVldGluZ19aR1F3WTJZNE9XTXROekppWlMwME1XWTRMVGc0TWpBdE1BBXdOV1kzWlRsak9UTXlAdGhyZWFkLnYy", "meetingOrganizerId": "{userId}", "createdDateTime": "2022-08-03T20:43:36.2573447Z", "recordingContentUrl": "https://graph.microsoft.com/v1.0/users/{userId}/onlineMeetings/MSoxMjczYTAxNi0yMDFkLTRmOTUtODA4My0xYjdmOTliM2VkZWIqMCoqMTk6bWVldGluZ19aR1F3WTJZNE9XTXROekppWlMwME1XWTRMVGc0TWpBdE1ERXdOV1kzWlRsak9UTXlAdGhyZWFkLnYy/recordings/MSMjMCMjMGFjNmUwZTgtYmZjYy00NDQxLTk2MGYtZjllNjVhNjI0NzBh/content" }, { "@odata.type": "#microsoft.graph.meetingRecording", "id": "{recordingId}", "meetingId": "{meetingId}", "meetingOrganizerId": "{userId}", "createdDateTime": "2022-08-03T20:44:11.2635254Z", "recordingContentUrl": " https://graph.microsoft.com/v1.0/users/{userId}/onlineMeetings/{meetingId}/recordings/{recordingId}/content" }, ] }其中:
<id>表示单个录制。<meetingId>表示会议或呼叫标识符。<meetingOrganizer/user/id>表示会议的组织者。<createdDateTime>指示会议的开始时间。<recordingContentUrl>值指示录制内容的 URL。录制内容为 MP4 格式。
录制内容本身在磁盘上的平均大小约为 350 MB,这是基于我们看到的 30 分钟到 60 分钟范围内的会议的平均值。
不保证结果按 排序。
createdDateTime但是,当单个会议存在多个录制文件时,它们共享相同的meetingId值。 此外,多个录制文件的条目已针对相关会议正确排序。保证只有在关联的会议录制可用后才能显示结果。 换言之,调用方不需要其他轮询可用性。
根据 Teams 导出 API 中的当前模式,支持对结果进行分页。 通过响应中存在
@oData.nextLink属性来支持分页。 nextLink 属性包含一个skipToken值,如下表所示。 如果不存在,skipToken则表示当前批处理中没有更多要检索的结果:请求 响应 @nextLink 备注 /getAllRecordings计数:10 ?skipToken=ABC初始请求,没有 skipToken/getAllRecordings?skipToken=ABC计数:10 ?skipToken=DEFSkipToken返回的请求获取下一页/getAllRecordings?skipToken=DEF计数:7 否 skipToken,没有更多可用数据$top根据 Teams 导出 API 中的当前模式,参数也受支持。DeltaToken支持启用更改跟踪和同步方案。 有关现有增量查询的概述和示例,请参阅使用 增量查询跟踪 Microsoft Graph 数据中的更改。以下 API 可用于获取所选
userId的meetingId实际记录内容,并在recordingIdGETgetAllRecordingsAPI 的响应中获取。 它返回录制的内容:GET users('{userId}')/onlineMeetings('{meetingId}')/recordings('{recordingId}')/content
以下示例是脚本资源的 JSON 表示形式:
命名空间:microsoft.graph
{ "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#Collection(callTranscript)", "@odata.count": 2, "@odata.nextLink": "https://graph.microsoft.com/v1.0/users('{userId}')/onlineMeetings/getAllTranscripts?$filter=MeetingOrganizer%2fUser%2fId+eq+%27{userId}%27&$skiptoken=MSMjMCMjTkNaYVNIQjVVbXRPYWxaV1dscGFWVGg1V2pOb1IxUXpRWGxrUm1oTFVrWmtTV1ZyYkhwUlZVWm9UMWR3VEdWWGRFTlJWVVpDVVZFOVBRPT0%3d", "value": [ { "@odata.type": "#microsoft.graph.callTranscript", "id": "MSMjMCMjMGFjNmUwZTgtYmZjYy00NDQxLTk2MGYtZjllNjVhNjI0NzBh", "meetingId": "MSoxMjczYTAxNi0yMDFkLTRmOTUtODA4My0xYjdmOTliM2VkZWIqMCoqMTk6bWVldGluZ19aR1F3WTJZNE9XTXROekppWlMwME1XWTRMVGc0TWpBdE1ERXdOV1kzWlRsak9UTXlAdGhyZWFkLnYy", "meetingOrganizerId": "{userId}", "transcriptContentUrl": "https://graph.microsoft.com/v1.0/users/{userId}/onlineMeetings/MSoxMjczYTAxNi0yMDFkLTRmOTUtODA4My0xYjdmOTliM2VkZWIqMCoqMTk6bWVldGluZ19aR1F3WTJZNE9XTXROekppWlMwME1XWTRMVGc0TWpBdE1ERXdOV1kzWlRsak9UTXlAdGhyZWFkLnYy/transcripts/MSMjMCMjMGFjNmUwZTgtYmZjYy00NDQxLTk2MGYtZjllNjVhNjI0NzBh/content", "createdDateTime": "2022-08-03T20:43:36.6248355Z" }, { "@odata.type": "#microsoft.graph.callTranscript", "id": "{transcriptId}", "meetingId": "{meetingId}", "meetingOrganizerId": "{userId}", "transcriptContentUrl": "https://graph.microsoft.com/v1.0/users/{userId}/onlineMeetings/{meetingId}/transcripts/{transcriptId}/content", }, ] }其中:
<id>表示单个录制。<meetingId>表示会议或呼叫标识符。<meetingOrganizer/user/id>表示会议的组织者。<createdDateTime>指示会议的开始时间。<transcriptContentUrl>值指示脚本内容的 URL。默认情况下,脚本内容为 VTT 格式。 但是,使用 Accept 标头值
application/vnd.openxmlformats-officedocument.wordprocessingml.document,也可以获取 DOCX 格式。基于 30 分钟到 60 分钟范围内的会议的平均值,JSON/VTT 格式的脚本内容本身的平均大小约为 300 KB。
不保证结果按 排序。
createdDateTime但是,当单个会议存在多个录制文件时,它们共享相同的meetingId值。 此外,多个录制文件的条目已针对相关会议正确排序。保证只有在关联的会议录制可用后才能显示结果。 换言之,调用方不需要其他轮询可用性。
根据 Teams 导出 API 中的当前模式,支持对结果进行分页。 通过响应中存在
@oData.nextLink属性来支持分页。 该nextLink属性包含一个skipToken值,如下表所示。 如果不存在,skipToken则表示当前批处理中没有更多要检索的结果:请求 响应 @nextLink 备注 /getAllTranscripts计数:10 ?skipToken=ABC初始请求,没有 skipToken/getAllTranscripts?skipToken=ABC计数:10 ?skipToken=DEFSkipToken返回的请求获取下一页/getAllTranscripts?skipToken=DEF计数:7 否 skipToken,没有更多可用数据$top根据 Teams 导出 API 中的当前模式,参数也受支持。DeltaToken支持启用更改跟踪和同步方案。 有关现有增量查询的概述和示例,请参阅使用 增量查询跟踪 Microsoft Graph 数据中的更改。以下 API 可用于获取在 GET getAllTranscripts API 的响应中获取的所选 userId、meetingId 和 transcriptId 的实际脚本内容。 它返回录制的内容。
GET users('{userId}')/onlineMeetings('{meetingId}')/transcripts('{transcriptId}')/content
有关详细信息,请参阅 使用 Graph API 提取脚本。
导出 API 筛选器
托管在 Teams Graph 服务上的导出 API 使用 users/{userId}/chats/getAllMessages. 导出 API 检索用户发送和接收的消息,这会导致在聊天线程中为所有用户调用 API 时导出重复消息。
导出 API 具有筛选器参数,可帮助优化为聊天线程返回的消息。 API GET 支持新的筛选器参数,这些参数允许基于发送的用户、机器人、应用程序和系统事件消息提取消息。 filter 参数支持通过以下方式发送的消息:
用户 (同一请求) 中支持多个用户 ID。
应用程序 (机器人、连接器等) 。
除 emailUser 和 unknownFutureValue 外的所有 userIdentityType 。
系统事件消息 (控制消息) 。
这些参数是请求的一部分 $filter。 如果请求中不存在这些参数,则返回来自指定用户聊天中存在的所有用户的消息。
支持的筛选方案如下所示:
$filter=from/application/applicationIdentityType eq '<appType>' (bots/tenantBots/connectors, etc.)
$filter=from/user/id eq '<oid>' (any number of id filters)
$filter=from/user/userIdentityType eq '<userIdentityType>'
$filter=from/application/applicationIdentityType eq '<appType>' or from/user/id eq '<oid>' (sent by app or userid)
$filter=from/application/applicationIdentityType eq '<appType>' or from/user/userIdentityType eq 'anonymousGuest' (sent by app or anonymous)
$filter=from/application/applicationIdentityType eq '<appType>' or from/user/userIdentityType eq 'federatedUser' (sent by app or federated)
$filter=from/application/applicationIdentityType eq '<appType>' or from/user/userIdentityType eq 'anonymousGuest' or from/user/userIdentityType eq 'federatedUser' (sent by app, anonymous or federated)
$filter=from/user/id eq '<oid>' or from/user/userIdentityType eq 'anonymousGuest' (sent by any number of userid or anonymous)
$filter=from/user/id eq '<oid>' or from/user/userIdentityType eq 'federatedUser' (sent by any number of userid or federated)
$filter=from/application/applicationIdentityType eq '<appType>' or from/user/id eq '<oid>' or from/user/userIdentityType eq 'anonymousGuest' or from/user/userIdentityType eq 'federatedUser' (sent by any number of userid or federated or anonymous)
$filter=from/application/applicationIdentityType eq '<appType>' or from/user/id eq '<oid>' or from/user/userIdentityType eq 'anonymousGuest' or from/user/userIdentityType eq 'federatedUser' (sent by any number of userid or federated or anonymous) or messageType eq 'systemEventMessage'
(<any of the previous filters>) and (lastModifiedDateTime+gt+<date>+and+lastModifiedDateTime+lt+<date>)
查询返回指定用户发送的消息(如果存在)。
from/user/id eq ‘{oid}’该查询返回属于用户聊天的联合用户发送的消息(如果存在)。
from/user/userIdentityType eq ‘federatedUser’查询返回由指定的应用程序类型发送的消息(如果存在)。
from/application/applicationIdentityType eq '{appType}'该查询返回系统发送的消息(如果存在)。
messageType eq 'systemEventMessage'
可以使用 OR 运算符或通过与参数组合 lastModifiedDateTime$filter 来组合这些参数。
Teams 导出保留消息的 API
如果 租户设置了 Teams 保留策略,则导出 API 支持从 单个 & 群组聊天以及 公共 & 共享频道中的帖子、评论的保留文件夹中捕获消息。
如何访问保留消息 API
示例 1 是一个简单的查询,用于检索用户的所有保留消息:
GET https://graph.microsoft.com/v1.0/users/8b081ef6-4792-4def-b2c9-c363a1bf41d5/chats/getAllRetainedMessages示例 2 是一个简单的查询,用于检索团队的所有保留消息:
GET https://graph.microsoft.com/v1.0/teams/8b081ef6-4792-4def-b2c9-c363a1bf41d5/channels/getAllRetainedMessages
getAllRetainedMessages API 支持的内容
- 消息被用户在聊天或频道中软删除 如果用户处于保留状态,则超过 21 天的删除期限后,可以通过 API 导出消息。
- 消息被用户在聊天或频道中软删除 如果设置了有效的保留策略,则在 21 天的删除期限之后,可以通过 API 导出邮件。
- 消息由用户在聊天或频道中编辑 如果设置了有效的保留策略,则可以导出邮件的先前编辑版本。
注意
/getAllRetainedMessages API 允许从删除之日起最多 30 天内检索已删除的频道消息。 30 天后,团队和频道将被硬删除,并且无法检索消息。
Microsoft Copilot 交互
了解有关启用导出 Copilot 交互的 aiInteractionHistory: getAllEnterpriseInteractions 的更多信息。