iT邦幫忙

2025 iThome 鐵人賽

DAY 8
0
IT 管理

《把瑣事交給 n8n:零基礎自動化工作流實戰》系列 第 8

Day 08: 【n8n x Discord】打造你的個人天氣管家:智慧高溫提醒

  • 分享至 

  • xImage
  •  

在 Day 6,我們學會了如何使用 HTTP Request 節點,像個專業的食材採購商一樣,從中央氣象署的 API 獲取了龐大的原始天氣資料。但這些資料就像一整箱未經處理的食材,混亂且難以閱讀,靜靜地躺在我們的 n8n 廚房裡。

之前新聞摘要的範例中,新聞的摘要我們是利用AI節點來替我們整理,並且用 Gmail 將摘要完的信件寄送到信箱中。今天,我們會用其他方式來處理,並且改成利用 Discord 來發送消息!

今天我們將學習如何從複雜的 JSON 中,提煉出我們需要的資料,過程中會用到我們之前學過的Edit Fields節點,以及新的 IfAggregateCode 節點,最後將一則高溫提醒訊息,自動發送到你的 Discord 頻道!

這將是一個整合社群平台、並具備邏輯判斷力的工作流。讓我們開始吧!


一、前置作業

在我們開始動手料理氣象數據之前,有兩項重要的準備工作:確保我們能獲取到原始數據,以及設定好將訊息送達 Discord 的通道。

1.1 確認氣象局 API 數據來源 (Day 6 複習)

我們將繼續使用 Day 6 設定好的 HTTP Request 節點來獲取中央氣象署的數據。請確保你的 HTTP Request 節點已經配置妥當,能夠成功取得臺北市文山區(當然也可以自己挑你要的地區)的天氣預報資料。如果你不確定,可以回顧 Day 6 的內容。
https://ithelp.ithome.com.tw/upload/images/20250922/20178017hNb2kWWW3y.png

中央氣象署不同的資訊會有不同的URL 以及設定方式,可以依照自己的需求去使用。可以發現回傳了非常多的資料,但格式、層級非常的複雜,我通常會用 Schema 檢視模式來查看資料,可以很清楚知道現在資料的架構長什麼樣子。

像上圖中,我們獲得了文山區未來三天的天氣預報,但這裡面其實包含了非常多的天氣資訊,如:溫度、露點、天氣概況…等等(上面沒有截到,但都放在WeatherElement這個列表裡面)。

如果只是要建立高溫提醒,我們只需要溫度的資料就好,所以我們會利用各種節點來做資料的篩選。

1.2 建立 Discord Webhook (你的專屬送餐口)

