Pythonでバッチを組むと、処理結果やエラーをどこかに通知したくなります、メールだと埋もれがちなので、普段使っているチャットに飛ばしておくと見落としが減って便利です
会社のやり取りがTeams中心なら、Teamsに通知できると確認の手間が減ります、ただ少し前まで手軽だったIncoming Webhook(Office 365 コネクタ)は段階的に廃止が進んでいて、新しく作るなら今はPower Automate Workflowsで用意するのが公式の推奨です
以前ChatworkにPythonから通知する記事を書きましたが、今回はそのTeams版です、Workflowsで発行したWebアドレスにPythonからJSONをPOSTするだけなので、流れはChatworkのときと近いです、この記事ではWebhookの作り方から実際に送るサンプルコードまでまとめてご紹介します
難しいプログラムは要りません、Workflowsで1つWebhookを作って、Pythonから数行POSTするだけなので身構えなくて大丈夫です
Teams通知の仕組み
先に全体像をつかんでおきます、やることはシンプルで、Workflowsで作ったWebhook URL(専用のWebアドレス)宛てに、Pythonからメッセージの中身をJSONでPOSTすると、指定したチャネルにカードとして投稿される、という流れです
- TeamsのWorkflowsでWebhookを作る(Webhook URLが発行される)
- PythonからそのWebhook URLにメッセージをJSONでPOSTする
- 指定したチャネルにメッセージが投稿される
送るデータの形はAdaptive Cardという、Teamsが受け取れるカード形式のJSONです、見た目はあとから整えられますが、まずは1行のメッセージを送るところから作っていきます
昔のIncoming Webhookは宛先のURLさえ知っていれば誰でも投稿できる作りで、セキュリティ面が心配されていました、Workflowsは作った人のフロー(自動処理)を経由して投稿する形になっていて、そのあたりが置き換わった理由とされています
WorkflowsでWebhookを作る
はじめに前提です、Workflows(Power Automate)を使うには職場または学校アカウント(Microsoft 365)が必要です、個人用のMicrosoftアカウント(outlook.comなど)ではPower Automateが使えず、WorkflowsアプリがTeamsのメニューに出てこないので、会社や学校のTeamsで用意してください
まずはTeams側でWebhookを用意します、公式に用意されているテンプレートを選ぶだけなので、プログラムの知識は要りません、手順は次のとおりです
Teamsの左側のメニューからWorkflowsアプリを開きます、見当たらないときは左メニューの一番下にあるアプリからWorkflowsを検索すると出てきます
テンプレートの一覧からWebhook 要求を受信したらチャネルに投稿する(英語表記だと Post to a channel when a webhook request is received)を選びます
このWebhookの名前(フロー名)を入力します、あとから自分が見て分かればいいので、バッチ通知用のような名前を付けておくと管理が楽です
通知を流したいチームとチャネルを選びます、ここで選べるのは標準チャネルだけなので、非公開チャネルやチャットには直接送れない点に気をつけてください
作成するとWebhook URLが発行されます、このURL宛てにPythonからPOSTする形になるので、コピーして控えておきます、画面を閉じたあとに確認したいときは、Workflowsアプリの一覧から該当のフローを開いて見られます
発行されたWebhook URLはパスワードと同じです、このURLを知っていれば該当チャネルに投稿できてしまうので、人に教えたりGitHubなどの公開リポジトリにそのまま載せたりしないように気をつけてください
Pythonのプログラム
Webhook URLが用意できたら、あとはPythonから送るだけです、URLはコードに直書きせず.envファイルから読み込む形にしています、こうしておけば値を差し替えるのも楽ですし、うっかり鍵を公開してしまう事故も防げます
まず読み込みに使うpython-dotenvを入れておきます
pip install python-dotenv次にプロジェクトの直下に.envを作って、さっき発行されたWebhook URLを書いておきます、変数名はTEAMS_WEBHOOK_URLにして、値だけ(URLそのもの)を書きます
TEAMS_WEBHOOK_URL=発行されたWebhook URL作った.envは.gitignoreに入れて、GitHubなどにアップしないようにしておきます、.gitignoreはGitに「このファイルは管理しないでね(=GitHubにもアップしないでね)」と伝えるためのリストです、これで鍵をコードに直書きせず、リポジトリにも残さずに済みます
本体のコードがこちらです、ステータスコードが200か202かどうかで送信成功を True・False で返すようにしています
import os
import requests
from dotenv import load_dotenv
load_dotenv()
TEAMS_WEBHOOK_URL = os.environ["TEAMS_WEBHOOK_URL"]
def send_to_teams(message, webhook_url=TEAMS_WEBHOOK_URL) -> bool:
payload = {
"type": "message",
"attachments": [
{
"contentType": "application/vnd.microsoft.card.adaptive",
"content": {
"$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
"type": "AdaptiveCard",
"version": "1.4",
"body": [
{"type": "TextBlock", "text": message, "wrap": True},
],
},
}
],
}
response = requests.post(webhook_url, json=payload)
return response.status_code in (200, 202)やっていることはシンプルで、発行されたWebhook URLに対して、メッセージを入れたJSONをPOSTするだけです、送るJSONはトップに type として message を置いて、その中の attachments にAdaptive Cardを入れる、という決まった形になっています、引数のmessageがそのままTextBlockの本文として表示されます
送り方のポイントが2つあります、まずjson=でデータを渡すと、Content-Typeがapplication/jsonに自動で設定されるので、ヘッダーを手で書く必要はありません、認証についてもWebhook URL自体に署名が含まれているので、追加の認証ヘッダやトークンは不要です
成功したときのステータスコードは202(Accepted)です、Chatworkなどは200が返りますが、WorkflowsのWebhookは受け付けてから裏で処理する作りなので、200ではなく202が返ってきます、なので成功判定は200と202のどちらかなら成功、としています
あとは send_to_teams('通知したいメッセージ') のように呼べば、バッチの好きなタイミングで通知できます、処理が終わったタイミングや、例外を捕まえたタイミングで呼ぶと、結果やエラーをそのままTeamsに流せます
TextBlockのtextには、太字や斜体、リンクといった一部のmarkdownが使えます、見出しや改行で少し見やすくする程度なら十分です、ただ画像やコードブロックは別の要素を組む形になるので、ここでは1行のテキストを送る範囲にとどめています
使うときの注意点
つまずきやすいところを先にまとめておきます
- 投稿先に選べるのは標準チャネルだけ(非公開チャネルやチャットには直接送れない)
- 旧Incoming Webhookは廃止される流れなので、これから作るならWorkflowsで用意する
- 成功のステータスコードは200ではなく202になることがある
- 利用には職場・学校アカウント(Microsoft 365)が必要(個人アカウントではWorkflowsが使えない)
旧Incoming Webhook(Office 365 コネクタ)は段階的に廃止が進められてきて、公式の最新案内では2026年5月の更新で最終的な廃止とされています、期限は過去に何度も後ろ倒しされてきた経緯がありますが、これから新しく作るなら使えない前提で考えておくのが安全なので、Workflowsで用意するのが確実です、既存のWebhookがある人も最新の案内を確認しつつ早めに移しておくと安心です
権限まわりは環境によります、Power Automateは多くのMicrosoft 365環境で使えますが、組織の設定によってはWorkflowsの作成が制限されていることもあります、テンプレートが選べない、作成でエラーが出るといったときは、組織の管理者に確認してみてください
ループの中で大量に送るような使い方は避けて、処理結果やエラーの要点だけ送るくらいがちょうどいいです、短時間に送りすぎると制限がかかることもあるので、通知は要点をまとめて1回、を意識しておくと安全です
公式ドキュメント
もう少し踏み込みたいときは、↓の公式ドキュメントが参考になります、Workflowsからカードを投稿する話や、コネクタ廃止の経緯がまとまっています
- Microsoft Teams にアダプティブ カードを投稿するフローを作成する|Microsoft Learn
- Retirement of Office 365 connectors within Microsoft Teams|Microsoft 365 Developer Blog
あとがき
仕事のやり取りがTeams中心なら、処理結果やエラーがそのまま流れてくると見落としがぐっと減ります、Webhookを1つ作ってしまえば、あとはPythonから呼ぶだけなので、一度組んでおくと使い回しが効きます
同じ要領でChatworkに通知したい方は、PythonからChatworkに自動通知する記事もあわせてどうぞ、APIトークンとルームIDの取り方からまとめています、送り先が違うだけで、Pythonから通知する考え方は今回とほぼ同じです
Pythonの自動化つながりだと、Selenium WebDriverWaitの使い方でスクレイピングを安定させて、その結果をこのTeams通知に流す、といった組み合わせも便利です、作ったスクリプトを配りたいときは、PyInstallerでexe化する話もどうぞ



コメント