在軟體開發中,將「經常變動的資料」與「相對固定的處理邏輯」分開,是一個非常重要的設計原則。
Google Sheets 正是扮演「資料層」的完美角色。它免費、易用,任何人都可以透過簡單的表格操作,來更新我們系統的「知識庫」,而完全不需要碰 n8n 的工作流。
我們的流程將會進化,在接收到交易後,會先去 Google Sheets 讀取最新的地址標籤庫,然後才進行後續的處理。
本日新工作流:
Webhook
→ Google Sheets (讀取標籤庫)
→ Code (整合資料與標記)
→ Switch
→ **Discord
**s...
(示意圖:新的 Google Sheets 節點將串接在 Webhook 之後,成為我們系統的外部知識庫)
Address
):錢包或合約地址。Label
):我們為這個地址取的易懂名稱。Category
):地址的分類,例如 Exchange
或 DeFi
。Address | Label | Category |
---|---|---|
0x28c6c06298d514db089934071355e5743bf21d60 |
Binance 14 | Exchange |
0xf977814e90da44bfa03b6295a0616a897441acec |
Binance 8 | Exchange |
0x503828976d22510aad0201ac792873a52524375a |
Coinbase 10 | Exchange |
0x68b3465833fb72a70ecdf485e0e4c7bd8665fc45 |
Uniswap V3 Router | DeFi |
0x7a250d5630b4cf539739df2c5dacb4c659f2488d |
Uniswap V2 Router | DeFi |
Webhook
節點之後,新增一個 Google Sheets
節點。Credential
欄位,選擇「Create New」,並按照 n8n 的引導,完成 Google 帳號的 OAuth 授權。Sheet
。Read
。Sheet1
)。Read as Key/Value Pairs
,這能讓輸出的資料格式更乾淨。Code
節點 (整合外部與內部資料)這是今天最關鍵的一步。我們要改造昨天的 Code
節點,讓它同時處理兩份資料:一份是 Webhook
傳來的交易資料,另一份是 Google Sheets
傳來的標籤庫資料。
Code
節點。在 Google Sheets
節點後,新增一個新的 Code
節點。// --- 1. 獲取兩個不同來源的資料 ---
// 獲取 Webhook 節點 (觸發點) 的資料
const webhookData = $getExecution().trigger.json;
// 獲取上一個節點 (Google Sheets) 的資料
const addressBookItems = $input.all();
// --- 2. 建立「動態」的地址標籤庫 ---
// 建立一個空的地址字典
const knownAddresses = {};
// 遍歷從 Google Sheets 讀取到的每一行資料
for (const item of addressBookItems) {
// 將地址轉換為小寫,作為字典的 key
const address = item.json.Address.toLowerCase();
// 將標籤作為字典的 value
const label = item.json.Label;
// 存入字典
knownAddresses[address] = label;
}
// --- 3. 解析交易資料,並用「動態標籤庫」進行比對 ---
const activity = webhookData.event?.activity?.[0] || {};
const tx = {
from: activity.fromAddress || '未知地址',
to: activity.toAddress || '未知地址',
value: parseFloat(activity.value) || 0,
asset: activity.asset || '未知代幣',
hash: activity.hash || 'N/A',
};
// 準備一個新的 JSON 物件來存放加工後的資料
const outputJson = { ...webhookData };
// 使用我們動態建立的標籤庫來賦予標籤
outputJson.fromTag = knownAddresses[tx.from.toLowerCase()] || "未知錢包";
outputJson.toTag = knownAddresses[tx.to.toLowerCase()] || "未知錢包";
outputJson.tx = tx;
// 建立一個新的 n8n 資料項來回傳
const newItem = { json: outputJson };
// 最後,回傳這個全新的資料項,給後續的 Switch 節點使用
return newItem;
$getExecution().trigger.json
用來拿最源頭的 Webhook
資料,$input.all()
用來拿上一層 Google Sheets
的資料。for
迴圈,將 Google Sheets 的多行資料,動態地轉換成我們需要的「地址字典」物件。最棒的是:我們昨天設定的 Switch
節點和多個 Discord
節點,完全不需要做任何修改!因為它們本來就是依賴 fromTag
和 toTag
這兩個欄位來運作的,而我們剛剛的新 Code
節點,依然忠實地產生了這兩個欄位。
這就是「關注點分離」設計原則的威力!
恭喜!今天你完成了一次架構上的巨大飛躍。你的告警系統不再是一個寫死的機器,而是一個可以透過外部 Google Sheets 動態更新知識的智慧系統。
現在,任何團隊成員,只要在那個 Google Sheets 文件中新增一行,例如加入一個新的駭客地址並標記為「Hacker」,你的 n8n 系統就會在下一次執行時,自動學會辨識這個新地址,完全不需要你再動一行程式碼。