Webhook,你可以想像成在網路世界(Web)裡掛上一個鉤子 (Hook)。一旦有事件發生(例如快遞送到),這個鉤子就會自動把資料掛過來,直接送進你的系統,不需要你不斷去「刷新查詢」。
就像在廚房門口掛了一個外送鈴:有人送菜來(事件發生),鈴聲一響,你馬上就能收到食材(資料)。
而有趣的是,你也可以反過來,當菜做好時,把它掛在別人家門口的鉤子上,主動送出通知。
今天用到的 Webhook 就是我們把它掛勾到 Discord 的頻道上,讓我們將 n8n 處理完的訊息傳遞到 Discord的頻道中(其實他本質上就是一個 HTTP POST 請求

過去我們都將料理送到 Email,今天我們要送到一個更即時、更方便的社群平台:Discord。要讓 n8n 能對指定的頻道「說話」,最簡單的方式就是使用 Discord Webhook。它就像你在 Discord 頻道裡開了一個專屬的「送餐口」,n8n 可以直接將訊息「丟」進去。

詳細步驟如下:

A. 進入伺服器設定:在你的 Discord 伺服器中,選擇你想要發送通知的頻道,然後點擊頻道名稱旁邊的齒輪圖標進入「編輯頻道(頻道設定)」。(截圖中有我之前測試的結果,可以忽略🤣)
https://ithelp.ithome.com.tw/upload/images/20250922/20178017cGsGtjMv19.png

B. 選擇整合選項:在左側選單中,找到並點擊「整合 (Integrations)」。
https://ithelp.ithome.com.tw/upload/images/20250922/20178017jLZhZuDOCe.png

C. 建立 Webhook:點擊「 Webhook」後,進入Webhook頁面,點選「新Webhook (Create Webhook)」。你可以為它命名(例如:「n8n天氣管家」),選擇頭像,然後點擊「複製 Webhook URL (Copy Webhook URL)」。請務必妥善保管這個 URL,它是你發送訊息的唯一憑證!
https://ithelp.ithome.com.tw/upload/images/20250922/20178017W6QZjvABB2.png

D. 新增 Discord Webhook Credential (也可以在設定DC節點時再新增):
回到 n8n,「Create Credential」 → 選擇「Discord Webhook」→ 將剛剛複製的Webhook URL 貼到Webhook URL 中 → Save
https://ithelp.ithome.com.tw/upload/images/20250922/20178017XrexJ2ZsTl.png

https://ithelp.ithome.com.tw/upload/images/20250922/20178017L0LfeUbuNA.png


二、工作流全貌:文山區高溫提醒助理

在我們深入每個節點的細節之前,先來看看這個「文山區高溫提醒助理」的完整工作流是長什麼樣子的。它從獲取原始數據,經過多步篩選與處理,最終發出智慧提醒。
https://ithelp.ithome.com.tw/upload/images/20250922/20178017GUzCwmFPHb.png


三、工作流建構步驟

現在,讓我們一步一步來打造這個強大的自動化工作流!

步驟 1:觸發與原始數據獲取 (延續 Day 6,Trigger 與 HTTP Request 節點)

  1. When clicking "Execute workflow" (手動觸發器)
    • 功能:用於手動啟動工作流,方便我們在開發和測試階段快速檢查結果。
    • 設定:保持預設即可。後續要固定每天執行一次可再改為Schedule Trigger
  2. HTTP Request (獲得溫度資料)
    • 功能:向中央氣象署 API 發送請求,獲取臺北市各行政區的未來天氣預報。
    • 設定:請參考 Day 6 的教學,確保 MethodGETURLQuery (Authorization、Location…等,可以參考中央氣象署官方文件) 已正確配置。

如同前面提到,你會發現 HTTP Request 節點輸出的是一份非常龐大且巢狀的 JSON 資料。它包含了文山區的各種天氣元素(溫度、降雨機率、風速等),且每個元素的時間軸都包裝得很深。這正是我們需要後續節點來「料理」的原因!
如果想要其他的資訊,只要後續資料處理時選擇自己想要的就可以了!

步驟 2:初次篩選 — 只保留溫度數據(Edit Fields 節點)

  1. Edit Fields 節點
    • 目標:我們已經獲得了「文山區」數據,但包含很多天氣資訊,但我們只需要溫度的資料,因此要篩選出只與「溫度」相關的元素。
    • 設定:
      • 新增 Edit Fields 節點
      • Mode 中選擇 Manual Mapping
      • Name 設為 Wenshan_Weather_Temp (或其他你喜歡的名稱)。
      • Value 欄位可以手動填表達式:{{ $json.records.Locations[0].Location[0].WeatherElement[0] }},或是直接將溫度的weatherElement 直接拖曳到Value欄位中。
        https://ithelp.ithome.com.tw/upload/images/20250922/20178017s4MhtSwKlN.png
    • 執行節點後,會發現輸出的資料剩下溫度的。雖然還是有點多層,但可以看出來有時間點和溫度的資料了

這邊篩選的流程會取決於資料長什麼樣子,因此看懂資料跟清楚自己要的資料在哪裡是非常重要的。我會善用各種資料檢視模式來看懂,每種檢視模式都有其用途。

步驟 3:數據扁平化 — 將時間軸拆分成獨立項目(Split 節點)

  1. Split Out (Time/Item) 節點
    • 功能:將一個 Item 中包含所有時間點的溫度預報,我們想把每個時間點拆成獨立的 Item,使得每個 Item 代表一個時間點的溫度預報。這對於後續的判斷和處理非常關鍵。
    • 設定:
      • Field to Split Out 輸入我們在上一步中溫度的欄位名稱並加上.TimeWenshan_Weather_TempData.Time ,或使用拖曳的方式,將 Schema 檢視模式情況下,將Time直接拖曳過去
      • 執行節點後,會發現變成56個 item 了,每個 item 裡面會包含時間點以及溫度。
        https://ithelp.ithome.com.tw/upload/images/20250922/20178017j7uuD5BlkA.png

知識點:Split Out 節點的核心價值
原始數據中,不同時間點的溫度預報都包在同一個 time 陣列裡,作為一個 Item 的一部分。當我們需要針對每個時間點進行判斷(例如「哪個時間點會高溫?」),就必須將它們拆開。Split Out 節點就是做這件事的,它能將一個 Item 內部的一個陣列,轉換為多個獨立的 Item,讓每個單獨的時間點預報都能被後續節點獨立處理。

要分解什麼,取決於資料的格式以及需求,像這邊是因為中央氣象署將所有時間點的所有溫度全部包在 Time 這個欄位裡面,所以我們才要去拆解它。如果他本身就拆開了,就不需要這一步。

步驟 4:精簡數據 — 只保留時間與溫度(Edit Fields 節點)

  1. Edit Fields 2 (Time&Temp) 節點
    • 功能:上一步拆分後,會發現包含了時間點(DataTime)以及溫度資訊,但是溫度被包在其他其他 Object 裡面,非常不直觀。我們想要再更精簡,只保留我們最關心的「時間」、以及「溫度」。
    • 設定:
      • Mode 選擇 Manual Mapping。
      • 新增兩個欄位,並用表達式提取對應的值:
        • Name: Time, Value: {{ $json.DataTime }}
        • Name: Temp, Value: {{ $json.elementValue[0].Temperature }}
        • Name 的地方可以自行命名;Value 的地方可以手打,也可以用拖曳的方式
          https://ithelp.ithome.com.tw/upload/images/20250922/2017801705Tglnhuts.png

知識點:多層次數據提取
這裡我們Edit Fields節點,直接從 Split Out 節點輸出的每個 Item 中,提取出 DataTime、 elementValue 陣列中的第一個 value (即溫度值)。這使得每個 Item 都變得非常簡潔,易於後續判斷。
這個步驟是將我們想要的資料去進行重構,讓我們、可以輕易解讀這些資料。這樣一來,我們的每個 item 就只會有兩個 Key : 時間、溫度。

步驟 5:判斷高溫 — 篩選器(If 節點)

  1. IF (>30) 節點

    • 功能:這是我們天氣提醒管家的「大腦」,我們想檢查每個時間點的溫度,是否達到我們設定的高溫門檻,篩選出高於門檻溫度的時間點
    • 設定:
      • Value 1: 選擇 Expression,填入 {{ $json.temp.ToNumber() }} (即每個時間點的溫度值)。因為原始資料的溫度是用字串的形式儲存,因此我們需要將它轉成數字才可以比大小
      • Operation: 選擇 Number -> is Greater Than (大於)。
      • Value 2: 填入你的高溫門檻,例如 30 (表示大於 30 度算高溫)。
    • 執行節點後,可以發現本來有很多個時間點的溫度資料,但只有 7 個是符合我們高溫的定義
      https://ithelp.ithome.com.tw/upload/images/20250922/20178017g5Kpz2BGzZ.png

    https://ithelp.ithome.com.tw/upload/images/20250922/20178017dAoTFt4Ccb.png

    • 在工作流上,可以看到有幾個 item 符合/不符合我們對高溫的定義,因為我們只想針對 true 的那些時間點做處理,所以我們接下來的節點會接在 true 分之後面。後續若 true、false各自走不同的處理,可以分別在兩個分支去接想要用的節點。

知識點:
IF 節點的條件判斷IF 節點會針對每個輸入的 Item 獨立進行判斷。如果 Item 符合條件,就會從 true 分支輸出;如果不符合,則從 false 分支輸出。這樣我們就能將所有的高溫預報,與非高溫預報區分開來。
除了比較數字之外,也可以比較各種資料,如字串是否相同、是否包含某些字串...等等,有非常多種條件可以比較。同時也可以設定多個條件,並設定是 and(都符合)或是 or (符合至少一個)。

步驟 6:彙整高溫時間點 — 準備生成提醒訊息(Aggregate 節點)

  1. Aggregate 節點
    • 功能:現在我們有了一堆獨立的高溫 Item。為了將它們整理成一則提醒訊息,我們可以將這些 Item 再次「彙總」起來,變成一個單一的 Item,但其內部包含所有高溫預報的列表。
    • 設定:
      • Aggregate 選擇 Individual Fields
      • Fields to AggregateInput Field Name 分別填入時間、溫度的欄位名稱
      • 執行後,會發現這個節點幫我們把 7 個高溫的時間點、溫度的數據,分別整理在一起了
        https://ithelp.ithome.com.tw/upload/images/20250922/20178017qGsCLlk9e2.png

知識點:Aggregate 節點的「彙總」能力
Aggregate 節點是將多個 Item 合併為單一 Item 的強力工具。當我們需要將前面 IF 節點篩選出來的所有高溫預報,全部集中到一個 Item 內部,以便後續統一處理和生成訊息時,Aggregate 就能派上用場。它會把所有的 Item 壓縮到新 Item 的一個陣列(通常是 items 鍵)中。
Aggregate 節點也有另外一種是將 All item data 合併成單一一個List,可以嘗試玩玩看並觀察有什麼不同。

步驟 7:生成最終提醒訊息 (Code 節點)

  1. Code in JavaScript 節點
    • 功能:運用 JavaScript 程式碼的強大彈性,將 Aggregate 節點彙整後的所有高溫預報,格式化成一段易讀、適合 Discord 發布的提醒文字。

    • 設定:JavaScript

      • Code 節點中貼入以下程式碼:
      const data = items[0].json;
      const times = data.Time;
      const temps = data.Temp;
      
      let message = "未來三天高溫(高於30度)注意提醒:\n";
      
      const formatterDate = new Intl.DateTimeFormat("zh-TW", {
        month: "2-digit",
        day: "2-digit",
        timeZone: "Asia/Taipei"
      });
      const formatterTime = new Intl.DateTimeFormat("zh-TW", {
        hour: "2-digit",
        minute: "2-digit",
        hour12: false,
        timeZone: "Asia/Taipei"
      });
      
      for (let i = 0; i < times.length; i++) {
        const dt = new Date(times[i]); // 原始 ISO 含 +08:00
        const dateStr = formatterDate.format(dt);
        const timeStr = formatterTime.format(dt);
      
        message += `${dateStr} ${timeStr}:高溫 ${temps[i]} 度\n`;
      }
      
      message += "請注意高溫並補充水分!";
      
      return [{ json: { message } }];
      

https://ithelp.ithome.com.tw/upload/images/20250922/20178017IcuRkZHoAL.png

  • 執行後,會發現他幫我將資料整理成一則訊息了

知識點-Code 節點的進階應用
Code 節點是 n8n 的超級工具人,當現有節點無法滿足你的複雜數據處理需求時,JavaScript 就能派上用場。這裡我們將送來的「文山區所有高溫時段數據」,用我們設定好的日期時間格式逐一整理成一段架構清楚且易讀的文字訊息,最終交給 Discord 機器人去廣播。它讓原本雜亂的數據,變得更加清晰!

如果不知道 Code 要怎麼打,可以去詢問 AI,告訴他你的輸入格式、需求、輸出要求,請他給你相關的程式碼,他就會給你能夠將資料進行處理的程式碼了。
像上面的程式碼,我是詢問 ChatGPT 的,詳細的prompt 如下:

在n8n中,假設我在將資料處理後(由一個Aggregate節點輸出)得到的格式如下(list 裡面的項目數不一定固定,這是篩選過後的): [ { "Time": [ "2025-09-24T12:00:00+08:00", "2025-09-25T12:00:00+08:00", "2025-09-25T15:00:00+08:00" ], "Temp": [ "33", "34", "33" ] } ] 我想要整理成一則高溫提醒的天氣訊息: 「未來三天高溫注意提醒: XXX(時段一):高溫XXX度(氣溫一) XXX(時段二):高溫XXX度(氣溫二) XXX(時段三):高溫XXX度(氣溫三) ....看有幾個時段 請注意高溫並補充水分! 」 請問要怎麼做?

步驟 8:發送 Discord 高溫提醒(Discord Send A Message 節點)

  1. Discord 節點 (或 HTTP Request 節點)
    • 功能:將最終生成的高溫提醒訊息,透過 Webhook 發送到指定的 Discord 頻道。
    • 設定 (新增 Discord Send A Message 節點):
      • Connection Type: 選擇 Webhook
      • Credential for Discord Webhook: 選擇前面 1.2 我們設好的Credential,如果還沒有新增,也可以從這邊新增。
      • Operation: 選擇 Send a message
      • Message: 將前面 Code 節點的 message 欄位拉到這個欄位,或手動輸入:{{ $json.message }} (記得要換成 Expression)
        https://ithelp.ithome.com.tw/upload/images/20250922/20178017GiW8jU6t6G.png
    • 執行後,節點會output ”success”:true 的資料。同時,最前面設定Webhook的文字頻道也會發送高溫注意提醒。
      https://ithelp.ithome.com.tw/upload/images/20250922/20178017hY3WqblJiG.png

知識點:Discord Webhook 的運用
Discord 節點(本質上也是封裝了 HTTP Request)允許我們以 POST 請求的方式,將 JSON 數據發送到 Webhook URL。因為這個 Webhook URL 是綁在我們設定的天氣提醒的文字頻道,我們就可以在該頻道中看到高溫提醒的訊息。

步驟 9:設定定時發送訊息的時間

一切都測試成功後,就可以把最前面的 Trigger 換成定時的 Trigger,並將工作流設為 Active 後,之後就會自動發送高溫提醒消息到你的 Discord 頻道了!


四、工作流變化

恭喜你完成了今天的自動化 Discord 高溫提醒工作流!現在,你已經掌握了 n8n 最核心的「數據獲取、處理、判斷、發送」四大能力。回顧一下,今天的工作流與我們 Day 4、5 打造的新聞摘要工作流,其實有著異曲同工之妙,也展現了 n8n 更深層次的彈性:

  1. 資訊來源: 過去是 RSS Read 節點,現在是 HTTP Request 節點,能從更多元的網路服務獲取數據。
  2. 資訊整理: 過去利用 AI 節點 進行摘要,現在則透過 Edit FieldsSplitIFAggregate 這些節點組合,實現了精準的數據清洗、重塑與邏輯判斷。
  3. 資訊發送: 過去是 Gmail 節點,現在則進化到 Discord 節點,將訊息送達到更即時的社群平台。

這正是 n8n 最迷人的地方!節點的設計與排列組合,完全取決於你想客製化自動化的需求。你可以將這些技能想像成積木,現在你已經學會了許多不同形狀和功能的積木,接下來要怎麼堆疊、組裝,完全由你決定!

  • 舉一反三: 你可以嘗試將新聞資訊發送到 Discord 上。
  • 進階篩選: 將新聞進行分類,只篩出你感興趣的類別來寄送。
  • 多元提醒: 不再只篩選溫度,也可以篩選降雨機率、空氣品質等,打造更多元的天氣或環境提醒。
  • 跨平台整合: 如果想把高溫提醒傳到 Line 是否可行?(偷偷小暴雷:後面我們會提到 Line Message API 的設定方式,以及更多 Webhook 的進階使用方法!)

工作流的設計可謂千變萬化。現在,你可以開始思考自己生活中是否有類似「重複做」且「耗時」的動作,嘗試用今天學到的知識去挑戰自動化它!


五、結語與明日預告

今天我們從龐大的氣象數據中,篩選出文山區的高溫預報,然後將高溫的時間點篩選出來,並整理成一個高溫提醒發送到你的 Discord 頻道。你的個人天氣管家已經正式上線!

今天的文章讓我們深入了解了 n8n 強大的數據處理與邏輯判斷能力。我們學會了如何使用 Edit FieldsCode 精準地清洗和轉換數據,並透過 Split OutAggregate 靈活地重塑數據結構,最後用 IF 節點做出關鍵決策。

我們目前所打造的工作流很會「對內溝通」—— 向我們自己回報各種大小事。但如果,我們想讓它學會「對外溝通」,自動化地向世界發布訊息,甚至幫我們管理品牌、與粉絲互動呢?

接下來,我們將正式進入全新的篇章:【行銷管理篇】!我們將把第一週學到的所有基礎技能,延伸到一個更廣闊、更具商業價值的領域。而我們的第一個挑戰,就是攻克目前最主流、也最具挑戰性的社群平台之一 —— Facebook

明天,我們將一步步帶你完成 Facebook for Developers 的繁瑣設定,成功取得 Facebook Credential 。並且在未來的日子,透過 n8n 在你的粉絲專頁上,發布貼文(例如之前做好的新聞摘要或是高溫提醒。

準備好讓你的 n8n 助理學會更多應對之道了嗎?我們明天見!


上一篇
Day 07: 【第一週回顧】目前學了什麼?
系列文
《把瑣事交給 n8n:零基礎自動化工作流實戰》8
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言