跳轉到

n8n LINE Bot 與 Line Webhook 教學

這章專門教你把 LINE Messaging API 接進 n8n,並用你剛安裝的 n8n-nodes-linewebhook community node 做出第一個 LINE Bot。

這章適合什麼時候學

  • 你已經會 n8n 的基本操作
  • 你想把 LINE 當成 workflow 的輸入口或通知出口
  • 你想做最小可用的 LINE 回聲機器人
  • 你想理解 LINE webhook、replyToken、userId 各自代表什麼

先看整體地圖

LINE Bot 在 n8n 裡,通常不是「一個 node 解決全部」,而是三層結構:

  1. 接收事件:Line Webhook
  2. 組裝訊息:Line Message
  3. 送出或查詢:Line Messaging API

你可以把它想成:

LINE 使用者傳訊息 -> LINE 平台 -> n8n Webhook -> 你的邏輯 -> 回覆 LINE 使用者

所以 LINE Bot 的重點不只是「會回話」,而是你要知道資料在哪一層被接收、整理、判斷、送出。

想一想

很多人第一次學 LINE Bot,會把焦點全放在「怎麼回一則訊息」。這當然重要,但那只是最後一步。真正更關鍵的是,你要先分清楚 LINE 在整個流程裡扮演什麼角色。它可能是聊天入口、通知出口、表單替代介面、群組事件來源,甚至只是某個流程的最後一哩。當你先想清楚 LINE 在流程中的位置,你就不會只把它當成一個聊天工具,而會開始把它看成 workflow 的一個節點。

初學時你也很容易把 replyTokenuserIdgroupId 混在一起。其實它們的用途完全不同。replyToken 是這次事件回覆用的短期憑證,userId 是辨識使用者的對象 ID,groupId 是群組的對象 ID。搞懂這些欄位,比死記某個節點畫面更有價值。因為一旦你知道每個欄位在流程裡代表什麼,就算換成 HTTP Request 自己打 API,你也不會迷路。

1. 這個 community node 到底提供什麼

你安裝的套件 n8n-nodes-linewebhook 主要提供三個節點:

1. Line Webhook

用途: - 接收 LINE 傳進來的事件 - 驗證 LINE signature - 依事件類型把資料分流到不同輸出

支援的輸出類型: - text - audio - sticker - image - video - location - postback - join - leave - memberJoined - memberLeft

2. Line Message

用途: - 把你要送出去的內容組成 LINE message object

可組的訊息類型: - Text - Image - Audio - Video - Location - Sticker - Flex

3. Line Messaging API

用途: - 回覆訊息 - 主動推播 - 取回多媒體內容 - 查使用者或群組資料

支援的操作: - Send Message - Multicast Message - Get Message Content - Get User Profile - Get Group Chat Summary - Get Group Chat Member User IDs - Get Group Chat Member Profile

2. 先準備 LINE 端的必要資訊

你至少要準備兩種 credential:

A. Webhook 用 credential

用途: - 驗證 x-line-signature

你要準備: - Channel Secret

B. Messaging API 用 credential

用途: - 發送回覆或主動推播

你要準備: - Channel Access Token

在 LINE Developers Console 的實務流程通常是:

  1. 建立一個 Messaging API channel
  2. 拿到 Channel secret
  3. 建立或複製 Channel access token
  4. 在 LINE 後台把 webhook URL 指到你的 n8n webhook

2. 5 從零到測通的完整設定流程

如果你要真的把這套跑起來,建議照下面四段做,不要跳步。

步驟 1. 在 n8n 內建立 LINE credentials

你需要建立兩組 credential。

A. lineWebhookAuthApi

用途: - 驗證 LINE 傳來的 webhook signature

你要填: - Channel Secret

取得位置: - LINE Developers Console - 進入你的 Messaging API channel - 找 Channel secret

B. lineMessagingAuthApi

