精華筆記

· @aihub.tw

LINE OA AI 客服機器人

接上 n8n:讓訊息流進你的自動化流程

接上 n8n:讓訊息流進你的自動化流程

你已經把 LINE 官方帳號開好了,後台導覽也走過一遍。客人掃 QR Code 加進來,傳了一句「請問你們今天有開嗎?」——然後一片靜默。

LINE OA 後台有內建的「自動回應訊息」功能,但它只能對關鍵字回固定文字。客人打「開店時間」你可以回一段話,但客人打「今天幾點?」就漏掉了;更不可能根據庫存查詢、訂單狀態、或客人說話的語氣給出不同答案。LINE OA 的後台就像一台沒插電的電話總機:硬體在、號碼也通,就是接不起來。

這堂課要做的,就是把那條線插上去:把 LINE 傳進來的每一則訊息,透過 Webhook 串進 n8n 的自動化流程。接好這條線,你才能在第 4 課讓 AI 來接電話。

這堂課適合誰 適合:已開好 LINE OA 並申請 Messaging API(第 2 課完成)、想讓機器人自動回覆的店家或小編。需要基礎:會操作 n8n 基本節點(IF、HTTP Request、Set)。前置課:第 2 課(申請帳號與後台導覽),以及 AI 自動化課(n8n 基礎)。

這堂學什麼

  • LINE Messaging API 的完整訊息路徑:用戶訊息如何一步步從 LINE 走進你的 n8n 流程
  • n8n Webhook 節點的設定方式:取得公開 URL、貼進 LINE Developer Console、通過驗證
  • 拆解 LINE 訊息的 JSON 格式:event / message.text / replyToken / source.userId 各是什麼
  • 打出第一個 echo bot:用戶說什麼、機器人就回什麼(HTTP Request 呼叫 Reply API)
  • Reply API 與 Push API 的本質差異:什麼情況免費、什麼情況消耗推播額度

觀念一:訊息怎麼從 LINE 走進 n8n

先建立正確的系統圖,後面操作才不會搞不清楚自己在哪個環節。

Messaging API 全流程:用戶傳訊 → LINE Platform 推 Webhook → n8n 接收 → Reply API 回覆

整條鏈路有五個角色:

  1. 用戶:在 LINE App 對你的官方帳號傳訊息。這個動作觸發了後續所有事情。
  2. LINE Platform:LINE 的伺服器接收到訊息後,把它打包成一個 JSON 格式的「webhook 事件」,然後用 HTTP POST 送到你指定的網址(Webhook URL)。注意這是 LINE 主動推過來,不是你的程式去問 LINE 說「有沒有新訊息?」
  3. n8n Webhook 節點:你在 n8n 建一個 Webhook 節點,它會產生一個公開的 HTTPS 網址。你把這個網址貼進 LINE 後台,LINE 以後就把訊息送到這裡。
  4. 你的流程:n8n 接到訊息後,你可以做任何事:判斷訊息內容、查資料庫、呼叫 AI——這堂課先做最簡單的 echo bot,把用戶說的話直接回傳。
  5. Reply API:把回覆送回去給用戶。用戶看到的那句話,就是從這裡出去的。

關鍵是第 2、3 步的 Webhook 機制:LINE 需要一個公開的 HTTPS 網址才能推訊息給你。所以 n8n 一定要部署在有公開網址的環境(n8n Cloud 或自架且有 HTTPS 的 VPS),你的本機 localhost 收不到。

觀念二:LINE 訊息的 JSON 長什麼樣

LINE 推來的資料是一個 JSON,你的 n8n 節點要從裡面提取需要的欄位。

LINE Webhook JSON 解剖:type、message.text、replyToken、source.userId 四個關鍵欄位

{
  "destination": "Uxxxxxxxxx",
  "events": [
    {
      "type": "message",
      "message": {
        "type": "text",
        "id": "468789577898262530",
        "text": "你們幾點開門?"
      },
      "source": {
        "type": "user",
        "userId": "Uabc12345def67890"
      },
      "replyToken": "38ef843bde154d9b91c21320ffd17a0f",
      "timestamp": 1720000000000
    }
  ]
}

