Table of Contents

Задача

Надо отправлять сообщения в канал MS Teams из CI/CD через MS Graph API. Тo есть из bash-скрипта.

Что для этого нужно

Регистрация приложения

Немного пояснений:

Получение Authorization Code

Это происходит в интерактивном режиме в браузере.
Получаем нужные данные:

Получение Access Token и Refresh Token

Дальше все просто - получаем токены:

MS_GRAPH_API_TOKENS_JSON=`curl -s --location --request POST "https://login.microsoftonline.com/${MS_TENANT}/oauth2/v2.0/token" \
    --header 'Content-Type: application/x-www-form-urlencoded' \
    --data-urlencode "client_id=${MS_APPLICATION_ID}" \
    --data-urlencode "code=${AUTHORIZATION_CODE}" \
    --data-urlencode "scope=offline_access ChannelMessage.Send" \
    --data-urlencode "http://localhost/myapp" \
    --data-urlencode "grant_type=authorization_code" 2>/dev/null`
MS_GRAPH_API_TOKEN=`echo ${MS_GRAPH_API_TOKENS_JSON} | awk '{gsub(/\,/,"\n")}1' 2>/dev/null | grep access_token | cut -d':' -f2 | tr -cd '[:alnum:]._-'`
MS_GRAPH_API_REFRESH_TOKEN=`echo ${MS_GRAPH_API_TOKENS_JSON} | awk '{gsub(/\,/,"\n")}1' 2>/dev/null | grep refresh_token | cut -d':' -f2 | tr -cd '[:alnum:]._-'`

Тут MS_TENANT - это все тот же team_id или group_id - Это синонимичные значения в терминологии MS Teams.
Refresh Token - валиден 90 дней, но лучше его периодически обновлять, получая тот же JSON о свежими с токенами уже с помощью имеющегося refresh token:

MS_GRAPH_API_TOKENS_JSON=`curl -s --location --request POST "https://login.microsoftonline.com/${MS_TENANT}/oauth2/v2.0/token" \
        --header 'Content-Type: application/x-www-form-urlencoded' \
        --data-urlencode "client_id=${MS_APPLICATION_ID}" \
        --data-urlencode 'scope=offline_access ChannelMessage.Send' \
        --data-urlencode 'grant_type=refresh_token' \
        --data-urlencode "refresh_token=${MS_GRAPH_API_REFRESH_TOKEN}" 2>/dev/null`
MS_GRAPH_API_TOKEN=`echo ${MS_GRAPH_API_TOKENS_JSON} | awk '{gsub(/\,/,"\n")}1' 2>/dev/null | grep access_token | cut -d':' -f2 | tr -cd '[:alnum:]._-'`
MS_GRAPH_API_REFRESH_TOKEN=`echo ${MS_GRAPH_API_TOKENS_JSON} | awk '{gsub(/\,/,"\n")}1' 2>/dev/null | grep refresh_token | cut -d':' -f2 | tr -cd '[:alnum:]._-'`

Отправка сообщения в канал MS Teams через MS Graph API

MESSAGE="{
  \"body\": {
  \"contentType\": \"html\",
  \"content\": \"Hello World!\"
  }
}"
curl -s -X POST "https://graph.microsoft.com/v1.0/teams/${MS_TEAMS_GROUP_ID}/channels/${MS_TEAMS_CHANNEL_ID}/messages" \
    -H "Authorization: Bearer ${MS_GRAPH_API_TOKEN}" \
    -H "Content-Type: application/json" \
    -d "${MESSAGE}"