用途: - 回覆訊息 - 主動推播 - 查使用者與群組資料

你要填: - Channel Access Token

取得位置: - LINE Developers Console - 進入 Messaging API 頁面 - 建立或複製 Channel access token

n8n 內實際操作

  1. 打開 workflow
  2. Line Webhook
  3. 在 credential 下拉選單建立 lineWebhookAuthApi
  4. 填入 Channel Secret
  5. 再點 Line Messaging API
  6. 建立 lineMessagingAuthApi
  7. 填入 Channel Access Token

如果這一步沒做完,workflow 匯入成功也不能真的收發 LINE 訊息。

步驟 2. 把本機 n8n 對外公開

如果你的 n8n 是本機:

http://localhost:5678

LINE 平台是連不到的,所以你一定要先有公開網址。

方法 A. 用 cloudflared

如果你機器上已裝 cloudflared,可以先跑:

cloudflared tunnel --url http://localhost:5678

你會拿到一個像這樣的網址:

https://xxxx.trycloudflare.com

方法 B. 用 ngrok

ngrok http 5678

你會拿到一個像這樣的網址:

https://xxxx.ngrok-free.app

你的 LINE webhook URL 會長成

如果 Line WebhookPath 是:

line-echo-demo

那最終 webhook URL 通常是:

https://你的公開網址/webhook/line-echo-demo

注意: - 不是 localhost - 不是 n8n 編輯頁 URL - 是 workflow webhook 路徑

步驟 3. 在 LINE Developers Console 設定 webhook

你要做的事

  1. 打開 LINE Developers Console
  2. 進入你的 Messaging API channel
  3. 找到 Webhook URL
  4. 貼上:
https://你的公開網址/webhook/line-echo-demo
  1. Verify
  2. 成功後把 Use webhook 打開

如果 Verify 失敗,先檢查這四件事

  1. n8n workflow 是否已啟用
  2. Line Webhook 的 path 是否真的叫 line-echo-demo
  3. 公開網址是否還活著
  4. lineWebhookAuthApi 裡的 Channel Secret 是否正確

一個實務提醒

如果你用的是臨時 tunnel 網址,例如 ngrok 免費版或 trycloudflare,每次重開可能都會變網址。網址一變,LINE 後台也要一起更新。

步驟 4. 實際測通 LINE Echo Bot

測試順序

  1. 在 n8n 啟用 workflow
  2. 確認 Line WebhookLine Messaging API credentials 都已填好
  3. 確認 LINE Developers Console 的 webhook verify 成功
  4. 用自己的 LINE 帳號把 Bot 加為好友
  5. 傳一則文字訊息,例如:
你好
  1. 回到 n8n 看 execution
  2. 應該看到:
  3. Line Webhook 有收到 text 事件
  4. Normalize Text Event 有抓到 replyTokenreceivedText
  5. Build Echo Message 有產生 message
  6. Reply to LINE 成功送出

成功時你會看到什麼

LINE 會回你:

你剛剛說:你好

如果沒有回訊息,依這個順序查

  1. Line Webhook 有沒有收到 execution
  2. replyToken 是不是空的
  3. Line Messaging API credential 有沒有填錯 token
  4. 你是不是把 ReplyToken 寫成 $json.replyToken

正確寫法在這個範例裡是:

{{$node["Normalize Text Event"].json.replyToken}}

因為 Build Echo Message 節點輸出只有 message,不會自動保留前一節點所有欄位。

3. 本機做 LINE Bot 時最容易卡住的地方

如果你的 n8n 跑在:

  • http://localhost:5678

那 LINE 平台是打不到你的。因為 LINE 的伺服器無法直接呼叫你電腦上的 localhost。

所以本機學習時你需要:

  • ngrok
  • cloudflared tunnel
  • 或把 n8n 部署到公開網域

也就是說,LINE 後台中的 webhook URL 不會是:

http://localhost:5678/webhook/...

