iT邦幫忙

0

Day 09 配置 LINE Webhook、解析事件封包與簽章安全防護

n8n
  • 分享至 

  • xImage
  •  

在昨天的文章中,我們在 LINE Developers Console 成功建立了 Messaging API 頻道,發行了長期有效的 Channel Access Token,並關閉了官方預設的罐頭回覆干擾。

今天 Day 09,我們要將本地的自動化大腦與 LINE 官方伺服器正式打通!我們將利用 ngrok 提供的高速 HTTPS 隧道,將 LINE 的 Webhook 事件導流至 n8n,並深入解析 LINE 傳入的事件封包(Event Payload),確保每一次使用者在手機發送的訊息都能被精確擷取與安全辨識。


一、LINE Webhook 通訊與安全驗證機制

當使用者在 LINE 聊天室發送訊息時,LINE 伺服器會將該事件打包為 JSON 格式,並以 HTTP POST 方式發送到我們指定的 Webhook URL。

為了防止中間人攻擊或偽造的 Webhook 請求,LINE 採用了 HMAC-SHA256 數位簽章機制:

  • LINE 伺服器會在 HTTP Request Header 中夾帶 x-line-signature。
  • 該簽章是由 Request Body 原始資料與我們昨天的 Channel Secret 經由 HMAC-SHA256 加密計算而成。
  • 接收端可藉由重新計算並比對該簽章,確認該請求 100% 來自 LINE 官方。

二、配置 LINE Developers Webhook URL

Step 1:啟動本地 ngrok 公網隧道

請打開 PowerShell,確保連接埠 5678 的公網隧道正在運行:

ngrok http 5678

複製畫面中的 Forwarding HTTPS 網址,例如:

[https://xxxx-xx-xx-xx-xx.ngrok-free.app](https://xxxx-xx-xx-xx-xx.ngrok-free.app)

Step 2:在 LINE Developers 後台填入 Webhook URL

1.前往 LINE Developers Console 並進入昨天建立的 Messaging API Channel。

2.切換到 Messaging API 分頁,找到 Webhook settings 區塊。

3.點擊 Webhook URL 旁的 Edit,組裝並貼上你的 n8n Webhook 完整路徑:

測試模式路徑:

[https://xxxx-xx-xx-xx-xx.ngrok-free.app/webhook-test/line-webhook](https://xxxx-xx-xx-xx-xx.ngrok-free.app/webhook-test/line-webhook)

正式運行模式路徑:

[https://xxxx-xx-xx-xx-xx.ngrok-free.app/webhook/line-webhook](https://xxxx-xx-xx-xx-xx.ngrok-free.app/webhook/line-webhook)

4.點擊 Update 儲存。

5.將底下的 Use webhook 開關切換為 開啟 (Enabled)。

三、在 n8n 中監聽與解析 LINE Event 封包

Step 1:開啟 n8n 測試監聽

1.打開瀏覽器進入 n8n 介面(http://localhost:5678),打開昨天的 LINE Bot Core Workflow。

2.點擊 Webhook 節點,確認 Path 為 line-webhook。

3.點擊節點下方的 Listen for test event,使 n8n 進入等待封包狀態。

Step 2:LINE 後台驗證測試

1.回到 LINE Developers Console 的 Webhook settings 區塊。

2.點擊 Verify 按鈕。

3.若畫面顯示綠色 Success,代表 LINE 伺服器已經成功連通你的本地端 n8n!

Step 3:手機掃碼加好友並發送真實訊息

1.在 LINE Developers 的 Messaging API 分頁最上方,找到 QR code。

2.用手機打開 LINE 掃描該 QR code,將你的美食機器人加入好友。

3.在 n8n 再次點擊 Listen for test event。

4.在手機聊天室中輸入一句話發送,例如

:「哈囉!我想吃好吃的」

四、深入解析 LINE 傳入的事件封包

當你發送訊息後,n8n 的 Webhook 節點會立刻亮起綠色勾勾,並在 Output 面板捕捉到完整的 JSON 資料結構:

{
  "destination": "Uxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
  "events": [
    {
      "type": "message",
      "message": {
        "type": "text",
        "id": "52839201948201",
        "text": "哈囉!我想吃好吃的"
      },
      "webhookEventId": "01HX...",
      "deliveryContext": {
        "isRedelivery": false
      },
      "timestamp": 1728000000000,
      "source": {
        "type": "user",
        "userId": "U4a8f9b1c2d3e4f5..."
      },
      "replyToken": "abcdef0123456789abcdef0123456789",
      "mode": "active"
    }
  ]
}

關鍵欄位解析:
events[0].replyToken:最核心的憑證!每次使用者傳訊息時由 LINE 生成的單次有效回覆權杖,我們必須拿著這個 Token 呼叫 Reply API,才能免費把訊息回覆給該使用者。

events[0].message.text:使用者在手機輸入的純文字內容。

events[0].source.userId:使用者的專屬識別碼,可用於識別不同用戶的歷史喜好。

五、在 n8n 中萃取對話變數 (Code 節點)

為了方便後續串接 Dify 大腦與回覆節點,我們在 Webhook 後方新增一個 Code 節點進行欄位扁平化處理:
1.點擊 + 新增 Code 節點,命名為 Extract LINE Event。

2.語言選擇 JavaScript,貼入以下程式碼:

// 取得 LINE 事件陣列的第一筆事件
const event = $input.first().json.body.events[0];

// 確保該事件是文字訊息
if (!event || event.type !== 'message' || event.message.type !== 'text') {
  return [];
}

return {
  reply_token: event.replyToken,
  user_id: event.source.userId,
  user_message: event.message.text,
  timestamp: event.timestamp
};

點擊 Test step,即可看到輸出乾淨清晰的四個變數:

reply_token

user_id

user_message

timestamp
今日結語與明日預告
今天我們成功打通了 LINE 官方平台至本地工作流的最後一哩路:

透過 ngrok 將外部 Webhook 流量平穩導流至本地 n8n。

完成了 LINE Developers 的 Webhook 連通驗證。

成功透過手機發送訊息,並在 n8n 中精準擷取出使用者的文字與關鍵 replyToken!

明天 Day 10,也是我們 10 天系列挑戰的完結大集結!我們將把所有零件徹底組裝起來:將 LINE 訊息送入 Dify (Gemini 大腦) 提取意圖 ➜ 調用 FastAPI 微服務產出推薦 ➜ 呼叫 LINE Reply API 回傳精美卡片到手機! 敬請期待!


*提醒邦友,使用第三方服務/API 時,請務必評估資安風險與隱私保護
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言