ChatGPT Image 2025年10月30日 下午04_26_46.png

🪄 前言:為什麼要改?

螢幕擷取畫面 2025-10-30 11.png

微軟在 2025 年底確定淘汰舊的 **Microsoft Teams Incoming Webhook (O365 Connector)**,

並將通知機制整合進 Power Automate / Teams Workflow

這代表以前那條

1
https://company.webhook.office.com/webhookb2/...

的 URL 將不再維護,你需要改成新的:

1
https://environment.api.powerplatform.com/powerautomate/automations/direct/workflows/...

幸好,轉換並不難。

目前通知機制的流程為: GCP Pub/Sub ⇒ Cloud Function(Python ) ⇒ Webhook(URL) ⇒ Teams

需要修改的部分為:
✔️ Cloud Function(Python ):調整腳本程式碼

✔️ Webhook(URL) : 改為 從 Teams 中的 Power Automate / Workflow產生的URL

✅ 總結比較

類型 舊 Webhook 新 Workflow
URL 網域 webhook.office.com environment.api.powerplatform.com
傳輸格式 HTML 文字 Adaptive Card JSON
顏色/樣式 HTML tag RichTextBlock / TextRun
成功回應 200 202
顯示效果 純文字 支援紅字、粗體、連結、動作

⚙️ 教學步驟:簡化版 Payload 實作

Step 1. 在 Python 端修改程式碼

這裡的核心是把舊 webhook 換成 Workflow URL,

並將原本 "text": "..." 的結構改為 "text": [ {...}, {...} ] 陣列格式。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import requests

# 🆕 新 Workflow Webhook URL
webhook_url = "https://environment.api.powerplatform.com/powerautomate/automations/direct/workflows/..."

headers = {'Content-Type': 'application/json'}

payload ={
"text": [
{"title": "🚀 GCP Pub/Sub 通知", "content": "測試訊息"},
{"title": "🔥 第二則訊息", "content": "Hello Power Automate!"}
]
}
response = requests.post(webhook_url, headers=headers, json=payload)
print(response.status_code, response.text)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import requests

# 🆕 新 Workflow Webhook URL
webhook_url = "https://environment.api.powerplatform.com/powerautomate/automations/direct/workflows/..."

headers = {'Content-Type': 'application/json'}

payload = {
#原本的text格式為以下內容
#"text": f"<b style='color:red;'>【{log_level}】</b> <b>[{project_id}]</b> - {service_name} <br><br> <b>錯誤訊息</b> : {error_msg}<br> <b>詳細資訊</b>:<a href='{url}' style='color:red;'>{url}</a>"

#修改text為以下的資料結構
"text": [
{
"title": f"🚨 【{log_level}】 [{project_id}] - {service_name}",
"content": f"**錯誤訊息**:{error_msg}\n**詳細資訊**:{url}"
}
]
}

response = requests.post(webhook_url, headers=headers, json=payload)
print(response.status_code, response.text)

💡 為什麼用陣列?

因為 Workflow 可以使用「Apply to each」自動對每筆資料重複貼出一張卡片。

這對 Pub/Sub 一次推多筆事件特別實用。


Step 2. 建立 Teams Workflow

下圖是Workflow的工作流程示意圖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
┌──────────────────────────────────────┐
│ When a Teams webhook request received│
│ (接收 Python 發送的 JSON) │
└──────────────┬───────────────────────┘

┌──────────────▼──────────────┐
│ Apply to each │
│ Items = @triggerBody()?['text'] │
└──────────────┬──────────────┘

┌──────────────▼──────────────┐
│ Post adaptive card in Teams │
│ (使用 Flow bot 發送) │
└─────────────────────────────┘

1️⃣ 打開 Microsoft Teams → Workflows

螢幕擷取畫面 2025-10-30 1.png

2️⃣ 點選上方[建立]欄位後,點選[收到webhook要求時發布在頻道中(Post to a channel when a webhook request is received)]的範本