而會是:

https://你的公開網址/webhook/...

這是 LINE Bot 新手最常見的第一個誤會。不是 n8n 壞掉,而是 webhook 入口根本還沒對外公開。

4. Line Webhook 節點怎麼看

這個節點最重要的參數很少:

  • Path
  • lineWebhookAuthApi credential

它的特點不是欄位多,而是輸出很多。它會依事件類型分到不同 output。

以文字訊息為例,text output 送出的資料結構核心通常會長這樣:

{
  "destination": "xxxxxxxx",
  "event": {
    "type": "message",
    "replyToken": "...",
    "source": {
      "type": "user",
      "userId": "Uxxxxxxxx"
    },
    "message": {
      "id": "1234567890",
      "type": "text",
      "text": "hello"
    }
  }
}

你最常會用到:

  • {{$json.event.replyToken}}
  • {{$json.event.message.text}}
  • {{$json.event.source.userId}}
  • {{$json.event.source.type}}
  • {{$json.event.message.id}}

5. 第一個 LINE 回聲機器人怎麼做

最小可用流程:

Line Webhook -> Set -> Line Message -> Line Messaging API -> Respond to Webhook

這個流程在做的事很單純:

  1. 接文字訊息
  2. replyToken 和收到的文字整理出來
  3. 組成一則回覆訊息
  4. replyToken 回覆
  5. 回傳 HTTP 200 給 LINE

節點清單

  1. Line Webhook
  2. Normalize Text EventSet
  3. Build Echo MessageLine Message
  4. Reply to LINELine Messaging API
  5. Respond to Webhook

Normalize Text Event 建議欄位

  • replyToken = {{$json.event.replyToken}}
  • receivedText = {{$json.event.message.text}}
  • userId = {{$json.event.source.userId || ''}}
  • sourceType = {{$json.event.source.type || ''}}
  • messageId = {{$json.event.message.id || ''}}
  • receivedAt = {{$json.event.timestamp || $now}}

Build Echo Message

Message Type = Text

文字內容可以先用:

你剛剛說:{{$node["Normalize Text Event"].json.receivedText}}

Reply to LINE

操作選:

  • Operation = Send Message

核心欄位:

  • ReplyToken = {{$node["Normalize Text Event"].json.replyToken}}
  • Message = {{$json.message}}

這樣就會把上一個 Line Message 節點產生的 message payload 送出去。

6. replyTokentargetRecipient 到底差在哪

這是初學者很容易混掉的地方。

replyToken

用途: - 回覆這一次 webhook 事件

特性: - 短期有效 - 只能用在回覆當前事件 - 最常見於「使用者先傳訊息給你」

targetRecipient

用途: - 主動推播給某個 user、group、room

特性: - 不依賴當前 webhook - 適合排程通知、主動提醒、系統訊息

簡化記法:

  • 有 webhook 當下事件,要回那次訊息:用 replyToken
  • 沒有 webhook 當下事件,但你知道對象 ID:用 targetRecipient

7. Line Message 節點怎麼用

這個節點不是送訊息,而是先組訊息。

Text

最適合新手起步。

必要欄位: - Text

Image

必要欄位: - URL - Preview Url

Video

必要欄位: - URL - Preview Url

Location

必要欄位: - Title - Address - Latitude - Longitude

Sticker

必要欄位: - Package ID - Sticker ID

Flex

必要欄位: - Alt Text - Flex Content

Flex 很強,但不適合當第一個示範。建議你先把文字回覆做通,再回頭學 Flex。

8. Line Messaging API 節點的常見用法

1. 回覆訊息

情境: - 使用者傳訊息給 Bot,你要立刻回

設定: - Operation = Send Message - ReplyToken 填 webhook 事件中的 token

2. 主動推播

情境: - 每天固定時間推播提醒 - 某筆資料異常時通知某位使用者或群組

