Экспорт содержимого с помощью 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 экспорта Teams.

  • Управляющие сообщения: API экспорта поддерживает сбор контрольных сообщений в дополнение к созданным пользователем сообщениям. Контрольные сообщения — это системные сообщения, которые отображаются в клиенте Teams и содержат важную информацию, например "Пользователь А добавил пользователя B в чат и предоставил общий доступ ко всему журналу чата" вместе с меткой времени. Системные сообщения позволяют вызывающей организации получать аналитические сведения о событиях, произошедших в команде, канале или чате. В настоящее время API экспорта поддерживает событие "Добавить участника" и "Удалить участника" для чатов, команд и стандартных каналов.

Что не поддерживается 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/beta/users/{id}/onlineMeetings/getAllRecordings?$filter=MeetingOrganizerId eq ‘{id}’
    
  • (Бета-версия) Пример 4 — это пример запроса для получения ссылок на все доступные расшифровки собраний Teams пользователя. Фильтр TOP n поддерживается аналогично сообщениям чата:

    GET https://graph.microsoft.com/beta/users/{id}/onlineMeetings/getAllTranscripts?$filter=MeetingOrganizerId eq ‘{id}’
    

Примечание.

API возвращает ответ со ссылкой на следующую страницу в случае нескольких результатов. Чтобы получить следующий набор результатов, просто вызовите GET по URL-адресу из @odata.nextlink. Если @odata.nextlink значение отсутствует или значение NULL, извлекаются все сообщения.

Предварительные требования для доступа к 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.

Имя партнера Партнерское решение
Логотип smarsh Архивация и соответствие требованиям Microsoft Teams
Снимок экрана: логотип Proofpoint. Сбор содержимого Proofpoint для Microsoft Teams

Сценарии общего использования и модели B

Доступно для всех сценариев, не связанных с S+C, нет требований к лицензии или начальной емкости. Когда станут доступны счетчики потребления, владельцы приложений будут взимать плату за все ежемесячные вызовы API.

Следующие партнеры сертифицированы. Ваша компания может работать с любым сочетанием этих партнеров в рамках вашего предприятия.

Имя партнера Партнерское решение
Логотип rubrik Резервное копирование и восстановление Microsoft Teams
логотип veeam Резервное копирование и восстановление Microsoft Teams

Дальнейшие действия

Если вы являетесь поставщиком, желающим присоединиться к программе сертификации, заполните эту форму в качестве следующего шага. Если вам нужно указать дополнительный контекст и сведения, по электронной почте по электронной почте группе экосистем MS Teams (TeamsCategoryPartner@microsoft.com).

Режим оценки (по умолчанию)

Без объявления модели доступ к API-интерфейсам с ограниченным использованием для каждого запрашивающего приложения в целях оценки.

Представление JSON

  1. В следующем примере представлено представление ресурса чата в формате 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 .

  2. В следующем примере представлен ресурс записи в формате JSON:

    Пространство имен: microsoft.graph

    {
     "@odata.context": "https://graph.microsoft.com/beta/$metadata#Collection(meetingRecording)", 
     "@odata.count": 2, 
     "@odata.nextLink": "https://graph.microsoft.com/beta/users('{userId}')/onlineMeetings/getAllRecordings?$filter=MeetingOrganizerId+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/beta/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/beta/users/{userId}/onlineMeetings/{meetingId}/recordings/{recordingId}/content" 
          },
        ] 
       }
    

    Где:

    • <id> представляет одну запись.

    • <meetingId> представляет идентификатор собрания или вызова.

    • <meetingOrganizerId> представляет организатора собрания.

    • <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 
    
  3. В следующем примере представлен ресурс расшифровки в формате JSON:

    Пространство имен: microsoft.graph

    {
      "@odata.context": "https://graph.microsoft.com/beta/$metadata#Collection(callTranscript)",  
      "@odata.count": 2, 
      "@odata.nextLink": "https://graph.microsoft.com/beta/users('{userId}')/onlineMeetings/getAllTranscripts?$filter=MeetingOrganizerId+eq+%27{userId}%27&$skiptoken=MSMjMCMjTkNaYVNIQjVVbXRPYWxaV1dscGFWVGg1V2pOb1IxUXpRWGxrUm1oTFVrWmtTV1ZyYkhwUlZVWm9UMWR3VEdWWGRFTlJWVVpDVVZFOVBRPT0%3d",  
      "value":
        [ 
          { 
           "@odata.type": "#microsoft.graph.callTranscript", 
           "id": "MSMjMCMjMGFjNmUwZTgtYmZjYy00NDQxLTk2MGYtZjllNjVhNjI0NzBh", 
           "meetingId": "MSoxMjczYTAxNi0yMDFkLTRmOTUtODA4My0xYjdmOTliM2VkZWIqMCoqMTk6bWVldGluZ19aR1F3WTJZNE9XTXROekppWlMwME1XWTRMVGc0TWpBdE1ERXdOV1kzWlRsak9UTXlAdGhyZWFkLnYy", 
           "meetingOrganizerId": "{userId}", 
           "transcriptContentUrl": "https://graph.microsoft.com/beta/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/beta/users/{userId}/onlineMeetings/{meetingId}/transcripts/{transcriptId}/content",   
           },
         ] 
        }
    

    Где:

    • <id> представляет одну запись.

    • <meetingId> представляет идентификатор собрания или вызова.

    • <meetingOrganizerId> представляет организатора собрания.

    • <createdDateTime> указывает время начала собрания.

    • <transcriptContentUrl> значение указывает URL-адрес содержимого расшифровки.

    • Содержимое расшифровки по умолчанию будет иметь формат VTT. Но с помощью значения заголовка application/vnd.openxmlformats-officedocument.wordprocessingml.documentAccept можно также получить формат 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 .