文章摘要:n8n 是一款開源低代碼工作流自動化平臺,通過可視化拖放節點創建復雜工作流,無需大量代碼。具有強大集成能力、數據轉換、錯誤處理等功能,適用于數據同步、客戶關系管理、IT 自動化等場景。相比 Zapier、IFTTT 等工具,n8n 開源免費且擴展性強,支持自定義節點和容器化部署。未來有望加強與人工智能等技術融合,提升用戶體驗和數據安全防護。
目錄
引言
一、n8n 是什么
二、n8n 的主要功能
2.1 工作流自動化
2.2 豐富的集成能力
2.3 觸發器和動作
2.4 數據轉換
2.5 錯誤處理
2.6 調試和日志記錄
三、n8n 的技術原理
3.1 節點和連接
3.2 事件驅動
3.3 數據流
3.4 并行和順序執行
3.5 容器化
3.6 Webhook 和 REST API
四、n8n 的應用場景
4.1 數據同步
4.2 客戶關系管理
4.3 IT 自動化
五、n8n 與其他類似工具對比
5.1 工具對比
5.2 代碼案例
六、如何使用 n8n
6.1 安裝 n8n
6.2 創建工作流
6.3 調試與優化
七、總結與展望
引言
在數字化時代的浪潮下,工作流自動化已成為提升效率、降低成本的關鍵手段,它能夠將企業從繁瑣的重復性任務中解放出來,專注于更具創造性和戰略性的工作 。想象一下,每天花費大量時間在手動數據錄入、文件傳輸和任務提醒這些機械性操作上,不僅效率低下,還容易出錯。而工作流自動化工具的出現,就像是為我們的工作流程按下了 “快進鍵”,讓這些繁瑣的任務能夠自動執行,大大提高了工作效率。
在眾多工作流自動化工具中,n8n 以其獨特的優勢脫穎而出,成為了許多企業和開發者的首選。它不僅功能強大,而且易于使用,能夠幫助我們輕松實現各種復雜的工作流自動化任務。接下來,就讓我們一起深入了解 n8n 這款神奇的工具吧!
一、n8n 是什么
n8n 是一款開源且功能強大的低代碼工作流自動化平臺,它允許用戶通過可視化界面,以拖放節點的方式輕松創建復雜的自動化工作流 ,而無需編寫大量代碼。其名稱中的 “n” 代表著 “無數”,寓意著它能夠連接無數的應用和服務,實現各種各樣的自動化任務。n8n官網地址:https://n8n.io/
n8n 的核心在于其獨特的節點(Node)概念。每個節點都代表了一個特定的操作或功能,比如發送郵件、讀取數據庫數據、調用 API 等等 。用戶只需要將這些節點按照業務邏輯連接起來,就可以構建出復雜的工作流。例如,你可以創建一個工作流,當在 GitHub 上有新的代碼提交時,自動觸發測試流程,測試通過后發送通知郵件給團隊成員 。這種可視化的操作方式,大大降低了工作流自動化的門檻,讓非技術人員也能輕松上手。n8n官方開源地址:https://github.com/n8n-io/n8n
此外,n8n 擁有極其豐富的集成能力,支持超過 500 種應用程序和服務的集成 ,涵蓋了從社交媒體平臺(如 Facebook、Twitter )、辦公軟件(如 Microsoft Excel、Google Sheets )、云存儲(如 Dropbox、Google Drive )到企業級應用(如 Salesforce、SAP )等各個領域。這使得它能夠輕松打破不同系統之間的數據孤島,實現數據的無縫流轉和業務流程的自動化。
二、n8n 的主要功能
2.1 工作流自動化
n8n 的工作流自動化功能十分強大,能夠幫助用戶輕松創建復雜的自動化流程。以一個簡單的社交媒體發布工作流為例,當你在 WordPress 上發布新文章時,希望自動將文章分享到 Twitter 和 Facebook ,以擴大內容的傳播范圍。在 n8n 中,你只需創建一個工作流,添加 WordPress 觸發器節點,設置為當有新文章發布時觸發 ;然后連接 Twitter 和 Facebook 的發布節點,配置好相應的認證信息和發布內容格式,即可實現這一自動化任務 。這樣,每次發布新文章時,無需手動操作,n8n 會自動將文章分享到指定的社交媒體平臺。
再比如,一個電商企業的訂單處理工作流。當有新訂單產生時,n8n 可以自動從訂單系統中獲取訂單信息,檢查庫存是否充足。如果庫存充足,自動更新庫存數量,并將訂單信息發送到物流系統安排發貨;如果庫存不足,自動發送通知給采購部門補貨,并給客戶發送庫存不足的通知郵件 。這個工作流涉及多個系統和復雜的條件判斷,通過 n8n 的可視化界面,用戶可以輕松將各個節點連接起來,實現訂單處理的全自動化。
2.2 豐富的集成能力
n8n 支持集成的應用和服務超過 500 種,這使得它能夠滿足各種不同的業務需求 。在辦公領域,它可以與 Microsoft Excel、Google Sheets 集成,實現數據的自動同步和處理。例如,將 Google Sheets 中的銷售數據自動同步到企業的 CRM 系統中,以便銷售人員隨時查看和跟進 。在社交媒體方面,除了前面提到的 Twitter 和 Facebook ,它還支持與 Instagram、LinkedIn 等平臺集成,幫助企業實現社交媒體的統一管理和運營。
在云存儲領域,n8n 與 Dropbox、Google Drive 、OneDrive 等集成,方便用戶進行文件的自動備份和同步。比如,當你在本地完成一份重要文檔的編輯后,n8n 可以自動將其備份到 Google Drive ,確保數據的安全性和可訪問性。此外,對于企業級應用,n8n 能夠與 Salesforce、SAP 等深度集成,實現業務流程的自動化和數據的無縫流轉。例如,在 Salesforce 中創建新客戶時,自動在 SAP 系統中創建相應的客戶檔案和銷售訂單 。
2.3 觸發器和動作
觸發器是工作流的啟動條件,它可以基于各種事件來觸發工作流的執行 。常見的觸發器包括定時觸發器、Webhook 觸發器和事件觸發器等。定時觸發器允許用戶設置工作流在特定的時間間隔或時間點執行,比如每天凌晨 2 點自動執行數據備份任務 。Webhook 觸發器則是當接收到來自外部系統的 HTTP 請求時觸發工作流,例如,當 GitHub 上有新的代碼提交時,通過 Webhook 通知 n8n 觸發自動化測試流程 。事件觸發器則是基于特定應用或服務內部的事件來觸發,如郵件客戶端收到新郵件時觸發工作流。
動作是工作流中執行的具體操作,每個動作節點都對應著一個特定的功能 。例如,發送郵件動作節點可以用于發送通知郵件,讀取文件動作節點可以從指定位置讀取文件內容,調用 API 動作節點可以向外部 API 發送請求并獲取響應數據 。當觸發器被觸發后,與之關聯的動作節點會按照工作流的設計順序依次執行,從而實現自動化任務的完成。
2.4 數據轉換
在工作流運行過程中,數據往往需要進行各種處理和轉換,以滿足不同節點和服務的需求 。n8n 提供了豐富的數據轉換功能,用戶可以使用內置的表達式和函數對數據進行篩選、合并、格式化等操作 。例如,在一個從數據庫中讀取數據并發送郵件通知的工作流中,可能需要對讀取到的數據進行篩選,只選擇符合特定條件的數據發送郵件 。n8n 的篩選功能可以通過設置條件表達式來實現,如選擇銷售額大于 10000 的數據記錄 。
數據合并也是常見的需求,比如將來自多個數據源的數據合并成一個數據集進行分析。在 n8n 中,可以使用合并節點將不同節點輸出的數據按照指定的規則進行合并 。此外,對于數據格式的轉換,n8n 同樣得心應手。例如,將日期格式從 “YYYY-MM-DD” 轉換為 “MM/DD/YYYY”,或者將文本數據轉換為 JSON 格式等 。這些數據轉換功能確保了數據在工作流中的準確和順暢流動。
2.5 錯誤處理
n8n 擁有完善的錯誤處理機制,這對于保證工作流的穩定運行至關重要 。當工作流執行過程中出現錯誤時,n8n 會捕獲錯誤信息,并根據用戶預設的規則進行處理 。其中,重試機制是一種常見的處理方式,當某個節點執行失敗時,n8n 可以自動重試一定次數,以應對可能的臨時性錯誤,如網絡波動導致的 API 調用失敗 。如果重試多次后仍然失敗,n8n 可以發送錯誤通知給相關人員,通知方式可以是郵件、短信或者即時通訊工具,確保問題能夠及時被發現和解決 。
此外,n8n 還支持跳過當前出錯步驟繼續執行后續流程的功能 。這在一些情況下非常有用,比如在處理一批數據時,如果某條數據處理出錯,但不希望影響其他數據的處理,可以選擇跳過該條數據,繼續處理下一條,保證整個工作流的連續性 。通過這些靈活的錯誤處理機制,n8n 大大提高了工作流的可靠性和穩定性。
2.6 調試和日志記錄
在工作流開發過程中,調試工具是必不可少的,n8n 提供了強大的調試功能,幫助用戶快速定位和解決問題 。用戶可以在工作流設計界面中,使用調試按鈕啟動調試模式 。在調試模式下,工作流會以單步執行的方式運行,用戶可以查看每個節點的輸入和輸出數據,以及節點執行的詳細信息,從而判斷問題出在哪里 。例如,如果某個節點沒有輸出預期的數據,可以在調試模式下查看該節點的輸入數據是否正確,以及節點的配置是否有誤 。
同時,n8n 的日志記錄功能也非常詳細,它會記錄工作流的每一次運行信息,包括執行時間、觸發事件、節點執行結果、錯誤信息等 。這些日志信息可以在日志管理界面中查看,用戶可以通過分析日志來監控工作流的運行狀態,了解工作流的執行歷史,以及排查潛在的問題 。對于一些復雜的工作流,通過查看日志可以清晰地了解數據的流向和處理過程,為優化工作流提供重要依據 。
三、n8n 的技術原理
3.1 節點和連接
在 n8n 中,節點是工作流構建的基本單元,每個節點都代表著一個特定的操作或數據點 。比如,HTTP Request 節點可以用于向指定的 API 發送請求,獲取數據;Google Sheets 節點能夠對 Google 表格中的數據進行讀取、寫入和修改等操作 。這些節點就像是一個個功能模塊,各自具備獨特的功能,等待用戶根據業務需求進行組合。
當我們創建一個工作流時,通過連接線將不同的節點串聯起來,就像搭建一條生產流水線一樣 。連接線不僅明確了節點之間的執行順序,還承擔著數據傳遞的重要職責 。例如,在一個數據處理工作流中,我們可以使用 HTTP Request 節點從某個 API 獲取數據,然后通過連接線將這些數據傳遞給 JSON Parse 節點進行解析,解析后的結果再傳遞給后續的節點進行進一步處理 。這樣,通過節點和連接線的有機組合,就形成了完整的工作流邏輯,實現了復雜業務流程的自動化處理。
3.2 事件驅動
n8n 的工作流執行是基于事件驅動的原理,這意味著工作流不是隨時都在運行,而是由特定的事件觸發啟動 。常見的觸發事件包括接收到 HTTP 請求、達到設定的定時時間、外部系統通過 API 調用觸發等 。以 HTTP Request 觸發器節點為例,當 n8n 接收到來自外部系統發送到指定 URL 的 HTTP 請求時,與之關聯的工作流就會被觸發執行 。假設我們有一個電商訂單處理的工作流,當新訂單產生時,電商系統會向 n8n 發送一個 HTTP 請求,n8n 接收到這個請求后,立即觸發訂單處理工作流,開始執行后續的操作,如獲取訂單信息、檢查庫存、安排發貨等 。
再比如定時任務觸發器,我們可以設置一個工作流每天凌晨 3 點自動執行數據備份任務 。到了設定的時間,定時任務觸發器會觸發工作流,工作流中的各個節點開始依次執行,將需要備份的數據進行整理和存儲,確保數據的安全性和完整性 。這種事件驅動的機制,使得 n8n 能夠根據實際業務需求實時響應,提高了自動化流程的靈活性和實用性,避免了資源的浪費 。
3.3 數據流
數據流是 n8n 工作流運行的核心機制,它描述了數據在節點之間的流動和處理過程 。當一個節點接收到輸入數據后,會根據自身的功能對數據進行相應的處理,然后將處理結果作為輸出傳遞給下一個節點 。例如,在一個數據分析工作流中,CSV File 節點讀取 CSV 文件中的數據,這些數據作為輸入傳遞給 Filter 節點 。Filter 節點根據用戶設定的條件對數據進行篩選,只保留符合條件的數據記錄,然后將篩選后的結果傳遞給 Chart 節點 。Chart 節點再根據接收到的數據生成可視化的圖表,最終輸出給用戶查看 。
這種數據流驅動的方式,使得工作流能夠根據不同的輸入數據動態生成相應的輸出,實現多樣化的業務邏輯 。而且,n8n 提供了豐富的數據處理和轉換功能,用戶可以在節點之間對數據進行各種操作,如篩選、合并、格式化、計算等 。這使得數據在流動過程中能夠不斷被加工和優化,以滿足不同業務場景的需求 。比如,在一個營銷活動數據分析工作流中,我們可以對從不同渠道收集到的數據進行清洗和合并,然后計算各種營銷指標,如轉化率、點擊率等,最后將分析結果生成報表,為營銷決策提供有力支持 。
3.4 并行和順序執行
n8n 的工作流設計非常靈活,支持并行和順序執行兩種方式,以適應不同的業務邏輯需求 。對于一些相互獨立、不依賴于其他節點執行結果的節點,可以設置為并行執行 。例如,在一個內容發布工作流中,我們需要將一篇文章同時發布到多個社交媒體平臺,如微信公眾號、微博、抖音 。這三個發布節點之間相互獨立,沒有先后順序的依賴關系,我們可以將它們設置為并行執行 。這樣,n8n 會同時向這三個平臺發送發布請求,大大提高了工作流的執行效率,縮短了整體運行時間 。
而對于存在先后依賴關系的節點,則需要按照順序依次執行 。比如在一個文件處理工作流中,首先需要使用 File Read 節點讀取文件內容,然后將讀取到的內容傳遞給 Text Processing 節點進行文本處理,最后將處理后的結果傳遞給 File Write 節點寫入到新的文件中 。這三個節點之間存在明顯的先后順序,必須按照順序依次執行,才能確保數據處理的準確性和邏輯性 。通過靈活運用并行和順序執行,n8n 能夠高效地處理各種復雜的業務流程,滿足不同用戶的需求 。
3.5 容器化
n8n 支持基于 Docker 的容器化部署,這為其帶來了諸多顯著的優勢 。首先,容器化部署保證了環境的一致性 。無論在開發、測試還是生產環境中,n8n 都能在相同的容器化環境中運行,避免了因環境差異導致的問題 。例如,開發人員在本地開發環境中使用 Docker 容器部署 n8n,測試人員可以直接使用相同的容器鏡像在測試環境中進行測試,確保了測試結果的準確性和可重復性 。在生產環境中,也可以使用相同的容器鏡像進行部署,減少了因環境配置不一致而引發的故障風險 。
其次,容器的可移植性使得 n8n 能夠輕松部署到不同的服務器或云平臺上 。用戶可以根據自身需求,將 n8n 容器部署到物理服務器、虛擬機或者各種云服務提供商(如 AWS、Azure、Google Cloud )的云服務器上 。這種靈活性方便了用戶進行靈活的資源配置和擴展 。比如,當業務量增長時,用戶可以輕松地將 n8n 容器部署到更多的服務器上,實現水平擴展,提高系統的處理能力 。同時,容器化部署還簡化了 n8n 的安裝和升級過程,用戶只需要拉取最新的容器鏡像并重新啟動容器,就可以完成 n8n 的升級,大大降低了運維成本 。
3.6 Webhook 和 REST API
為了方便與外部系統進行交互,n8n 提供了 Webhook 和 REST API 支持 。Webhook 是一種實時的 HTTP 回調機制,通過 Webhook,外部系統可以在特定事件發生時向 n8n 發送通知,觸發相應的工作流執行 。例如,當 GitHub 上有新的代碼提交時,GitHub 可以通過 Webhook 向 n8n 發送一個包含提交信息的 HTTP 請求,n8n 接收到這個請求后,觸發與之關聯的自動化測試工作流,自動對新提交的代碼進行測試 。這種方式實現了不同系統之間的實時通信和協作,使得 n8n 能夠及時響應外部事件,實現業務流程的自動化 。
REST API 則允許外部系統與 n8n 進行更深入的交互 。外部系統可以通過 REST API 查詢 n8n 工作流的狀態、獲取執行結果,甚至創建和修改工作流 。比如,一個企業的內部管理系統可以通過 REST API 獲取 n8n 中某個工作流的執行結果,并將這些結果展示在管理系統的界面上,方便管理人員查看 。開發人員也可以使用 REST API 編寫腳本,自動創建和修改 n8n 的工作流,實現更高級的自動化操作 。通過 Webhook 和 REST API,n8n 實現了與其他系統之間的深度集成和雙向通信,進一步拓展了其應用場景和功能 。
四、n8n 的應用場景
4.1 數據同步
在當今數字化的工作環境中,數據往往存儲在多個不同的系統和平臺中,實現這些數據的同步是許多企業面臨的挑戰 。n8n 憑借其強大的自動化能力,能夠輕松實現數據庫與云存儲之間的數據同步 。
以 MySQL 數據庫與 Google Drive 云存儲為例,假設一家企業的業務數據存儲在 MySQL 數據庫中,為了確保數據的安全性和可訪問性,需要定期將數據庫中的數據備份到 Google Drive 。使用 n8n,我們可以創建一個自動化工作流來實現這一目標 。首先,添加 MySQL 觸發器節點,設置定時觸發條件,比如每天凌晨 1 點觸發 。當觸發條件滿足時,MySQL 節點從數據庫中讀取需要備份的數據 。然后,將這些數據傳遞給 Google Drive 的文件創建節點,在 Google Drive 中創建一個新的文件,并將從 MySQL 讀取的數據寫入該文件 。這樣,每天凌晨 1 點,n8n 都會自動執行這個工作流,將 MySQL 數據庫中的數據備份到 Google Drive ,實現了數據的定期同步和備份 。
在這個過程中,n8n 不僅能夠按照預定的時間進行數據同步,還能對數據進行處理和轉換 。例如,如果數據庫中的數據格式不符合 Google Drive 存儲的要求,n8n 可以在數據傳輸過程中,使用數據轉換節點對數據進行格式化處理,確保數據能夠準確無誤地存儲到 Google Drive 中 。通過這種方式,n8n 大大提高了數據同步的效率和準確性,減少了人工干預,降低了出錯的風險 。
4.2 客戶關系管理
在客戶關系管理(CRM)中,n8n 可以發揮重要作用,幫助企業自動化處理客戶信息、跟進和反饋等流程,提升客戶服務質量和工作效率 。
當企業通過各種渠道(如網站表單、電子郵件、社交媒體 )收集到客戶信息時,n8n 可以自動將這些信息整合到 CRM 系統中 。例如,當客戶在企業網站上填寫聯系表單后,表單數據會通過 Webhook 發送到 n8n 。n8n 接收到數據后,使用 CRM 集成節點(如 Salesforce 節點)將客戶信息自動錄入到 CRM 系統中,并根據客戶的來源和填寫的信息,自動為客戶打上相應的標簽 。這樣,銷售人員可以在 CRM 系統中快速查看和管理新客戶信息,無需手動錄入,節省了大量時間和精力 。
在客戶跟進方面,n8n 可以根據預設的規則自動發送跟進郵件或短信 。比如,當客戶與企業進行初次溝通后的 3 天內,如果沒有進一步的互動,n8n 會自動觸發發送一封跟進郵件,詢問客戶是否還有疑問或需要進一步的幫助 。郵件內容可以根據客戶之前的溝通記錄和需求進行個性化定制 。同時,n8n 還可以監控客戶對跟進郵件的回復情況,如果客戶回復了郵件,n8n 可以自動將回復內容同步到 CRM 系統中,并提醒銷售人員及時處理 。
對于客戶反饋,n8n 同樣能夠實現自動化處理 。當客戶通過郵件或在線客服提交反饋后,n8n 可以自動將反饋信息提取出來,并根據反饋的類型和緊急程度,將其分配給相應的客服人員 。客服人員處理完反饋后,n8n 可以自動發送滿意度調查郵件給客戶,收集客戶對處理結果的評價 。通過這些自動化流程,n8n 能夠有效提升客戶關系管理的效率和質量,增強客戶滿意度和忠誠度 。
4.3 IT 自動化
在 IT 領域,n8n 在服務器管理、任務調度等場景中有著廣泛的應用,能夠幫助 IT 團隊實現自動化運維,提高系統的穩定性和可靠性 。
在服務器管理方面,假設企業有多個服務器,需要定期檢查服務器的運行狀態,如 CPU 使用率、內存使用率、磁盤空間等 。使用 n8n,我們可以創建一個工作流,添加定時觸發器,設置為每小時觸發一次 。當觸發條件滿足時,n8n 通過 SSH 節點連接到各個服務器,執行相應的命令獲取服務器的運行狀態信息 。然后,將這些信息傳遞給數據分析節點,對數據進行分析和處理 。如果發現某個服務器的 CPU 使用率超過 80%,n8n 可以自動發送警報郵件或短信給 IT 管理員,通知其及時處理 。同時,n8n 還可以將服務器的運行狀態數據存儲到數據庫中,方便后續的查詢和分析 。
在任務調度方面,n8n 可以幫助 IT 團隊自動化執行各種重復性的任務 。例如,每天凌晨 3 點需要在服務器上執行一次數據備份任務,然后將備份文件傳輸到遠程存儲服務器 。使用 n8n,我們可以創建一個工作流,添加定時觸發器設置為凌晨 3 點觸發 。工作流觸發后,首先通過 SSH 節點在服務器上執行數據備份命令,生成備份文件 。接著,使用文件傳輸節點(如 SFTP 節點)將備份文件傳輸到遠程存儲服務器 。如果傳輸過程中出現錯誤,n8n 可以自動重試一定次數,并在重試失敗后發送錯誤通知給 IT 管理員 。通過這樣的自動化任務調度,n8n 大大減輕了 IT 團隊的工作負擔,提高了任務執行的準確性和可靠性 。
五、n8n 與其他類似工具對比
5.1 工具對比
在工作流自動化領域,除了 n8n,還有一些其他備受關注的工具,如 Zapier、IFTTT 等 。下面從功能、價格、易用性、擴展性等方面,對 n8n 與這些類似工具進行對比,以便大家更清晰地了解 n8n 的優勢。
從功能層面來看,Zapier 是一款知名的自動化工具,集成能力出色,支持連接數千種應用 。它在數據傳輸方面表現優秀,能夠快速地在不同應用之間傳遞數據 。IFTTT 則以簡單的 “如果這樣,那么那樣” 邏輯為核心,適合創建簡單的自動化任務 。而 n8n 的功能十分全面,不僅擁有豐富的集成選項,支持超過 500 種應用和服務的集成,還具備強大的數據處理和復雜邏輯編排能力 。例如,在處理數據時,n8n 可以使用內置的表達式和函數對數據進行篩選、合并、格式化等操作 ,而 Zapier 和 IFTTT 在這方面的功能相對較弱 。在工作流設計上,n8n 的節點和連接方式更加靈活,能夠構建出非常復雜的工作流,滿足各種復雜業務場景的需求 。
價格方面,Zapier 的免費版每月僅提供 100 次任務執行,若要升級,最低價格為每月 20 美元,含 750 次任務 ,對于需要處理大量任務的用戶來說,成本較高 。IFTTT 的免費用戶只能保存 3 個自動化(Applets) ,含有 AI 功能的升級方案則需要每月 5 美元 。相比之下,n8n 最大的優勢在于它是開源的,用戶可以自行搭建和部署,無需支付額外的軟件使用費用 。雖然 n8n 也提供官方托管服務,但如果用戶具備一定的技術能力,使用自托管方式可以大大降低成本 ,這對于個人開發者和預算有限的小型企業來說,具有很大的吸引力 。
在易用性上,Zapier 擁有簡潔的用戶界面和直觀的操作流程,新手用戶能夠快速上手 。IFTTT 的操作也較為簡單,通過簡單的條件設置即可創建自動化任務 。n8n 同樣提供了可視化的界面,以拖放節點的方式創建工作流,對于有一定技術基礎的用戶來說,上手難度不大 。而且,n8n 還提供了豐富的模板和活躍的社區支持,用戶可以參考社區中的模板和經驗分享,快速創建自己的工作流 。此外,n8n 的文檔也非常詳細,對于用戶在使用過程中遇到的問題,能夠提供及時的幫助和指導 。
擴展性上,Zapier 主要依賴于其內置的集成接口,用戶可以使用這些接口連接各種應用,但對于一些特殊需求,可能需要編寫自定義代碼來實現 。IFTTT 的擴展性相對有限,主要側重于簡單的自動化場景 。n8n 則具有很強的擴展性,它支持用戶創建自定義節點 。這意味著如果用戶有特殊的應用或服務需要集成,或者需要實現特定的功能,可以通過編寫自定義節點來滿足需求 。同時,n8n 基于 Docker 的容器化部署方式,也方便用戶進行擴展和升級,能夠輕松部署到不同的服務器或云平臺上 ,適應不同的業務規模和發展需求 。
綜上所述,n8n 在功能、價格、易用性和擴展性等方面都展現出了獨特的優勢 。尤其是對于那些追求開源、低成本、高度自定義和強大功能的用戶來說,n8n 無疑是一個非常理想的選擇 。
5.2 代碼案例
(1)n8n/jest.config.js
const { pathsToModuleNameMapper } = require('ts-jest');
const { compilerOptions } = require('get-tsconfig').getTsconfig().config;/** @type {import('ts-jest').TsJestGlobalOptions} */
const tsJestOptions = {isolatedModules: true,tsconfig: {...compilerOptions,declaration: false,sourceMap: true,},
};const isCoverageEnabled = process.env.COVERAGE_ENABLED === 'true';const esmDependencies = ['pdfjs-dist','openid-client','oauth4webapi','jose',// Add other ESM dependencies that need to be transformed here
];const esmDependenciesPattern = esmDependencies.join('|');
const esmDependenciesRegex = `node_modules/(${esmDependenciesPattern})/.+\\.m?js$`;/** @type {import('jest').Config} */
const config = {verbose: true,testEnvironment: 'node',testRegex: '\\.(test|spec)\\.(js|ts)$',testPathIgnorePatterns: ['/dist/', '/node_modules/'],transform: {'^.+\\.ts$': ['ts-jest', tsJestOptions],[esmDependenciesRegex]: ['babel-jest',{presets: ['@babel/preset-env'],plugins: ['babel-plugin-transform-import-meta'],},],},transformIgnorePatterns: [`/node_modules/(?!${esmDependenciesPattern})/`],// This resolve the path mappings from the tsconfig relative to each jest.config.jsmoduleNameMapper: compilerOptions?.paths? pathsToModuleNameMapper(compilerOptions.paths, {prefix: `<rootDir>${compilerOptions.baseUrl ? `/${compilerOptions.baseUrl.replace(/^\.\//, '')}` : ''}`,}): {},setupFilesAfterEnv: ['jest-expect-message'],collectCoverage: isCoverageEnabled,coverageReporters: ['text-summary', 'lcov', 'html-spa'],workerIdleMemoryLimit: '1MB',
};if (process.env.CI === 'true') {config.collectCoverageFrom = ['src/**/*.ts'];config.reporters = ['default', 'jest-junit'];config.coverageReporters = ['cobertura'];
}module.exports = config;
(2)n8n/pageage.json
{"name": "n8n-monorepo","version": "1.99.0","private": true,"engines": {"node": ">=22.16","pnpm": ">=10.2.1"},"packageManager": "pnpm@10.12.1","scripts": {"prepare": "node scripts/prepare.mjs","preinstall": "node scripts/block-npm-install.js","build": "turbo run build","build:backend": "turbo run build:backend","build:frontend": "turbo run build:frontend","build:nodes": "turbo run build:nodes","typecheck": "turbo typecheck","dev": "turbo run dev --parallel --env-mode=loose --filter=!@n8n/design-system --filter=!@n8n/chat --filter=!@n8n/task-runner","dev:be": "turbo run dev --parallel --env-mode=loose --filter=!@n8n/design-system --filter=!@n8n/chat --filter=!@n8n/task-runner --filter=!n8n-editor-ui","dev:ai": "turbo run dev --parallel --env-mode=loose --filter=@n8n/nodes-langchain --filter=n8n --filter=n8n-core","dev:fe": "run-p start \"dev:fe:editor --filter=@n8n/design-system\"","dev:fe:editor": "turbo run dev --parallel --env-mode=loose --filter=n8n-editor-ui","dev:e2e": "cd cypress && pnpm run test:e2e:dev","debug:flaky:e2e": "cd cypress && pnpm run test:flaky","dev:e2e:server": "run-p start dev:fe:editor","clean": "turbo run clean --parallel","reset": "node scripts/ensure-zx.mjs && zx scripts/reset.mjs","format": "turbo run format && node scripts/format.mjs","format:check": "turbo run format:check","lint": "turbo run lint","lintfix": "turbo run lintfix","lint:backend": "turbo run lint:backend","lint:nodes": "turbo run lint:nodes","lint:frontend": "turbo run lint:frontend","optimize-svg": "find ./packages -name '*.svg' ! -name 'pipedrive.svg' -print0 | xargs -0 -P16 -L20 npx svgo","start": "run-script-os","start:default": "cd packages/cli/bin && ./n8n","start:tunnel": "./packages/cli/bin/n8n start --tunnel","start:windows": "cd packages/cli/bin && n8n","test": "JEST_JUNIT_CLASSNAME={filepath} turbo run test","test:backend": "turbo run test:backend --concurrency=1","test:frontend": "turbo run test:frontend --concurrency=1","test:nodes": "turbo run test:nodes --concurrency=1","watch": "turbo run watch --parallel","webhook": "./packages/cli/bin/n8n webhook","worker": "./packages/cli/bin/n8n worker"},"devDependencies": {"@biomejs/biome": "^1.9.0","@n8n/eslint-config": "workspace:*","@types/jest": "^29.5.3","@types/node": "*","@types/supertest": "^6.0.3","babel-plugin-transform-import-meta": "^2.3.2","bundlemon": "^3.1.0","cross-env": "^7.0.3","jest": "^29.6.2","jest-environment-jsdom": "^29.6.2","jest-expect-message": "^1.1.3","jest-junit": "^16.0.0","jest-mock": "^29.6.2","jest-mock-extended": "^3.0.4","lefthook": "^1.7.15","nock": "^14.0.1","nodemon": "^3.0.1","npm-run-all2": "^7.0.2","p-limit": "^3.1.0","rimraf": "^5.0.1","run-script-os": "^1.0.7","supertest": "^7.1.1","ts-jest": "^29.1.1","tsc-alias": "^1.8.10","tsc-watch": "^6.2.0","turbo": "2.5.4","typescript": "*","zx": "^8.1.4"},"pnpm": {"onlyBuiltDependencies": ["sqlite3"],"overrides": {"@azure/identity": "^4.3.0","@types/node": "^20.17.50","chokidar": "^4.0.1","esbuild": "^0.24.0","multer": "^2.0.1","prebuild-install": "7.1.3","pug": "^3.0.3","semver": "^7.5.4","tar-fs": "2.1.3","tslib": "^2.6.2","tsconfig-paths": "^4.2.0","typescript": "^5.8.2","vue-tsc": "^2.2.8","google-gax": "^4.3.7","ws": ">=8.17.1","zod": "3.25.67"},"patchedDependencies": {"bull@4.16.4": "patches/bull@4.16.4.patch","pdfjs-dist@5.3.31": "patches/pdfjs-dist@5.3.31.patch","pkce-challenge@5.0.0": "patches/pkce-challenge@5.0.0.patch","@types/express-serve-static-core@5.0.6": "patches/@types__express-serve-static-core@5.0.6.patch","@types/ws@8.18.1": "patches/@types__ws@8.18.1.patch","@types/uuencode@0.0.3": "patches/@types__uuencode@0.0.3.patch","vue-tsc@2.2.8": "patches/vue-tsc@2.2.8.patch","eslint-plugin-n8n-local-rules": "patches/eslint-plugin-n8n-local-rules.patch","element-plus@2.4.3": "patches/element-plus@2.4.3.patch"}}
}
(3)n8n/codecov.yml
codecov:max_report_age: offrequire_ci_to_pass: truecoverage:status:patch: falseproject:default:threshold: 0.5github_checks:annotations: falseflags:tests:paths:- '**'carryforward: truecomponent_management:default_rules:statuses:- type: projecttarget: autobranches:- '!master'individual_components:- component_id: backend_packagesname: Backendpaths:- packages/@n8n/api-types/**- packages/@n8n/config/**- packages/@n8n/client-oauth2/**- packages/@n8n/decorators/**- packages/@n8n/constants/**- packages/@n8n/backend-common/**- packages/@n8n/backend-test-utils/**- packages/@n8n/db/**- packages/@n8n/di/**- packages/@n8n/imap/**- packages/@n8n/permissions/**- packages/@n8n/task-runner/**- packages/workflow/**- packages/core/**- packages/cli/**- component_id: frontend_packagesname: Frontendpaths:- packages/@n8n/codemirror-lang/**- packages/frontend/**- component_id: nodes_packagesname: Nodespaths:- packages/node-dev/**- packages/nodes-base/**- packages/@n8n/json-schema-to-zod/**- packages/@n8n/nodes-langchain/**statuses:- type: projecttarget: autothreshold: 0% # Enforce: Coverage must not decreaseignore:- (?s:.*/[^\/]*\.spec\.ts.*)\Z- (?s:.*/[^\/]*\.test\.ts.*)\Z- (?s:.*/[^\/]*e2e[^\/]*\.ts.*)\Z
六、如何使用 n8n
6.1 安裝 n8n
n8n 的安裝方式豐富多樣,其中 Docker 安裝和 npm 安裝是最為常見的兩種,以下為你詳細介紹這兩種安裝方式的步驟和注意事項。
如果你選擇使用 Docker 安裝 n8n,首先要確保你的系統中已經安裝了 Docker 。若尚未安裝,可前往 Docker 官方網站,根據系統類型下載并安裝對應的 Docker 版本 。安裝完成后,打開命令行工具,執行以下命令拉取 n8n 鏡像:
docker pull n8nio/n8n
拉取完成后,使用以下命令運行 n8n 容器:
docker run -it --rm \--name n8n \-p 5678:5678 \-v ~/.n8n:/home/node/.n8n \n8nio/n8n
在上述命令中,-p 5678:5678表示將容器內的 5678 端口映射到主機的 5678 端口 ,這樣我們就可以通過瀏覽器訪問http://localhost:5678來使用 n8n 。-v ~/.n8n:/home/node/.n8n則是將主機的~/.n8n目錄掛載到容器內的/home/node/.n8n目錄 ,用于數據的持久化存儲,防止容器重啟后數據丟失 。
使用 Docker 安裝 n8n 的優勢在于環境的一致性和便捷性,無論在何種操作系統上,只要安裝了 Docker,都能以相同的方式安裝和運行 n8n 。不過,需要注意的是,在生產環境中,可能需要對容器的資源限制、網絡配置等進行進一步優化 。同時,由于 Docker 鏡像會不斷更新,在更新鏡像時,要注意版本兼容性,避免因版本問題導致 n8n 無法正常運行 。
如果你對 Node.js 環境比較熟悉,也可以選擇使用 npm 安裝 n8n 。在安裝之前,要確保你的服務器或計算機上已經安裝了 Node.js ,并且建議安裝 n8n 官方文檔推薦的 Node.js 版本 。你可以通過訪問 Node.js 官方網站下載并安裝 。npm 通常會隨 Node.js 一起安裝,安裝完成后,可以在終端或命令提示符中運行npm -v來檢查 npm 是否已安裝及其版本 。
確認 Node.js 和 npm 安裝無誤后,在終端或命令提示符中運行以下命令來全局安裝 n8n:
npm install -g n8n
-g標志表示全局安裝,這樣你就可以在任何目錄下運行 n8n 命令 。安裝完成后,使用以下命令啟動 n8n 服務:
n8n start
默認情況下,n8n 會監聽http://localhost:5678 。在生產環境中,通常需要將 n8n 作為后臺服務運行,并在服務器重啟后自動啟動 。可以使用 pm2 等工具來實現這一目的 。首先全局安裝 pm2:
npm install -g pm2
然后使用 pm2 啟動 n8n:
pm2 start n8npm2 save # 保存當前進程列表,以便在服務器重啟后自動恢復pm2 startup # 配置pm2在系統啟動時自動啟動
使用 npm 安裝 n8n 的好處是可以更靈活地管理 n8n 的依賴和版本 。但需要自行管理 Node.js 運行環境,并且在安裝和更新過程中,可能會遇到依賴沖突等問題 。此外,在生產環境中,還需要配置反向代理(如 Nginx 或 Apache)來處理 SSL 證書、域名和端口轉發等 ,同時要確保服務器防火墻允許訪問配置的 n8n 端口(默認為 5678) 。
6.2 創建工作流
下面以創建一個簡單的郵件通知工作流為例,演示如何在 n8n 中添加觸發器、節點及配置參數的流程 。假設我們希望當 GitHub 上有新的代碼提交時,自動發送郵件通知相關人員 。
首先,登錄 n8n 的 Web 界面,在左側菜單欄中點擊 “Workflows”,然后點擊 “Create new workflow” 創建一個新的工作流 。進入工作流編輯界面后,在左側的節點列表中找到 “GitHub” 節點,將其拖拽到中間的畫布上 。在彈出的 “GitHub” 節點配置窗口中,點擊 “Create new credential”,輸入你的 GitHub 賬號和密碼,完成認證信息的配置 。配置完成后,在 “Events” 選項中選擇 “Push event”,表示當有代碼推送事件發生時觸發該節點 。
接下來,從節點列表中找到 “Email (SMTP)” 節點,將其拖拽到畫布上,并將 “GitHub” 節點與 “Email (SMTP)” 節點連接起來 。在 “Email (SMTP)” 節點配置窗口中,點擊 “Create new credential”,配置 SMTP 服務器的相關信息,包括發件人郵箱地址、密碼、SMTP 服務器地址和端口等 。配置完成后,在 “To” 字段中填寫收件人的郵箱地址,在 “Subject” 字段中填寫郵件主題,如 “GitHub 代碼提交通知” 。在 “Message” 字段中,可以使用 n8n 的表達式語法,引用 “GitHub” 節點傳遞過來的數據,例如,使用{{$node["GitHub"].json.commits[0].message}}來顯示最新一次代碼提交的信息 。
配置完成后,點擊工作流編輯界面右上角的 “Save” 按鈕保存工作流 。然后,點擊 “Execute workflow” 按鈕手動測試工作流,檢查是否能夠正常發送郵件 。如果一切正常,當 GitHub 上有新的代碼提交時,n8n 就會自動觸發這個工作流,將代碼提交信息通過郵件發送給指定的收件人 。
在創建工作流的過程中,要注意節點之間的連接順序和數據傳遞關系 。每個節點的配置參數都要根據實際需求進行準確設置,特別是涉及到認證信息和數據格式的部分 。同時,n8n 提供了豐富的節點和功能,可以根據不同的業務場景進行靈活組合和擴展 。例如,如果需要對代碼提交信息進行更復雜的處理,可以在 “GitHub” 節點和 “Email (SMTP)” 節點之間添加 “Function” 節點,使用 JavaScript 代碼對數據進行處理和轉換 。
6.3 調試與優化
在工作流開發過程中,調試是必不可少的環節 。n8n 提供了強大的調試工具,幫助我們快速排查問題 。當工作流出現異常時,首先可以在工作流編輯界面中,點擊畫布下方的 “Executions” 標簽,查看工作流的執行歷史記錄 。在執行記錄中,可以看到每個節點的執行狀態、輸入和輸出數據等信息 。如果某個節點執行失敗,會顯示相應的錯誤信息,根據這些信息可以初步判斷問題所在 。
此外,n8n 還支持單步調試功能 。在工作流編輯界面中,點擊需要調試的節點上的小箭頭圖標,即可進入單步調試模式 。在單步調試模式下,可以逐節點查看工作流的執行情況,檢查每個節點的輸入數據是否正確,節點的配置是否符合預期,以及節點的輸出數據是否滿足后續節點的需求 。通過這種方式,可以逐步定位到問題的根源 。
除了使用調試工具排查問題,根據日志進行工作流優化也是提高工作流性能和穩定性的重要手段 。n8n 的日志記錄非常詳細,包括工作流的觸發時間、執行時長、節點執行結果等信息 。通過分析這些日志,可以了解工作流的運行狀況,發現潛在的性能瓶頸和問題 。例如,如果發現某個工作流執行時間過長,可以檢查是否存在不必要的節點操作或數據處理步驟,嘗試優化節點配置或調整工作流邏輯,以提高執行效率 。
同時,還可以根據日志來優化錯誤處理機制 。如果某個節點經常出現錯誤,可以根據錯誤信息調整節點的配置或添加重試機制 。例如,對于因網絡波動導致的 API 調用失敗,可以設置節點在失敗后自動重試一定次數,提高工作流的容錯能力 。此外,還可以根據日志中的錯誤信息,針對性地發送錯誤通知,確保問題能夠及時得到處理 。通過不斷地調試和優化,能夠使 n8n 工作流更加穩定、高效地運行,滿足實際業務的需求 。
七、總結與展望
n8n 作為一款開源的工作流自動化平臺,以其獨特的優勢在數字化領域中展現出了巨大的價值 。它不僅功能強大,涵蓋了工作流自動化、豐富的集成能力、觸發器和動作、數據轉換、錯誤處理以及調試和日志記錄等多個關鍵功能 ,而且技術原理先進,通過節點和連接、事件驅動、數據流、并行和順序執行、容器化以及 Webhook 和 REST API 等技術,實現了高效、靈活的工作流自動化 。
在應用場景方面,n8n 在數據同步、客戶關系管理、IT 自動化等多個領域都有著出色的表現,能夠幫助企業和個人解決實際業務中的各種問題,提高工作效率和質量 。與其他類似工具相比,n8n 在功能的全面性、價格的優勢(開源免費)、易用性和擴展性等方面都具有競爭力 ,為用戶提供了更優的選擇 。
隨著數字化轉型的加速和企業對自動化需求的不斷增長,工作流自動化領域將迎來更廣闊的發展空間 。n8n 有望在未來持續創新和發展,進一步拓展其功能和應用場景 。例如,在人工智能和大數據技術不斷發展的背景下,n8n 可能會加強與這些技術的融合,實現更智能化的工作流自動化 。通過引入人工智能技術,n8n 可以自動分析工作流的執行數據,預測潛在的問題,并提供優化建議,從而進一步提高工作流的效率和可靠性 。
同時,n8n 也可能會不斷完善其用戶體驗,降低使用門檻,使更多非技術人員能夠輕松上手 。此外,隨著企業對數據安全和隱私的關注度不斷提高,n8n 在數據安全方面的表現也將成為其發展的關鍵因素之一 ,預計 n8n 會持續加強數據安全防護措施,確保用戶數據的安全和隱私 。相信在未來,n8n 將在工作流自動化領域發揮更加重要的作用,為企業和個人帶來更多的價值 。
解釋關鍵詞:
-
工作流自動化 :指利用工具或平臺,按照預設規則自動執行一系列任務和流程,減少人工干預,提高工作效率和準確性,如將新訂單信息自動發送給物流系統安排發貨。
-
低代碼 :指使用者無需編寫大量代碼,借助可視化界面、拖放等操作即可構建應用程序或工作流,使非技術人員也能輕松上手,像 n8n 通過拖放節點搭建工作流即體現了低代碼特點。
-
節點 :在 n8n 中是工作流構建的基本單元,每個節點代表特定操作或數據點,如 HTTP Request 節點用于向 API 發送請求獲取數據,通過連接節點可形成完整工作流邏輯。
-
集成能力 :指與不同應用、系統和服務進行連接和協同工作的能力,n8n 能集成超 500 種應用程序和服務,打破數據孤島,實現數據流轉和流程自動化。
-
觸發器 :工作流的啟動條件,基于特定事件觸發工作流執行,如定時觸發器可設定每天凌晨 2 點執行數據備份,Webhook 觸發器接收外部 HTTP 請求觸發流程。
-
動作 :工作流中執行的具體操作,對應特定功能節點,如發送郵件動作節點用于發送通知,讀取文件動作節點獲取文件內容。
-
數據轉換 :對數據進行篩選、合并、格式化等處理,以滿足不同節點和服務需求,如將日期格式由 “YYYY - MM - DD” 轉換為 “MM/DD/YYYY”。
-
錯誤處理 :包括重試機制、錯誤通知、跳過出錯步驟等功能,確保工作流穩定運行,如網絡波動致 API 調用失敗時自動重試,多次失敗后發送通知。
-
調試 :工作流開發中用于定位和解決問題,n8n 可單步執行查看節點輸入輸出和執行詳情,幫助判斷問題所在。
-
日志記錄 :記錄工作流運行信息,如執行時間、觸發事件、節點結果等,用于監控運行狀態、排查問題和優化流程。
-
容器化 :n8n 支持基于 Docker 的容器化部署,保證環境一致性,便于移植到不同服務器或云平臺,簡化安裝升級過程。
-
Webhook :一種實時 HTTP 回調機制,外部系統特定事件發生時向 n8n 發送通知,觸發工作流執行,實現系統間實時通信協作。
-
REST API :允許外部系統與 n8n 深入交互,可查詢工作流狀態、獲取結果,甚至創建修改工作流,拓展應用場景和功能。
-
開源 :n8n 的源代碼公開,用戶可自行搭建部署,無軟件使用費用,能根據需求定制修改,有活躍社區支持和豐富文檔。
-
擴展性 :指系統能適應業務增長和變化,通過擴展功能滿足更多需求,n8n 支持自定義節點和容器化部署,可靈活擴展適應不同業務規模。
博主還寫了與智能體相關文章,歡迎批評指正:?
AI?Agent實戰30篇目錄集綿:?
第一章?Agent基本概念【共7篇】
1、AI Agent 介紹(1/30)
2、AI Agent:重塑業務流程自動化的未來力量(2/30)
3、AI Agent 實戰:三步構建,七步優化,看智能體如何進入企業生產(3/30)
4、探秘 AI Agent 之 Coze 智能體:從簡介到搭建全攻略(4/30)
5、探秘多AI Agent模式:機遇、應用與未來展望(5/30)
6、探秘 AI Agent 之 Coze 智能體:工作流模式(6/30)
7、探秘 AI Agent 之 Coze 智能體:插件創建與使用(7/30)
第二章?Agent案例分析 【共8篇】
1、AI Agent案例全解析:百度營銷智能體(8/30)
2、AI Agent案例與實踐全解析:字節智能運維(9/30)
3、Agent 案例分析:金融場景中的智能體-螞蟻金服案例(10/30)
4、華為 AI Agent:企業內部管理的智能變革引擎(11/30)
5、微眾銀行金融場景 Agent:創新實踐與深度剖析(12/30)
6、京東物流營銷 Agent:智能驅動,物流新篇(13/30)
7、數勢科技:解鎖數據分析 Agent 的智能密碼(14/30)
8、南方電網場景中 Agent 的智慧賦能與創新實踐(15/30)
第三章?AI?Agent應用開發【6篇】
1、讓 Agent 具備語音交互能力:技術突破與應用前景(16/30)
2、探尋AI Agent:開啟知識圖譜自動生成新篇章(17/30)
3、解鎖AI Agent潛能:智能時代的信息處理利器(18/30)
4、解鎖Agent的數據分析潛能,開啟智能決策新時代(19/30)
5、解鎖AI Agent潛能:LLaMA3-1-8B-Instruct WebDemo部署實戰(20/30)
6、解鎖AI Agent潛能:Llama3_1-8B-Instruct與FastApi實戰(21/30)
第四章?多Agent框架【7篇】
1、探秘MetaGPT:革新軟件開發的多智能體框架(22/30)
2、單智能體入門:開啟智能新世界的鑰匙(23/30)
3、多 Agent 框架入門:開啟智能協作新時代(24/30)
4、探秘AutoGen框架:從入門到實踐的全攻略(25/30)
5、探秘AutoGen:模型配置與代碼執行全解析(26/30)
6、探索AutoGen:大模型時代的智能協作利器(27/30)
7、掌握AutoGen:輕松控制多Agent框架中的代理對話退出(28/30)
第五章?Agent與應用系統【1篇】
1、當AI Agent遇上CRM:客戶關系管理的智能化變革(29/30)
第六章?智能體工具【1篇】
1、Text2Sql:開啟自然語言與數據庫交互新時代(30/30)
本文關聯文章:
1、Windows10安裝Docker Desktop(大媽看了都會)?
2、02-pycharm詳細安裝教程(大媽看了都會)
3、Git 代碼提交注釋管理規范
4、代碼管理Git官方推薦使用客戶端工具SourceTree
5、解釋 Git 的基本概念和使用方式。
6、postman介紹、安裝、使用、功能特點、注意事項
7、2024年最新版IntelliJ IDEA下載安裝過程(含Java環境搭建)
8、CodeGeeX一款基于大模型全能的智能編程助手
9、從0到1:Dify AI智能體部署與使用全攻略
10、探索RAGFlow:解鎖生成式AI的無限潛能(2/6)
11、AI Agent 之 Coze 智能體,從簡介到搭建全攻略(3/6)
12、FastGPT:開啟大模型應用新時代(4/6)
13、解鎖n8n:開啟工作流自動化的無限可能(5/6)