螢幕擷取畫面 2025-10-30 2.png

3️⃣填入該通知設定的流程名稱

螢幕擷取畫面 2025-10-30 3.png

4️⃣設定要通知的團隊(Teams)與頻道(Channel),這是階層的關係(團隊內的某個頻道)

螢幕擷取畫面 2025-10-30 4.png

5️⃣儲存後複製 HTTP POST URL → 貼回 Python 的 webhook_url

螢幕擷取畫面 2025-10-30 5.png


Step 3. Workflow 動作設定

1️⃣回到Microsoft Teams → Workflows → 首頁,選取剛建立的工作流程並編輯
螢幕擷取畫面 2025-10-30 6.png
螢幕擷取畫面 2025-10-30 6.png
2️⃣執行以下步驟

  1. [選取先前步驟的輸出] (標記1)中輸入:@triggerBody()?['text']
  2. 在 Adaptive Card 欄位中(標記2)貼上
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
{
"type": "AdaptiveCard",
"$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
"version": "1.5",
"body": [
{
"type": "TextBlock",
"text": "@{items('Send_each_adaptive_card')?['title']}",
"weight": "Bolder",
"size": "Large"
},
{
"type": "TextBlock",
"text": "@{items('Send_each_adaptive_card')?['content']}",
"wrap": true
}
]
}

{
"type": "AdaptiveCard",
"$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
"version": "1.5",
"body": [
{"type": "TextBlock", "text": "@{items('Send_each_adaptive_card')?['title']}", "weight": "Bolder"},
{"type": "TextBlock", "text": "@{items('Send_each_adaptive_card')?['content']}", "wrap": true}
]
}

📎 小技巧:

若拿到的程式碼中拿到預設的內容是items('Apply_to_each')
在存檔時應該會出現Flow 報錯 Apply_to_each 不存在,

這時請將items('Apply_to_each')把上面 JSON 改成items('Send_each_adaptive_card')

3️⃣正確填完應該為以下結果,就可以按存檔完成流程建立

螢幕擷取畫面 2025-10-30 9.png

4️⃣測試後會在Teams指定的接收通知頻道收到以下結果

螢幕擷取畫面 2025-10-30 10.png


💬 結語:適合誰用?

這個簡化版本最適合:

  • 想快速替換舊 webhook 的告警機制與通知流程的系統
  • 不需要自訂卡片樣式,只想要文字通知
  • 使用 Pub/Sub、CI/CD job、排程系統做提醒

只要兩步就能搞定新 Workflow 的轉換,未來如果想升級樣式(html的顏色/字樣…等),只要把 JSON 改成 RichTextBlock 即可,會另寫一篇提供[完整版Payload 實作]

前言

因之前業務上的介接踩到json開頭有Bom表標記符號的坑,想到之前也有遇到檔案內ASCII/Unicode/UTF-8編碼間轉換的坑,因此決定要來搞清楚這些編碼的前世今生與編碼原理了。
畢竟字符編碼就是電腦技術中傳遞訊息的基石

閱讀全文 »

前言

因目前公司舊專案有升版需求(.net core 2.2 => .net 8),在尋找跨越多版本這個鴻溝解方時,發現微軟有提供相關的升版套件 [.NET Upgrade Assistant] 讓我們升版的流程變得更無痛。

閱讀全文 »

前言

有時在工作情境中需要手動執行SQL語法更新含有中文字時,難免會遇到明明程式執行的時候一樣的中文字有正常顯示,但手動執行SQL語法時,一樣的中文字卻變成了問號(?)。

閱讀全文 »

前言

目前使用ChatGPT的互動方式是與AI用一問一答的方式分解自己待解決的問題,近期使用的AutoGPT則是有能力去設想你的問題需要什麼,自主搜集資料生成訴求,幫你與ChatGPT在互動中提出一連串的問題,來解決你的問題。

閱讀全文 »