Microsoft TeamsのIncoming Webhookが廃止されるようなので、Workflowsで使えるマークダウンをPythonで確認してみた
Teams を使った通知の実装を検討した際、Incoming Webhook を利用しようと思っていたのですが、なんと廃止予定であることを知りました。
公式の情報によると、2025 年 12 月ごろまでに移行が推奨されています。
Microsoft Teams の Office コネクタが廃止されるらしいのですが、その中に RSS や Incoming Webhook が含まれているようです。廃止に伴い移行先としては Workflows(Power Automate)を使うことが推奨されていました。
Teams に送信するメッセージは各種「カード」を目的に応じて利用して送信します。
カードの種類 | 説明 |
---|---|
アダプティブ カード | このカードは高度にカスタマイズできます。テキスト、音声、画像、ボタン、入力フィールドの任意の組み合わせが可能です。 |
ヒーロー カード | このカードには、通常、1 つの大きな画像、1 つまたは複数のボタン、少量のテキストが含まれます。 |
リスト カード | このカードには、アイテムのスクロール リストが含まれています。 |
Microsoft 365 グループのコネクタ カード | 複数のセクション、フィールド、画像、アクションを含む柔軟なレイアウトです。 |
レシート カード | このカードは、ユーザーに領収書を提供します。 |
サインイン カード | このカードを使用すると、ボットはユーザーのサインインを要求できます。 |
サムネイル カード | このカードには通常、1 つのサムネイル画像、短いテキスト、1 つ以上のボタンが含まれています。 |
カード コレクション | このカード コレクションは、1 つの応答で複数のアイテムを返す場合に使用します。 |
引用: Teams でカードの種類を調べる & を作成する - Teams | Microsoft Learn
今回はマークダウンを使ってメッセージ送信したいので、用途に合うのは「アダプティブ カード」と「Microsoft 365 グループのコネクタ カード」になりそうです。
Workflows ではアダプティブカードのみ利用できるようなので、以下の2パターンを検証してみます。
- Incoming Webhook(Microsoft 365 グループのコネクタ カード)
- Workflows(アダプティブカード)
利用できるマークダウンについてはある程度以下のドキュメントに記載がありますが、どこまで表現できるのか気になったため Python でメッセージを送信して試していきます。
先にまとめ
- Incoming Webhook はマークダウン記法全て利用可能
- 移行先の Workflows の TextBlock では以下の要素のみ使用可能
- リスト
- ハイパーリンク
- 太字
- 斜体
- Workflows へそのまま移行するとメッセージが崩れてしまうため、アダプティブカードに合わせた調整が必要
Incoming Webhook(Microsoft 365 グループのコネクタ カード)
廃止予定の Incoming Webhook はアダプティブカードも送信できますが、Microsoft 365 グループのコネクタ カードの方が対応している書式が多いです。
Incoming Webhook の WebhookURL 取得方法については以下のブログを参照します。
WebhookURL が取得できたら、以下のマークダウンで作成したメッセージを Python で送信してみます。
import requests
import json
webhook_url = "取得したWebhook URL"
message = {
"text": (
"# ヘッダー1\n\n"
"## ヘッダー2\n\n"
"### ヘッダー3 \n\n"
"- リスト1\n\n"
"- リスト2\n\n"
"1. リスト1\n\n"
"2. リスト2\n\n"
"[リンク](https://www.google.com/)\n\n"
"**太字**\n\n "
"*斜体*\n\n "
"`コード`\n\n "
"\n```\n"
"複数行コード\n複数行コード\n"
"```\n\n"
"> 引用\n\n >> 引用\n\n"
"水平線 \n\n --- \n\n"
"![Duck on a rock](https://aka.ms/Fo983c)\n\n"
"|header1|header2|header3|\n"
"|:--|--:|:--:|\n"
"|align left|align right|align center|\n"
"|a|b|c|\n"
)
}
response = requests.post(
url=webhook_url,
data=json.dumps(message),
headers={"Content-Type": "application/json"},
)
Teams を確認すると、全て問題なく表示されています。
ドキュメントではテーブルや水平線、コードブロックあたりは言及されていませんが、問題なく使用できるようです。
Workflows(アダプティブカード)
次に Workflows を使ってアダプティブカードの形式で同じメッセージを送信してみます。
Workflowsを作成する
いくつか作成方法はありますが、今回は左のナビゲーションから作成します。
Webhook要求を受信するとチャネルに投稿する
のテンプレートを開いて、通知先としたいチームとチャンネルを選択します。
フローを作成すると、URL が発行されるの控えておきましょう。
Workflowsを使ってマークダウン形式のメッセージを送信する
以下の Python コードでメッセージを送ります。内容は Incoming Webhook と同様です。
import requests
import json
# TeamsのWebhook URL
webhook_url = "WorkflowsのURL"
message = {
"attachments": [
{
"contentType": "application/vnd.microsoft.card.adaptive",
"content": {
"$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
"type": "AdaptiveCard",
"msteams": {"width": "Full"},
"version": "1.4",
"body": [
{
"type": "TextBlock",
"text": (
"# ヘッダー1\n\n"
"## ヘッダー2\n\n"
"### ヘッダー3 \n\n"
"- リスト1\n\n"
"- リスト2\n\n"
"1. リスト1\n\n"
"2. リスト2\n\n"
"[リンク](https://www.google.com/)\n\n"
"**太字**\n\n "
"*斜体*\n\n "
"`コード`\n\n "
"\n```\n"
"複数行コード\n複数行コード\n"
"```\n\n"
"> 引用\n\n >> 引用\n\n"
"水平線 \n\n --- \n\n"
"![Duck on a rock](https://aka.ms/Fo983c)\n\n"
"|header1|header2|header3|\n"
"|:--|--:|:--:|\n"
"|align left|align right|align center|\n"
"|a|b|c|\n"
),
"wrap": True,
}
],
},
}
]
}
response = requests.post(
url=webhook_url,
data=json.dumps(message),
headers={"Content-Type": "application/json"},
)
準備ができたので実行してみると、以下のような結果になりました。
ドキュメント通り、リストとハイパーリンク・太字・斜体は使えますが、他の記法は使用できないようです。移行を考えている場合は注意しましょう。
Workflowsに合わせた調整
先ほど確認した通り、TextBlock 内のマークダウンでは利用できないものが多いのですが、コードブロックや画像などは別の要素を使うことで表現が可能です。
import requests
import json
# TeamsのWebhook URL
webhook_url = "WorkflowsのURL"
message = {
"attachments": [
{
"contentType": "application/vnd.microsoft.card.adaptive",
"content": {
"$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
"type": "AdaptiveCard",
"msteams": {"width": "Full"},
"version": "1.4",
"body": [
{
"type": "CodeBlock",
"codeSnippet": "/**\n* @author John Smith <john.smith@example.com>\n*/\npackage l2f.gameserver.model;\n\npublic abstract strictfp class L2Char extends L2Object {\n public static final Short ERROR = 0x0001;\n\n public void moveTo(int x, int y, int z) {\n _ai = null;\n log(\"Shouldn't be called\");\n if (1 > 5) { // what!?\n return;\n }\n }\n}",
"language": "java",
"startLineNumber": 61
},
{
"type": "Image",
"url": "https://aka.ms/Fo983c",
}
],
},
}
]
}
response = requests.post(
url=webhook_url,
data=json.dumps(message),
headers={"Content-Type": "application/json"},
)
body の中でTextBlock
ではなくそれぞれ別の要素としてCodeBlock
とImage
を定義して送信してみます。
非常に見やすい形で送信できました。
まとめ
Teams の Incoming Webhook と Workflows で使えるマークダウンを確認してみました。マークダウンだけでみると、Workflows の TextBlock では使えないものが多いためそのまま移行は難しそうです。
廃止までにはまだ時間がありますが、単純な移行ではなく調整が必要になることを認識しておきましょう。