はじめに
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の設定
今回のようにブラウザを自動で開いてログインを求める場合、ログイン結果をローカルのプログラムに正しく返すための受け口の設定が必要です。
- 登録したアプリの左側メニューから「Authentication」を開きます。
- 「リダイレクトURIの追加」>「モバイル アプリケーションとデスクトップ アプリケーション」を選択します。
- 入力欄に http://localhost と入力します。
- 「構成」をクリックします。

3. API のアクセス許可を付与
Teamsのチャンネルにメッセージを送信するための権限を追加します。
- 左メニューの「APIのアクセス許可」を開きます。
- 「アクセス許可の追加」>「Microsoft Graph」> 「委任された許可」 を選択します。
- 検索窓に
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の機能も調査していきたいと思います。