四個你一定要認識的欄位:

  • events[0].type:事件類型。傳文字訊息是 "message",加好友是 "follow",取消追蹤是 "unfollow",按快速回覆按鈕是 "postback"。你的 n8n 流程要先過濾,確認是 "message" 類型才繼續處理。
  • events[0].message.text:用戶說的那句話,就在這裡。這是你要丟給 AI 或做關鍵字比對的原始輸入。
  • events[0].replyToken:這是你「回覆這則訊息」的門票,只有 30 秒有效期只能用一次。呼叫 Reply API 時必須帶上它。超過 30 秒或重複使用就會回傳 Invalid reply token
  • events[0].source.userId:傳訊息的用戶 LINE ID。之後用 Push API 主動推訊息,或記錄用戶的互動歷史,都需要這個。

另外注意 events 是一個陣列——理論上 LINE 偶爾會一次推多筆事件,但實務上幾乎都是一筆。

觀念三:Reply API vs Push API,額度怎麼算

這是很多人設計機器人時搞混的地方,先釐清再動手。

Reply API 不計額度,Push API 消耗每月推播配額

LINE OA 的每月訊息額度(2026 年現況,已由多家代理商確認):

方案 月費 每月推播額度 加購
輕用量 免費 200 則 不可加購
中用量 NT$800 3,000 則 不可加購
高用量 NT$1,200 6,000 則 可加購,約 NT$0.2/則起

重點:這個額度只計算 Push API 的主動推播訊息。用 Reply API 回覆用戶——也就是用戶先說話、你用 replyToken 回應——是完全免費、不佔這個額度的。

結論很清楚:客服機器人回答客人問題,一律用 Reply API。主動推促銷、預約提醒這類不是由用戶訊息觸發的訊息,才用 Push API。這樣一來,免費方案的 200 則額度只會用在你真正「主動出擊」的地方。

手把手實戰

以下用 n8n Cloud 的環境示範。如果你自架 n8n,確認有 HTTPS 公開網址之後步驟完全一樣。

在 n8n 建立 Webhook 節點,取得接收 URL

開一個新的 n8n workflow。在畫布上點「+」加入第一個節點,搜尋並選擇 「Webhook」

節點設定如下:

  • HTTP Method:POST(LINE 用 POST 推 webhook)
  • Path:自訂一個路徑,例如 line-webhook。完整 URL 會長這樣:https://你的n8n網址/webhook/line-webhook
  • Response Mode:選 「Last Node」——這樣 n8n 會等整個流程跑完再回傳 HTTP 200 給 LINE。LINE 需要你在收到 webhook 後一定時間內回傳 200,否則會重試。
  • Authentication:先選 「None」。LINE 有自己的 Signature 驗證機制,這邊不另外加 n8n 層的 Basic Auth。

設定完後按 「Listen for Test Event」,Webhook 節點現在開始監聽。把節點上方顯示的 Test URL 複製下來:

https://你的n8n網址/webhook-test/line-webhook

注意:Test URL(路徑含 webhook-test)是測試時用的,正式上線要改用 Production URL(路徑是 webhook)。兩者網址不同,在 LINE 後台填的時候要確認清楚。

把 Webhook URL 貼進 LINE Developer Console 並驗證

LINE Developers Console 進入你的 Messaging API channel,找到 「Messaging API」 頁籤,往下捲到 「Webhook settings」 區塊。

  1. 「Edit」,把剛才複製的 n8n Webhook URL 貼入
  2. 確認 URL 開頭是 https://(LINE 只接受 HTTPS,HTTP 會直接被拒)
  3. 開啟 「Use webhook」 的開關(有時候預設是關閉的)
  4. 「Verify」 按鈕

如果一切正常,你會看到「Success」的綠色提示。同時切換回 n8n,你的 Webhook 節點應該也收到了一筆測試資料——這是 LINE 送來的驗證 ping。

如果 Verify 失敗,99% 是以下原因之一:URL 是 http 不是 https;n8n 那邊的 Webhook 節點沒有在監聽狀態(記得要先按「Listen for Test Event」);或路徑拼錯了。

本機開發的替代方案 如果你在本機跑 n8n 測試,可以用 ngrok 把本機端口暴露成公開 HTTPS URL。安裝後執行 ngrok http 5678(n8n 預設端口),它會給你一個類似 https://abc123.ngrok.io 的網址。把這個網址加上你的 webhook 路徑貼進 LINE 後台即可。ngrok 免費方案的 URL 每次重啟都會變,正式環境還是要用固定網址。

