【Python】TeamsにWebhookで自動通知する方法【2026年版】

PythonでTeamsにWebhookで自動通知 Power Automate Workflows

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を用意します、公式に用意されているテンプレートを選ぶだけなので、プログラムの知識は要りません、手順は次のとおりです

STEP
Workflowsアプリを開く

Teamsの左側のメニューからWorkflowsアプリを開きます、見当たらないときは左メニューの一番下にあるアプリからWorkflowsを検索すると出てきます

STEP
テンプレートを選ぶ

テンプレートの一覧からWebhook 要求を受信したらチャネルに投稿する(英語表記だと Post to a channel when a webhook request is received)を選びます

STEP
フロー名を入力する

このWebhookの名前(フロー名)を入力します、あとから自分が見て分かればいいので、バッチ通知用のような名前を付けておくと管理が楽です

STEP
投稿先のチームとチャネルを選ぶ

通知を流したいチームチャネルを選びます、ここで選べるのは標準チャネルだけなので、非公開チャネルやチャットには直接送れない点に気をつけてください

STEP
Webhook URLをコピーして控える

作成すると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に流せます

TextBlocktextには、太字や斜体、リンクといった一部の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からカードを投稿する話や、コネクタ廃止の経緯がまとまっています

あとがき

仕事のやり取りがTeams中心なら、処理結果やエラーがそのまま流れてくると見落としがぐっと減ります、Webhookを1つ作ってしまえば、あとはPythonから呼ぶだけなので、一度組んでおくと使い回しが効きます

同じ要領でChatworkに通知したい方は、PythonからChatworkに自動通知する記事もあわせてどうぞ、APIトークンとルームIDの取り方からまとめています、送り先が違うだけで、Pythonから通知する考え方は今回とほぼ同じです

Pythonの自動化つながりだと、Selenium WebDriverWaitの使い方でスクレイピングを安定させて、その結果をこのTeams通知に流す、といった組み合わせも便利です、作ったスクリプトを配りたいときは、PyInstallerでexe化する話もどうぞ


最後に・・・

クラウドワークスココナラでお仕事受け付けています!

PythonとExcelを中心に仕事に役立つ業務ツールや自動化、スクレイピングツールの作成を受注していて、クラウドワークスでは気が付けば100件以上のお仕事を受注してきました!

会社員をやりながらの副業なので時間の捻出は相応ですが、クライアントの方々と近い立場でこちらからも提案しながら活動していますのでお悩みあれば是非ご相談ください

ココナラのプロフィールページへ

"ココナラ"に新規登録する際は1,000Pもらえる紹介コード使ってください

78E62K

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

VBAとPythonを中心にユーザー側でできるITを自己学習しているので備忘録半分、学習履歴を残して同じ道を辿る人の参考になればとブログを始めました

副業でスクレイピングツール作成を中心にできることを色々やっていますのでご相談いただけるとありがたいです!


クラウドワークスのページへ


ココナラのページへ

コメント

コメントする

目次