はじめに

Microsoftが提供する統合APIである「Microsoft Graph API」を利用して、Microsoft Teamsのチャンネルにメッセージを送信する方法を調査しました。
Graph APIの認証周りは仕様が複雑で詰まりやすいポイントが多いのですが、今回はMicrosoft公式の認証ライブラリである msal (Microsoft Authentication Library) を利用し、「ブラウザ認証」 でTeamsのチャンネルにメッセージを送信する方法を調査しました。

手順

Graph APIを利用するには、Entra IDへのアプリ登録と設定が必要です。今回は、検証用に「Microsoft 365 Business Basic」のアカウントを取得して検証を行いました。

1. Entra ID にアプリを登録

Entra 管理センターにアクセスし、「アプリの登録」から新しいアプリケーションを作成します。
作成後、クライアントID(アプリケーションID)テナントID(ディレクトリID)を控えておきます。

2. リダイレクトURIの設定

今回のようにブラウザを自動で開いてログインを求める場合、ログイン結果をローカルのプログラムに正しく返すための受け口の設定が必要です。

  1. 登録したアプリの左側メニューから「Authentication」を開きます。
  2. 「リダイレクトURIの追加」>「モバイル アプリケーションとデスクトップ アプリケーション」を選択します。
  3. 入力欄に http://localhost と入力します。
  4. 「構成」をクリックします。

3. API のアクセス許可を付与

Teamsのチャンネルにメッセージを送信するための権限を追加します。

  1. 左メニューの「APIのアクセス許可」を開きます。
  2. 「アクセス許可の追加」>「Microsoft Graph」> 「委任された許可」 を選択します。
  3. 検索窓に ChannelMessage.Send と入力して追加します。

4. チーム・チャンネルIDの取得

通知先となるTeamsのチャンネルの情報を取得します。
Teams上で「リンクのコピー」からURLをコピーすると、以下のような形式になります。
https://teams.microsoft.com/l/channel/19%3Axxxx%40thread.tacv2/General?groupId=yyyy…

groupIdがチームIDとなり、channel/以降の文字列からtacv2までがチャンネルIDになります。
このとき、URLエンコードされた文字(%3A%40)は元の文字(:@)に戻す必要があります。また、末尾の /General などのセグメントはチャンネルIDではありませんので注意してください。

Python(msal)によるアクセストークンの取得と投稿

準備が整ったら、Pythonでコードを記述します。
以下が、トークンを取得してTeamsの対象チャンネルにPOSTリクエストを送信する全コードです。

import msal
import requests

TENANT_ID = "テナントID"
CLIENT_ID = "クライアントID"
SCOPES = ["ChannelMessage.Send"]

# MSALアプリケーションの初期化
authority = f"https://login.microsoftonline.com/{TENANT_ID}"
app = msal.PublicClientApplication(CLIENT_ID, authority=authority)

# ブラウザ認証を開始
print("=== ブラウザが開きますので認証を行ってください ===")
# ブラウザを自動で開き、ログイン画面を表示します
result = app.acquire_token_interactive(scopes=SCOPES)

# トークンの取得確認
if "access_token" in result:
    print("\nアクセストークンの取得に成功しました!")
    token = result["access_token"]
else:
    print(f"\nエラーが発生しました: {result.get('error')}")
    print(result.get('error_description'))
    exit(1)

# === Teamsへの投稿処理 ===
team_id = "チームID"
channel_id = "チャンネルID"
endpoint = f"https://graph.microsoft.com/v1.0/teams/{team_id}/channels/{channel_id}/messages"

headers = {
    "Authorization": f"Bearer {token}",
    "Content-Type": "application/json"
}

message_payload = {
    "body": {
        "contentType": "html",
        "content": "<h2>自動通知テスト</h2><p>msalライブラリを使って送信しました</p>"
    }
}

res_post = requests.post(endpoint, headers=headers, json=message_payload)

if res_post.status_code == 201:
    print("メッセージの送信に成功しました!")
else:
    print(f"投稿エラーが発生しました: {res_post.status_code}")
    print(res_post.text)

実行すると以下のようにブラウザでログインが求められます。

ログインすると以下の画面にリダイレクトされ、Teamsのチャンネルにメッセージが投稿されました。

まとめ

今回はMicrosoft Graph APIとPythonの msal ライブラリを用いて、Teamsへメッセージを送信する連携を試しました。
Graph APIの認証は最初は難しく感じますが、msal に任せることで非常にシンプルに実装できました。
今後は、他のGraph APIの機能も調査していきたいと思います。