解析 LINE 訊息,提取三個關鍵欄位

現在 Webhook 節點已經能收到 LINE 的訊息了。在它後面加一個 IF 節點,先過濾掉不是文字訊息的事件。

IF 節點條件設定:

條件 1: {{ $json.body.events[0].type }} 等於 "message"
條件 2: {{ $json.body.events[0].message.type }} 等於 "text"

兩個條件同時成立才往 True branch 走。LINE 偶爾會推空的 events[] 陣列(心跳包),或者 "follow""unfollow" 等非訊息事件,這個 IF 節點幫你都擋掉。

IF 節點的 True branch 後面接一個 Set 節點,把之後常用的三個欄位抽出來,讓後面的節點直接用:

欄位名稱 來源(n8n Expression)
replyToken {{ $json.body.events[0].replyToken }}
userText {{ $json.body.events[0].message.text }}
userId {{ $json.body.events[0].source.userId }}

在 Set 節點的 Fields 裡,每個欄位選 「String」 類型,Value 填對應的 expression。設定完後,後面所有節點都可以用 {{ $json.replyToken }}{{ $json.userText }}{{ $json.userId }} 直接取值,不用每次都寫長串 path。

呼叫 Reply API,打出第一句自動回覆

現在到了讓機器人「說話」的環節。在 Set 節點後面加一個 「HTTP Request」 節點,這個節點直接呼叫 LINE 的 Reply API。

節點設定:

  • Method:POST
  • URL:https://api.line.me/v2/bot/message/reply
  • Authentication:選 「Header Auth」
    • Name:Authorization
    • Value:Bearer 你的Channel Access Token(從 LINE Developer Console 的 Messaging API 頁籤複製長期 Token)

Body:選 「JSON」,貼入以下內容:

{
  "replyToken": "{{ $json.replyToken }}",
  "messages": [
    {
      "type": "text",
      "text": "你說的是:{{ $json.userText }}"
    }
  ]
}

這就是最簡單的 echo bot:把用戶說的話原封不動反射回去,前面加「你說的是:」方便確認有沒有接通。

Header 設定:另外在 Headers 加一筆:

  • Name:Content-Type
  • Value:application/json

設定完後,按 「Test Step」 確認節點設定沒問題(但因為沒有真實的 replyToken,這一步會回 Invalid reply token,這是正常的)。

啟動測試:用 LINE 傳訊息給自己的帳號

流程長這樣,對照一下你的 n8n 畫布:

n8n Echo Bot 四個節點:Webhook → IF → Set → HTTP Request

確認流程邏輯後,把 n8n workflow 的狀態從 Inactive 改為 Active(右上角的開關)。Activate 之後 n8n 就會使用 Production URL(不含 webhook-test 的那個)。

回到 LINE Developer Console,把 Webhook URL 換成 Production URL(把路徑的 webhook-test 改成 webhook),再按一次 Verify 確認。

然後用你自己的 LINE 帳號,加這個 OA 為好友(或已經加過的話直接傳訊),打一句話:

測試一下

幾秒鐘內,你應該會收到:

你說的是:測試一下

恭喜——你的第一個 LINE 自動回覆機器人上線了。它還很陽春,但你已經把最難的那條線接好了。第 4 課只要把 Set 節點和 HTTP Request 節點之間插入 AI 節點,機器人就會開口說人話。

常見坑

接 LINE Webhook + Reply API 的過程中,這五個坑幾乎人人都踩過一次。

常見錯誤速查:401、Signature 失敗、Webhook 驗證失敗等五種症狀與解法

坑 1:HTTP 401 Unauthorized — Reply API 回傳「The request body has no reply_token」或直接 401

原因幾乎都是 Channel Access Token 填錯或格式不對。最常見的錯誤是直接把 Token 字串貼進 Header 的 Value 欄位,忘記前面要加 Bearer (有空格)。正確格式:

Authorization: Bearer eyJ0eXAiOiJKV1Qi...

另外注意 Token 的種類:LINE Developer Console 裡有「Short-lived token」(短期)和「Issue」出來的「Channel access token(long-lived)」(長期)。建議用長期的,不用擔心過期問題。

