精華筆記

· @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#自動回覆#客服機器人

← 回所有文章