Мне нужно получить тексты сообщений из канала MS Teams с помощью API.
Оказалось, что из GraphQL (https://developer.microsoft.com/en-us/graph/graph-explorer) сделать это можно только со специтальными разрешениями от админа (Chat.Read или Chat.ReadWrite, ChannelMessage.Read.All).
Однако, закрытый API, который испольузет приложение - позволяет как минимум получить список сообщений и preview.
В итоге, я сделал так:

  • идем в web-интерфейс Teams, нажимаем в браузере F11 и выполняем поиск в нужном канале.
  • В network находим запрос методом POST на адрес https://substrate.office.com/searchservice/api/v2/query
  • В заголовках этого запроса берем заголовок Authorization и подставляем в этот скрипт:
#!/bin/bash

export MS_GRAPH_API_TOKEN="Bearer eyJ0eXAiOiJKV1QiLCJub25jZSI6Im53WG5YbG9PdndrUUEyN0FiVWV3czd4X2pscDRETzFBX1Uyb1FCUEVSWjgiLCJhbGciOiJSUzI1NiIsIng1dCI6InJ0c0ZULWItN0x1WTdEVlllU05LY0lKN1ZuYyIsImtpZCI6InJ0c0ZULWItN0x1WTdEVlllU05LY0lKN1ZuYyJ9.eyJhdWQiOiJodHRwczovL291dGxvb2s..."

function search_ms_teams_messages {
    curl --silent -X POST "https://substrate.office.com/searchservice/api/v2/query" \
    -H "Authorization: ${MS_GRAPH_API_TOKEN}" \
    -H "Content-Type: application/json" \
    -d '{
  "entityRequests": [
    {
      "entityType": "Message",
      "contentSources": [
        "Teams"
      ],
      "fields": [],
      "propertySet": "Optimized",
      "query": {
        "queryString": "Mikhail Usik AND sent >= 2025-12-01T00:00:00.000Z AND sent < 2025-12-31T00:00:00.000Z AND clientthreadid:19:b89271071f5a4a52b675758165469040@thread.skype AND NOT (isClientSoftDeleted:TRUE)",
        "displayQueryString": "Mikhail Usik"
      },
      "from": 0,
      "size": 100,
      "topResultsCount": 10,
      "filter": {
        "Term": {
          "GroupId": "c0f53b2a-78cd-4722-a378-f2c439c612cb"
        }
      }
    }
  ],
  "QueryAlterationOptions": {
    "EnableAlteration": true,
    "EnableSuggestion": true,
    "SupportedRecourseDisplayTypes": [
      "Suggestion"
    ]
  },
  "cvid": "237bca94-000f-4634-90d4-78207e267d79",
  "logicalId": "c7e32b39-af2f-4dae-a670-80d4df18fd80",
  "scenario": {
    "Dimensions": [
      {
        "DimensionName": "QueryType",
        "DimensionValue": "Messages"
      },
      {
        "DimensionName": "FormFactor",
        "DimensionValue": "general.web.reactSearch"
      }
    ],
    "Name": "powerbar"
  },
  "Context": {
    "EntityContext": [
      {
        "@odata.type": "Microsoft.OutlookServices.Message",
        "Id": "c0f53b2a-78cd-4722-a378-f2c439c612cb",
        "ClientThreadId": "19:b89271071f5a4a52b675758165469040@thread.skype"
      }
    ]
  }
}' 2>/dev/null | jq '.EntitySets[].ResultSets[].Results[].Source.Preview' | tac >> previews.txt
}

search_ms_teams_messages

Полный текст сообщений

Полный текст сообщений можно получить с помощью InternetMessageId и запросов в GraphQL вида:

curl -X GET \
  -H "Authorization: ${MS_GRAPH_API_TOKEN}" \
  -H "Accept: application/json" \
  "https://graph.microsoft.com/v1.0/teams/${MS_TEAMS_TEAM_ID}/channels/${MS_TEAMS_CHANNEL_ID}/messages/${MESSAGE_ID}"
Enter your comment. Wiki syntax is allowed:
 
  • devops/ms_teams_search_messages_in_a_channel.txt
  • Last modified: 2025/12/04 14:31
  • by admin