設定: - Operation = Send Message - Target RecipientuserId / groupId / roomId

3. 取回圖片、音訊、影片內容

情境: - 使用者傳圖片給你 - 你想把檔案存到 S3、Google Drive、Qdrant 前處理流程

設定: - Operation = Get Message Content - Message ID = {{$json.event.message.id}}

4. 查使用者資料

情境: - 你只拿到 userId - 你想抓 display name 或其他基本資料

設定: - Operation = Get User Profile - User ID = {{$json.event.source.userId}}

9. 一份實務上好用的欄位 mapping

Webhook 事件進來後,建議先整理成這些欄位

標準欄位 來源 expression 用途
eventType {{$json.event.type}} 判斷 message、join、postback
replyToken {{$json.event.replyToken}} 回覆訊息
sourceType {{$json.event.source.type}} 判斷 user / group / room
userId {{$json.event.source.userId || ''}} 取得使用者對象 ID
groupId {{$json.event.source.groupId || ''}} 群組推播與查詢
roomId {{$json.event.source.roomId || ''}} room 場景使用
messageType {{$json.event.message.type || ''}} text/image/audio 等
messageId {{$json.event.message.id || ''}} 取回多媒體內容
receivedText {{$json.event.message.text || ''}} 文字訊息主內容
timestamp {{$json.event.timestamp || $now}} 記錄事件時間

這一步很重要。因為你一旦先把 LINE 原始 payload 正規化,後面的 IF、Switch、AI、Google Sheets、資料庫節點都會變乾淨很多。

10. 建議先做的 4 個 LINE 題目

題目 1. 回聲機器人

目的: - 練 webhook、replyToken、message object

題目 2. 關鍵字自動回覆

目的: - 練 IF / Switch

題目 3. LINE 傳圖後存到雲端

目的: - 練 Get Message Content - 練 binary data 流程

題目 4. LINE 作為通知出口

目的: - 練 Schedule Trigger 或資料異常告警 - 練 targetRecipient

11. 這個 community node 的實務注意事項

1. 它是 community node,不是 n8n 官方內建

代表: - 升級後要重新確認相容性 - 有 bug 時不一定跟官方節奏同步修

2. 本機測試一定要處理公開網址

LINE 打不到 localhost,這不是節點設定問題。

3. Line Message 節點會只輸出 message

所以如果你後面還需要 replyToken,通常要: - 用 expression 從前一個節點抓 - 或先用 Set 把需要的欄位整理好

4. audio 訊息建構目前要保守看待

從你安裝的這個套件版本程式碼來看,audio message 在內部組 payload 時看起來有實作疑慮。實務上如果你要做音訊訊息發送,我建議:

  • 先改用 HTTP Request 打官方 LINE Messaging API
  • 或先以 textimagestickerflex 為主

這不是說整個套件不能用,而是表示你要先用最穩的部分做學習與 MVP。

12. 建議的學習順序

  1. 先做文字回聲機器人
  2. 再做關鍵字分流
  3. 再學 Get User Profile
  4. 再做圖片接收與儲存
  5. 最後再做 Flex message 或主動推播

13. 一份最小上線檢查表

在你說「我的 LINE Bot 為什麼不能用」之前,先看這張表。

n8n 端

  • workflow 已啟用
  • Line Webhook path 已設定
  • lineWebhookAuthApi 已填 Channel Secret
  • lineMessagingAuthApi 已填 Channel Access Token

網路端

  • 你有一個公開網址
  • 公開網址目前可連
  • webhook URL 指向正確 path

LINE 端

  • Bot 已建立
  • Webhook URL 已貼入
  • Verify 成功
  • Use webhook 已打開
  • 你已把 Bot 加為好友

配套範例

這章搭配這兩份檔案一起看:

下一步建議

學完這章後,最適合接著做的是:

因為 LINE Bot 做到後面,本質上就會回到 webhook、API、資料正規化與工具選擇。