坑 2:Webhook 驗證一直失敗,顯示「Unable to verify the webhook URL」

按下 LINE Console 的 Verify 按鈕但失敗。排查順序:

  1. URL 開頭是 https:// 嗎?http 直接拒絕
  2. n8n Webhook 節點有在 Listen 狀態嗎?要先按「Listen for Test Event」才有在等
  3. URL 路徑完整正確嗎?少一個斜線都不行
  4. 如果是本機 n8n,有用 ngrok 之類的工具暴露出去嗎?

坑 3:流程被觸發,但 events[0] 報「Cannot read properties of undefined」

你的 n8n 流程跑起來,但後面的節點說找不到 events[0]。原因是 LINE 會定期對你的 Webhook URL 發送「空陣列」的心跳包確認存活:

{ "destination": "Uxxxxxxxxx", "events": [] }

這個包的 events 是空的,你的 events[0] 當然 undefined。解法:在 IF 節點加一條前置條件:{{ $json.body.events.length > 0 }},空陣列就直接跳過,不往後跑。

坑 4:訊息偶爾不回,Reply API 報「Invalid reply token」

這是 replyToken 的 30 秒限制。如果你的 n8n 流程在那 30 秒內跑不完(例如 AI 節點回應很慢、有等待步驟),replyToken 就過期了。

解法一:先回一句「收到你的問題,我來查一下」(用 replyToken 立刻回),然後繼續跑 AI 邏輯,最後用 Push API 把完整答案推出去。 解法二:優化流程速度,把不必要的等待節點移掉。

注意 replyToken 只能用一次。如果你在測試時把同一個 replyToken 貼到 Postman 試,第二次用就會失敗——這是設計如此,不是 bug。

坑 5:Signature 驗證失敗(如果你有自己加驗簽邏輯)

LINE 每次推 Webhook 都會在 Header 帶上 x-line-signature,這是用你的 Channel Secret(不是 Channel Access Token,是另一個值)做 HMAC-SHA256 簽出來的。如果你打算自己驗簽,有幾個地方容易出錯:

  • 先解析 JSON 再驗簽:錯了。HMAC 要對原始 request body(raw bytes)做,JSON.parse() 之後再 stringify 會改變字串,簽名就對不上
  • 用錯金鑰:Channel Secret 在 Developer Console 的「Basic settings」頁籤,不是 Messaging API 頁籤的 Token
  • 編碼問題:body 必須是 UTF-8,如果你的框架在某個環節轉了編碼,HMAC 就會對不上

n8n 的標準 Webhook 節點目前不內建 LINE 的 Signature 驗簽(需要用 Code 節點自己寫),課程早期練習階段可以先跳過,正式上線前補上。

作業

  1. 完整跑一遍這堂課的實戰步驟:在 n8n 建好 Webhook 節點、通過 LINE 的 Verify、傳訊息給自己的 OA、收到 echo 回覆。截圖 LINE 對話視窗那個「你說的是:XXX」的畫面存起來,下一課會在這個基礎上繼續。

  2. 改造 echo bot:在 HTTP Request 的 JSON body 裡,把回覆文字改成帶有你店家資訊的問候語,例如:

{
  "replyToken": "{{ $json.replyToken }}",
  "messages": [
    {
      "type": "text",
      "text": "嗨!我是【你的店名】的小助手 🤖\n你說:「{{ $json.userText }}」\n我還在學習中,下次就能給你更好的回答!"
    }
  ]
}
  1. 思考題:你的店每天大概會有多少則客人訊息?乘以 30 天,算一下你一個月的 Reply API 呼叫量。這些全部是免費的——反過來,你真正會用到推播額度的場景是什麼?

下一課預告

echo bot 只會鸚鵡學舌,沒有任何實際用途——但你已經打通了最重要的管道。第 4 課要在 Set 節點和 HTTP Request 之間,插入 Claude 或 GPT 的 AI 節點,讓機器人真正「理解」客人說什麼、給出有意義的回答。我們會設計第一版的系統提示詞、讓 AI 知道自己的角色是哪家店的客服、以及怎麼讓回答既有禮貌又不廢話。你的客服機器人,即將開口說人話。

#LINE OA#Messaging API#n8n#Webhook#自動回覆#客服機器人

← 回所有文章