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