Экспорт содержимого с помощью API экспорта Microsoft Teams
Api экспорта Teams позволяют экспортировать сообщения 1:1, группового чата, чатов собраний и сообщений каналов из Microsoft Teams. Если вашей организации необходимо экспортировать сообщения Microsoft Teams, их можно извлечь с помощью API экспорта Teams. Сообщение чата представляет отдельное сообщение чата в канале или чате. Сообщение чата может быть корневым сообщением чата или частью потока ответа, определенного свойством replyToId в сообщении чата.
Ниже приведены некоторые примеры использования этих API-интерфейсов экспорта.
Пример 1. Если вы включили Microsoft Teams в своей организации и хотите экспортировать все сообщения Microsoft Teams на дату программным путем, передав диапазон дат для конкретного пользователя или команды.
Пример 2. Если вы хотите программно экспортировать все сообщения пользователей или команды ежедневно, указав диапазон дат. API-интерфейсы экспорта могут извлекать все сообщения, созданные или обновленные в течение заданного диапазона дат.
Пример 3. Если вы хотите программно экспортировать ссылки на записи собраний Teams для данного организатора собрания, а затем скачать фактические записи.
Пример 4. Если вы хотите программно экспортировать ссылки на расшифровки собраний Teams для данного организатора собрания, а затем скачать фактические расшифровки.
Что поддерживается API экспорта Teams?
Массовый экспорт сообщений Teams: API экспорта Teams поддерживают до 200 запросов в секунду на приложение на клиента и 600 запросов в секунду для приложения. Эти ограничения позволяют выполнять массовый экспорт сообщений Teams.
Контекст приложения. Чтобы вызвать Microsoft Graph, приложение должно получить маркер доступа из платформа удостоверений Майкрософт. Маркер доступа содержит сведения о вашем приложении и разрешениях, которые у него есть для ресурсов и API, доступных через Microsoft Graph. Чтобы получить маркер доступа, приложение должно быть зарегистрировано в платформа удостоверений Майкрософт и авторизовано пользователем или администратором для доступа к нужным ресурсам Microsoft Graph.
Если вы уже знакомы с интеграцией приложения с платформа удостоверений Майкрософт для получения маркеров, ознакомьтесь с разделом Дальнейшие действия для получения сведений и примеров, относящихся к Microsoft Graph.
Гибридная среда: Api экспорта поддерживают сообщения, отправленные пользователями, подготовленными в гибридной среде (локальные exchange и Teams). Все сообщения, отправляемые пользователями, настроенными для гибридной среды, доступны с помощью API экспорта.
Сообщения, удаленные пользователем: Доступ к сообщениям, удаленным пользователями из клиента Teams, можно получить с помощью API экспорта в течение 21 дня с момента удаления.
Вложения сообщений: API-интерфейсы экспорта включают ссылки на вложения, отправляемые в составе сообщений. С помощью API экспорта можно получить файлы, вложенные в сообщения.
Реакции: API-интерфейсы экспорта поддерживают реакции, инициированные пользователем на сообщение Teams. Реакции в настоящее время поддерживаются сердце, сердитые, как, грустно, удивлены, и смеются. Помимо реакций, API экспорта также поддерживает журнал редактирования реакций, который включает изменения и обновления, внесенные в реакцию на сообщение.
Сообщения общего канала: API-интерфейсы экспорта поддерживают запись сообщений из общего канала.
Удаленные команды: API экспорта поддерживает запись сообщений из удаленных Teams и удаленных стандартных, частных и общих каналов.
Удаленные пользователи. API экспорта поддерживает запись сообщений для удаленных пользователей на срок до 30 дней с момента удаления пользователя. Чтобы найти список удаленных пользователей, см. раздел Удаленные элементы.
Свойства сообщения чата: Полный список свойств, поддерживаемых API экспорта Teams.
Управляющие сообщения: API экспорта поддерживает сбор контрольных сообщений в дополнение к созданным пользователем сообщениям. Контрольные сообщения — это системные сообщения, которые отображаются в клиенте Teams и содержат важную информацию, например "Пользователь А добавил пользователя B в чат и предоставил общий доступ ко всему журналу чата" вместе с меткой времени. Системные сообщения позволяют вызывающей организации получать аналитические сведения о событиях, произошедших в команде, канале или чате. См. список сообщений элемента управления , которые в настоящее время поддерживает API экспорта.
Примечание.
Сообщения элементов управления, связанные с собранием, в настоящее время не поддерживаются API экспорта.
Измененный журнал: При условии, что клиент настроен с политикой хранения Teams, API экспорта поддерживает запись измененного журнала сообщений для отдельных & группового чата, а также записей, комментариев в общедоступных & общих каналах.
Дополнительные сведения о политике хранения Teams см. в статье Управление политиками хранения для Microsoft Teams .
Что не поддерживается API экспорта Teams?
- Взаимодействие с Teams Copilot & Microsoft 365 Chat: API экспорта не поддерживает сообщения взаимодействия пользователей в Copilot и сообщения чата Microsoft 365, отправленные ботом.
Как получить доступ к API экспорта Teams
Пример 1 — это простой запрос для получения всех сообщений пользователя или команды без фильтров:
GET https://graph.microsoft.com/v1.0/users/{id}/chats/getAllMessages
GET 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.413Z
GET 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})
Примечание.
API возвращает ответ со ссылкой на следующую страницу в случае нескольких результатов. Чтобы получить следующий набор результатов, просто вызовите GET по URL-адресу из @odata.nextlink. Если @odata.nextlink значение отсутствует или значение NULL, извлекаются все сообщения.
Примечание.
Порядок сообщений в ответе не гарантируется для сортировки по дате и времени, например createdDateTime или lastModifiedDateTime.
Предварительные требования для доступа к API экспорта Teams
API Microsoft Teams в Microsoft Graph, которые обращаются к конфиденциальным данным, считаются защищенными API. Эти API можно вызывать при условии, что выполнены требования для доступа без пользователя .
Разрешения приложений используются приложениями, которые выполняются без вошедшего пользователя; Разрешения приложения могут быть утверждены только администратором. Требуются следующие разрешения:
Chat.Read.All: предоставляет доступ ко всем сообщениям чата 1:1, группового чата и чата собраний.
ChannelMessage.Read.All: обеспечивает доступ ко всем сообщениям канала
User.Read.All: разрешает доступ к списку пользователей для клиента.
OnlineMeetingTranscript.Read.All: обеспечивает доступ к расшифровкам для всех запланированных собраний Teams 1:n
OnlineMeetingRecording.Read.All: обеспечивает доступ к записям для всех запланированных собраний Teams 1:n.
Требования к лицензиям для API экспорта Teams
API экспорта поддерживает сценарии безопасности и соответствия (S+C) и общего использования с помощью параметра запроса модели. Сценарии S+C (модель A) включают начальную емкость и требуют подписки E5, а сценарии общего использования (модель B) доступны для всех подписок и являются только потреблением. Дополнительные сведения о начальной емкости и расходах см. в статье Требования к лицензированию и оплате для API Microsoft Graph Teams.
Для бета-интерфейсов API в настоящее время нет правил лицензирования или использования модели A или модели B. Однако это может измениться в будущем.
Сценарии S+C/Model A
Только для приложений, выполняющих функции безопасности и (или) соответствия требованиям, пользователи должны иметь определенные лицензии E5 для использования этой функции и получения начальной емкости. Начальная емкость рассчитывается на пользователя и вычисляется в месяц и агрегируется на уровне клиента. За использование за пределами начальной емкости владельцам приложений взимается плата за использование API. Модель A может получать доступ только к сообщениям пользователей с назначенной лицензией E5.
Имя партнера | Партнерское решение |
---|---|
Архивация и соответствие требованиям Microsoft Teams | |
Сбор содержимого Proofpoint для Microsoft Teams |
Сценарии общего использования и модели B
Доступно для всех сценариев, не связанных с S+C, нет требований к лицензии или начальной емкости. Когда счетчики потребления становятся доступными, владельцы приложений списываются за все ежемесячные вызовы API.
Следующие партнеры сертифицированы. Ваша компания может работать с любым сочетанием этих партнеров в рамках вашего предприятия.
Имя партнера | Партнерское решение |
---|---|
Резервное копирование и восстановление 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 МБ на диске, исходя из средних значений, которые мы видим для собраний, которые находятся в диапазоне от 30 минут до 60 минут.
Результаты не гарантированы для сортировки по
createdDateTime
. Однако в случае, если для одного собрания присутствует несколько записей, они будут использовать одно и то жеmeetingId
значение. Кроме того, записи для нескольких записей правильно упорядочены для соответствующего собрания.Результаты гарантированно будут присутствовать только после того, как будут доступны связанные записи собрания. Иными словами, вызывающий не требует дополнительного опроса на наличие.
Разбиение на страницы по результатам будет поддерживаться в текущих шаблонах в API экспорта Teams. Разбиение на страницы будет поддерживаться наличием
@oData.nextLink
свойства в ответе. Свойство nextLink содержитskipToken
значение, как показано ниже.skipToken
Если нет, это означает, что в текущем пакете больше нет результатов для получения:Запрос Response (Ответ) @nextLink Комментарии /getAllRecordings
Количество: 10 ?skipToken=ABC
Первоначальный запрос без skipToken
/getAllRecordings?skipToken=ABC
Количество: 10 ?skipToken=DEF
SkipToken
возвращено, запрос на получение следующей страницы/getAllRecordings?skipToken=DEF
Количество: 7 Нет skipToken
, нет дополнительных данных$top
параметр также будет поддерживаться в рамках текущих шаблонов в API экспорта Teams.DeltaToken
для включения сценариев отслеживания изменений и синхронизации поддерживается. Общие сведения и примеры существующих разностных запросов см. в статье Использование разностного запроса для отслеживания изменений в данных Microsoft Graph.Следующий API можно использовать для получения фактического содержимого записи выбранного
userId
иrecordingId
,meetingId
полученного в ответе API GETgetAllRecordings
. Он возвращает содержимое записи:
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. Но с помощью значения заголовка
application/vnd.openxmlformats-officedocument.wordprocessingml.document
Accept можно также получить формат DOCX.Средний размер самого содержимого расшифровки в формате JSON/VTT составляет около 300 КБ на основе средних значений, которые мы видим для собраний, которые находятся в диапазоне от 30 до 60 минут.
Результаты не гарантированы для сортировки по
createdDateTime
. Однако в случае, если для одного собрания присутствует несколько записей, они будут использовать одно и то жеmeetingId
значение. Кроме того, записи для нескольких записей будут правильно упорядочены для соответствующего собрания.Результаты гарантированно будут присутствовать только после того, как будут доступны связанные записи собрания. Иными словами, вызывающий не требует дополнительного опроса на наличие.
Разбиение на страницы по результатам будет поддерживаться в текущих шаблонах в API экспорта Teams. Разбиение на страницы будет поддерживаться наличием
@oData.nextLink
свойства в ответе. СвойствоnextLink
будет содержатьskipToken
значение, как показано ниже.skipToken
Если нет, это означает, что в текущем пакете больше нет результатов для получения:Запрос Response (Ответ) @nextLink Комментарии /getAllTranscripts
Количество: 10 ?skipToken=ABC
Первоначальный запрос без skipToken
/getAllTranscripts?skipToken=ABC
Количество: 10 ?skipToken=DEF
SkipToken
возвращено, запрос на получение следующей страницы/getAllTranscripts?skipToken=DEF
Количество: 7 Нет skipToken
, нет дополнительных данных$top
параметр также будет поддерживаться в рамках текущих шаблонов в API экспорта Teams.DeltaToken
для включения сценариев отслеживания изменений и синхронизации поддерживается. Обзор и примеры существующих разностных запросов см. в статье Использование разностного запроса для отслеживания изменений в данных Microsoft Graph.Следующий API можно использовать для получения фактического содержимого расшифровки выбранных userId, meetingId и transcriptId, полученных в ответе API GET getAllTranscripts. Он возвращает содержимое записи.
GET users('{userId}')/onlineMeetings('{meetingId}')/transcripts('{transcriptId}')/content
Дополнительные сведения см. в разделе Использование API Graph для получения расшифровки.
Экспорт фильтров API
API экспорта, размещенный в службе Teams Graph, получает все сообщения пользователей из почтового ящика пользователя Substrate с помощью users/{userId}/chats/getAllMessages
. API экспорта извлекает отправленные и полученные сообщения для пользователя, что приводит к экспорту повторяющихся сообщений при вызове API для всех пользователей в потоке чата.
API экспорта содержит параметры фильтра, которые помогают оптимизировать сообщения, возвращаемые для потока чата. API GET поддерживает новые параметры фильтра, которые позволяют извлекать сообщения на основе отправленных сообщений о пользователях, ботах, приложениях и системных событиях. Параметр фильтра поддерживает сообщения, отправляемые следующим образом:
users (несколько идентификаторов пользователей, поддерживаемых в одном запросе)
приложения (боты, соединители и т. д.)
анонимные пользователи
федеративные пользователи (пользователи внешнего доступа)
системные сообщения о событиях (управляющие сообщения)
Эти параметры являются частью запроса $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 'anonymousGuest'
$filter=from/user/userIdentityType eq 'federatedUser' (guest/external)
$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 messsageType 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/applicationIdenitytyType eq '{appType}'
он присутствует.запрос возвращает сообщения, отправленные системой, если
messageType eq 'systemEventMessage'
он присутствует
Эти параметры можно комбинировать с помощью операторов OR, а также путем объединения с параметром lastModifiedDateTime
$filter
.