前言 · 為什麼把 hermes 接到 LINE
~3 分鐘
Lesson 2 你已經把 hermes 接到 Telegram,從手機就能對話。為什麼還要再接 LINE?兩個理由:
- LINE 是台 / 港學員每天最常用的 messenger,比 Telegram 親民,朋友家人都已經在裡面;
- 接 LINE 後 hermes 真正變「隨身助手」——通勤、會議、走路時都能丟訊息給它處理。
Lesson 2 跟本堂的差別:LINE 強制要求公開 webhook URL(不像 Telegram 可以長 polling),所以多一層 ngrok 概念——把本機 hermes 暴露給 LINE 雲端。學完本堂你會懂 ngrok 怎麼用,未來想接任何 webhook 平台都用得到。
結束時你會有
- ✓ 一支自己的 LINE bot 已加為好友、能用手機送訊息給它
- ✓
ngroktunnel 跑在背景(前景版;24/7 守護是加碼預告) - ✓
hermes gateway跑著,會即時把 LINE 訊息 dispatch 給 LLM - ✓ 知道 LINE 四大 quirks(Markdown 不 render / 雙 send / reply token TTL / ngrok URL 重啟會換),不會誤以為 bot 壞了
沒做過 Lesson 1 / 2?
本堂預設你已完成 Lesson 1(hermes 在 WSL 裝好、可對話)+ Lesson 2(Telegram bot 端到端可用,已熟悉 .env 與 hermes gateway 概念)。沒做過請先按順序走一遍。
為什麼是 ngrok?沒別的選擇嗎?
LINE 雲端只接受公開 HTTPS URL;本機 localhost、內網 IP、HTTP 都不行。
選 ngrok 原因:免費、無需架站、一行指令就跑、Linux/WSL 都能用。缺點:免費 tier 的 URL 重啟會變、agent process 死了 tunnel 就斷。本堂教前景版讓你看到全貌;想 24/7 看 Step 7 加碼預告。
替代品有 Cloudflare Tunnel、localtunnel、Tailscale Funnel——能用,但本堂選 ngrok 因為註冊最快(GitHub OAuth 30 秒搞定)。
Step 1 / 7 · 開始之前
~3 分鐘
動工前先確認 4 件事到位。
前置 checklist
- ✓ Lesson 1 完成:
hermesCLI 能對話。沒做過?先去 Lesson 1。 - ✓ Lesson 2 完成:Telegram bot 端到端可用,已熟悉
~/.hermes/.env與hermes gateway概念。沒做過?先去 Lesson 2。 - ✓ 手機 LINE app 已登入個人帳號(或一個還沒用過的測試帳號,避免跟個人 ID 撞)。
- ✓ WSL / Linux shell 同一個(跟 Lesson 1 / 2 用的)。
動工前升級 hermes 到最新版
LINE plugin 的必要 fix 在較新 release 才完整收錄。動工前先升級到最新版:
npm update -g @nousresearch/hermes && hermes --version
看到新版本號顯示就過了,繼續往下看。
這 7 步在做什麼
- Step 2:到 LINE Developers Console 申請 bot,拿到 Channel Access Token + Channel Secret(外連既有教學)
- Step 3:裝
ngrok並設 authtoken(讓 LINE webhook 能從 internet 打進本機 hermes) - Step 4:開 ngrok tunnel、把 LINE 相關變數寫進
~/.hermes/.env - Step 5:回 LINE Console 填 webhook URL + 設 5 個 toggles
- Step 6:啟動
hermes gateway、手機送訊息驗證、抓自己 LINE User ID 收緊 allowlist - Step 7:收尾 + LINE quirks 警告 + 進階預告
:free 結尾的 model。
會用到 3 個 shell window,先預告
本堂後半段同時跑 3 個程式:
- Window A:你現在這個(給
nano、sed、查 log 用) - Window B:Step 4 開來跑
ngrok http 8646,保留到課程結束 - Window C:Step 6 開來跑
hermes gateway run,保留到課程結束
WSL 用 Windows Terminal 開新分頁即可(Ctrl+Shift+T)。三個 window 不要關,關了就要全部重來。
Step 2 / 7 · 申請 LINE bot
~10 分鐘
LINE Developers Console 的 bot 申請流程已有完整中文外部教材,照著做就好:
結束時你應該有
- Channel Access Token(長 ~170 字元的 base64 字串)
- Channel Secret(32 hex 字元)
- Bot basic ID(@ 開頭,例:
@123abcde)— 在 LINE Console → Messaging API 分頁的 Bot information 區塊可看到
token / secret 安全提醒(重要)
- 三樣都是 secret,不要截圖共享、不要 commit 進 git、不要貼進公開聊天
- Step 4 填進
.env時用nano,不要echo或命令列 paste(避免進 shell history) - 若不小心外洩:LINE Console → Channel settings → Issue / reissue 按鈕作廢舊 token、重發新的
🚨 主連結打不開(lewsi.ddns.net 失聯)
備援精簡版,6 句搞定:
- 瀏覽器開 https://developers.line.biz/console/
- 用 LINE 帳號或 LINE Business ID 登入
- 建立 Provider(沒有就 Create,名字任意,例:
my-hermes) - 進 Provider → Create a Messaging API channel,填名稱、icon 隨意
- 進 channel → Basic settings 分頁,看到 Channel secret(32 hex),複製暫存
- 進 channel → Messaging API 分頁,底端 Channel access token 區塊按 Issue,複製產出的 ~170 字元 token 暫存
進階設定(webhook 與 toggles)Step 5 才碰。
Bot basic ID 跟 Channel ID 怎麼分?
LINE Console 一個 channel 會有兩種 ID,很容易混:
- Bot basic ID:以
@開頭、6–9 字元(例:@123abcde),這是學員手機 LINE 搜尋 bot 用的對外 ID。看 Messaging API 分頁的 Bot information。 - Channel ID:純數字(10 位數),管理用,本堂用不到。
✓ token 跟 secret 都暫存到記事本,接著 Step 3 裝 ngrok。
Step 3 / 7 · 裝 ngrok + 設 authtoken
~7 分鐘
ngrok 是把 LINE 雲端送來的 webhook 訊息轉發到你本機 hermes 的橋樑。LINE 不接受 localhost 或內網 IP,必須公開 HTTPS URL,ngrok free tier 適合學員入門。
動作
1. 裝 ngrok(aarch64 / amd64 都用同一個 apt repo)
curl -sSL https://ngrok-agent.s3.amazonaws.com/ngrok.asc \
| sudo tee /etc/apt/trusted.gpg.d/ngrok.asc >/dev/null \
&& echo "deb https://ngrok-agent.s3.amazonaws.com bookworm main" \
| sudo tee /etc/apt/sources.list.d/ngrok.list \
&& sudo apt update && sudo apt install ngrok
裝完驗證:
ngrok version
預期:ngrok version 3.x.x
2. 註冊 ngrok 帳號
瀏覽器開 https://dashboard.ngrok.com/signup → 用 GitHub 或 Google OAuth 註冊(最快)→ 進 Dashboard。
3. 取 authtoken
Dashboard sidebar → Your Authtoken → 複製顯示的字串。
4. 設定 authtoken
把剛複製的 authtoken 貼到下面命令的 <your-authtoken> 位置(含 <> 一起換掉),執行:
ngrok config add-authtoken <your-authtoken>
預期輸出:
Authtoken saved to configuration file: ~/.config/ngrok/ngrok.yml
為什麼這步是核心?
ngrok free tier 沒設 authtoken 時 session 撐不過半小時就會斷;設了之後 session 不會主動 timeout,agent process 不死就不斷。
學員若把 ngrok 當「打開 tunnel 就好」、忽略 authtoken,下午 bot 就會莫名其妙不回,多半找半天才發現是這個原因。
🚨 我卡住了
- apt install 報 GPG key 錯 → 上面 curl 那行的 GPG key 沒下載成功,確認網路後重跑 curl 那段
- ngrok config add-authtoken 報「invalid authtoken」 → 多半 paste 帶到換行 / 空白;回 Dashboard 重抄一次,paste 時注意去除前後空白
- ngrok.yml 存到別處 → 預設路徑是
~/.config/ngrok/ngrok.yml;用cat ~/.config/ngrok/ngrok.yml看是否存在
✓ ngrok version 報 3.x、~/.config/ngrok/ngrok.yml 已存。接著 Step 4 開 tunnel。
Step 4 / 7 · 開 ngrok tunnel + 寫 .env LINE block
~10 分鐘
三件事:(1) 第二個 shell 跑 ngrok 抓 public URL、(2) 編輯 ~/.hermes/.env 加 LINE 區塊、(3) redacted verify 確認都填對沒漏字元(不直接 cat .env,避免 secret 暴露)。
1. 第二個 shell(Window B)跑 ngrok
開新的 Windows Terminal 分頁(Ctrl+Shift+T)進 WSL,跑:
ngrok http 8646
ngrok 終端機 panel 出現後,看 Forwarding 那行的 URL(類似 https://abcd-12-34-56-78.ngrok-free.app),完整含 https:// 一起抄,下一步要用。
看不懂 ngrok panel?
panel 大概長這樣:
Session Status online
Account your-email@example.com (Plan: Free)
Version 3.x.x
Region Asia Pacific (ap)
Forwarding https://abcd-12-34-56-78.ngrok-free.app -> http://localhost:8646
Connections ttl opn rt1 rt5 p50 p90
0 0 0.00 0.00 0.00 0.00
抄 Forwarding 那行 -> 左邊的 URL。不是 http://localhost:8646(那是內網位址)。
2. 回 Window A 編輯 .env
回到 Lesson 1/2 用的 shell(Window A),打開 ~/.hermes/.env:
nano ~/.hermes/.env
nano 編輯器開啟後,捲到檔尾(Ctrl+End 或一直按 ↓),手動 append 以下區塊。注意 hermes .env 預設沒有 LINE 區塊,要自己加:
# =============================================================================
# LINE INTEGRATION
# =============================================================================
LINE_CHANNEL_ACCESS_TOKEN=<貼 Step 2 拿到的 token>
LINE_CHANNEL_SECRET=<貼 Step 2 拿到的 secret>
LINE_PUBLIC_URL=<貼上面 ngrok 那條 URL>
LINE_ALLOWED_USERS=
LINE_ALLOW_ALL_USERS=true
三個 <占位符> 都要連 <> 一起換掉。完成後 Ctrl+O 存檔 → Enter 確認 → Ctrl+X 退出。
為什麼 LINE_ALLOWED_USERS= 留空 + LINE_ALLOW_ALL_USERS=true?
我們現在還不知道學員自己的 LINE User ID(U 開頭 32 字元 hex),Step 6 從 gateway log 抓到後再回頭收緊。先放寬讓你能傳第一則訊息驗證鏈路。
放寬期間 不要把 bot basic ID 公開到任何地方(聊天群、社群),免得別人加你 bot、用你 OpenRouter 額度。
3. Redacted verify(不要 cat .env)
直接 cat 會把 token 噴到螢幕。改用下面這條 awk 只看「變數名 + 值的長度」:
awk -F= '/^LINE_/{print $1, "len="length($2)}' ~/.hermes/.env
預期輸出(長度可能略有出入,重點是 ratio 對得上):
LINE_CHANNEL_ACCESS_TOKEN len=170
LINE_CHANNEL_SECRET len=32
LINE_PUBLIC_URL len=40
LINE_ALLOWED_USERS len=0
LINE_ALLOW_ALL_USERS len=4
判讀:
LINE_CHANNEL_ACCESS_TOKEN len=170(或~160-180)→ token 對 ✓LINE_CHANNEL_SECRET len=32→ secret 對 ✓(hex 32 字元 = 16 bytes)LINE_PUBLIC_URL len=40(前後可能差 5-10)→ ngrok URL 對 ✓LINE_ALLOWED_USERS len=0→ 空字串,Step 6 收緊 ✓LINE_ALLOW_ALL_USERS len=4→ 字面 "true" ✓
nano ~/.hermes/.env 重貼。
🚨 變數完全沒列出來(awk 沒輸出 LINE_ 任何行)
多半是貼到檔頭的 secret 預留區、或變數名拼錯。檢查:
- 變數名必須是
LINE_CHANNEL_ACCESS_TOKEN、LINE_CHANNEL_SECRET、LINE_PUBLIC_URL、LINE_ALLOWED_USERS、LINE_ALLOW_ALL_USERS(一字不差,全大寫) - 等號
=前後不要空格 - 值不要加引號(
LINE_PUBLIC_URL=https://...,不是LINE_PUBLIC_URL="https://...")
若仍對不上,看 Step 4 末段的 sed 補救。
補救:用 sed 直接改 .env(同 Lesson 1 / 2 paste 雷的解法)
跟 Lesson 1 Step 7 同根因(hermes .env 編輯 paste 雷),同模式。兩個 variant 擇一:
Variant A · 互動腳本(推薦)
三個值都會用 read -p 個別問:token / secret 不回顯(避免肩膀後面被看到),URL 回顯(純文字無妨):
cd ~/.hermes && read -sp "Paste LINE Channel Access Token: " TOKEN && echo && read -sp "Paste LINE Channel Secret: " SECRET && echo && read -p "Paste ngrok HTTPS URL: " PUBURL && { grep -q '^LINE_CHANNEL_ACCESS_TOKEN=' .env || echo 'LINE_CHANNEL_ACCESS_TOKEN=' >> .env; grep -q '^LINE_CHANNEL_SECRET=' .env || echo 'LINE_CHANNEL_SECRET=' >> .env; grep -q '^LINE_PUBLIC_URL=' .env || echo 'LINE_PUBLIC_URL=' >> .env; grep -q '^LINE_ALLOWED_USERS=' .env || echo 'LINE_ALLOWED_USERS=' >> .env; grep -q '^LINE_ALLOW_ALL_USERS=' .env || echo 'LINE_ALLOW_ALL_USERS=true' >> .env; } && sed -i "s|^LINE_CHANNEL_ACCESS_TOKEN=.*|LINE_CHANNEL_ACCESS_TOKEN=$TOKEN|" .env && sed -i "s|^LINE_CHANNEL_SECRET=.*|LINE_CHANNEL_SECRET=$SECRET|" .env && sed -i "s|^LINE_PUBLIC_URL=.*|LINE_PUBLIC_URL=$PUBURL|" .env && unset TOKEN SECRET PUBURL
跑完後再執行上方的 redacted verify 命令確認長度。
Variant B · 手動範本
把 YOUR_TOKEN / YOUR_SECRET / YOUR_NGROK_URL 三個占位字串替換成實際值再貼進終端機(這次不用連 <>,因為原字串就沒有):
cd ~/.hermes && { grep -q '^LINE_CHANNEL_ACCESS_TOKEN=' .env || echo 'LINE_CHANNEL_ACCESS_TOKEN=' >> .env; grep -q '^LINE_CHANNEL_SECRET=' .env || echo 'LINE_CHANNEL_SECRET=' >> .env; grep -q '^LINE_PUBLIC_URL=' .env || echo 'LINE_PUBLIC_URL=' >> .env; grep -q '^LINE_ALLOWED_USERS=' .env || echo 'LINE_ALLOWED_USERS=' >> .env; grep -q '^LINE_ALLOW_ALL_USERS=' .env || echo 'LINE_ALLOW_ALL_USERS=true' >> .env; } && sed -i 's|^LINE_CHANNEL_ACCESS_TOKEN=.*|LINE_CHANNEL_ACCESS_TOKEN=YOUR_TOKEN|' .env && sed -i 's|^LINE_CHANNEL_SECRET=.*|LINE_CHANNEL_SECRET=YOUR_SECRET|' .env && sed -i 's|^LINE_PUBLIC_URL=.*|LINE_PUBLIC_URL=YOUR_NGROK_URL|' .env
跑完任一個之後,再跑 awk redacted verify 確認長度合理。接著 Step 5 回 LINE Console 設 webhook。
Step 5 / 7 · 回 LINE Console 設 webhook + 5 toggles
~8 分鐘
外部教材 Step 6(Bot 回應方式)我們剛剛跳過了,現在 ngrok URL 在手,回去把它填完。
1. 進 channel 的 Messaging API 分頁
瀏覽器開 https://developers.line.biz/console/ → 你的 Provider → 你的 channel → 點 Messaging API 分頁。
2. 設 Webhook URL
在 Webhook settings section:
- Webhook URL 欄填:
<ngrok URL>/line/webhook- 例:
https://abcd-12-34-56-78.ngrok-free.app/line/webhook - 結尾必須是
/line/webhook,不要漏 path。沒這個 path hermes 收不到(其他 path 是給別的 platform 用)。
- 例:
- 按 Update(或 更新)儲存
3. 5 個 Toggles 對照表
同樣在 Messaging API 分頁,下半部有 5 個 toggle,外部教材只教前 3 個;後 2 個是本課新增,學員容易漏。
| Toggle | 設定 | 為什麼 |
|---|---|---|
| Use webhook | ON ✅ | 必開,不然 LINE 根本不會送 webhook 給你 |
| Auto-reply messages | OFF ❌ | 預設 ON 會自動回 LINE 預設客服訊息,蓋掉 hermes 的回應 |
| Greeting messages | OFF ❌ | 預設 ON 加好友時學員會收到 LINE 預設歡迎訊息(不是 hermes 講的),造成困擾 |
| Webhook redelivery | OFF ❌ | 開的話 hermes crash 時 LINE 會重送同訊息 → log 難辨識、bug 會被放大 |
| Error statistics aggregation | ON ✅(隨意) | 純資料收集,無風險;之後 debug 時友善 |
每個 toggle 我去哪找?
5 個 toggle 都在 Messaging API 分頁,從上往下排列;前 3 個(Webhook / Auto-reply / Greeting)通常在 Response settings 或 Webhook settings 卡片裡;後 2 個(Redelivery / Error statistics)在 Webhook URL 那塊的下方。
LINE Console UI 偶爾改版,toggle 排列可能調整;若位置變,找 Webhook、Auto-reply、Greeting、Redelivery、Error 五個關鍵字即可。
✓ webhook URL 已存、5 個 toggle 已設。Verify 按鈕下一步啟動 gateway 後再回來按。
Step 6 / 7 · 啟動 hermes gateway + 手機端到端 smoke
~10 分鐘
串起所有東西的關鍵步驟:(1) 跑 gateway、(2) LINE Console 按 Verify、(3) 手機加好友送訊息、(4) 從 log 抓自己 U-ID、(5) 收緊 allowlist、(6) 重啟驗證。
1. 第三個 shell(Window C)啟動 gateway
開另一個 Windows Terminal 分頁進 WSL(這是 Window C,與 Window A 編輯用、Window B 跑 ngrok 並列),執行:
hermes gateway run
預期看到啟動 banner,含關鍵字(任何一個 traceback 都先停下查 log):
✓ line connectedGateway running with 1 platform(s)Secret redaction: ENABLED
🚨 啟動就 crash
- 「Missing required env: LINE_CHANNEL_ACCESS_TOKEN」 → Step 4 的 .env 變數名拼錯 / 漏寫,回 Step 4 重 awk verify
- 「Invalid LINE_CHANNEL_SECRET length」 → secret 長度不是 32,回 Step 4 sed 補救
- 「Port 8646 already in use」 → 前一個 gateway 還跑著,
hermes gateway stop或pkill -f "hermes gateway"後重跑
2. 回 LINE Console 按 Verify
切回瀏覽器 LINE Console → Messaging API 分頁 → Webhook URL 旁邊的 Verify 按鈕,點下去。
預期:✅ Success
失敗對策:
- "Status 4xx" → webhook URL 路徑漏
/line/webhook,回 Step 5 補 - "Signature mismatch" → Channel Secret 抄錯,回 Step 4 redacted verify 確認
LINE_CHANNEL_SECRET len=32 - "Timeout" → Window B 的 ngrok 斷了;切到 Window B 看 panel 還在不在;若已斷,
Ctrl+C再重跑ngrok http 8646,注意新 URL 跟舊的不同,回 Step 4 用 sed 補救改LINE_PUBLIC_URL,然後 LINE Console 也要把 webhook URL 改成新的
3. 手機 LINE 加 bot 為好友 → 送第一則訊息
加好友兩條路徑:
- 掃 LINE Console → Messaging API 分頁 → QR code(最快)
- 或 LINE app 搜尋 Step 2 拿到的 Bot basic ID(
@xxxxxx)
加好友成功後,送一句測試:
測試
4. 看 Window C 的 gateway log,抓你的 U-ID
切回 Window C,會看到類似輸出:
inbound message: platform=line user=U0123456789abcdef0123456789abcdef chat=U0123456789abcdef0123456789abcdef msg='測試'
response ready: platform=line chat=U0123456789abcdef0123456789abcdef time=5.x s api_calls=1 response=N chars
[Line] Sending response (N chars) to U0123456789abcdef0123456789abcdef
抓那段 U + 32 hex 字元(總長 33 字元的 user ID),等下要寫進 allowlist。
5. 手機 LINE 確認收到 bot 回應
- ✅ 收到回應 → 鏈路通了!
- ❌ 沒收到但 log 顯示 Send 成功 → 手機 LINE 設定有擋(極少見),先擱著
- ❌ log 完全沒看到 inbound → Verify 沒過 / ngrok URL 對不上 / hermes 沒接到 platform line,回 Step 5 / 6 上方檢查
6. 收緊 LINE_ALLOWED_USERS 為單一 U-ID
現在 LINE_ALLOW_ALL_USERS=true,bot 是公開的,任何加好友的人都會用你的 OpenRouter 額度。馬上收緊:
cd ~/.hermes && read -p "Paste your LINE User ID (U<32-hex>): " USER_ID && sed -i "s|^LINE_ALLOWED_USERS=.*|LINE_ALLOWED_USERS=$USER_ID|" .env && sed -i 's|^LINE_ALLOW_ALL_USERS=.*|LINE_ALLOW_ALL_USERS=false|' .env && grep -E '^LINE_(ALLOWED_USERS|ALLOW_ALL_USERS)' .env && unset USER_ID
跑完預期輸出(USER_ID 那段會是你剛貼的值):
LINE_ALLOWED_USERS=U0123456789abcdef0123456789abcdef
LINE_ALLOW_ALL_USERS=false
為什麼用 USER_ID 變數名,不是 UID?
Bash 的 UID 是 readonly built-in,賦值會靜默失敗 — read -p "..." UID 不會報錯,但 $UID 永遠是學員系統的 user ID(純數字),不是你 paste 的 LINE User ID。結果 sed 會把學員系統 UID 寫進 .env,bot 完全擋不住任何人。
用 USER_ID(或任何 non-builtin 名稱)就沒這個問題。同理見 Lesson 2 Step 4 補救段的 Variant A。
7. 重啟 gateway,驗證收緊有效
切到 Window C,Ctrl+C 殺掉 gateway。再跑:
hermes gateway run
啟動 banner 同前。再回手機 LINE 送一句訊息:
測試 2
預期:自己仍能收到 bot 回應 ✅。代表 allowlist 收緊但你自己沒被擋掉。
想額外驗證「名單外被擋」
拿另一個 LINE 帳號加 bot 送訊息,Window C 的 gateway log 應該不會 dispatch 給 LLM(會看到一行類似 blocked: user U... not in allowlist)。學員選做,不必。
✓ Verify 過、手機通、allowlist 收緊。最後 Step 7 收尾。
Step 7 / 7 · 完成 + LINE quirks + 加碼預告
~4 分鐘
你做到了
- ✓ 一個跑著的 LINE bot(手機 LINE → ngrok → hermes → OpenRouter)
- ✓ 自己 LINE User ID 已寫進 allowlist、別人不能用你 OpenRouter 額度
- ✓ 學到 redacted-verify 命令模式(awk 看長度、不噴 secret)
- ✓ 學會 ngrok tunnel(任何未來要接的 webhook 平台都用得到)
⚠️ LINE quirks 必須知道(避免之後誤判 bot 壞了)
| Quirk | 觀察 | 為什麼 |
|---|---|---|
| Markdown 不 render | 你叫 hermes 用 **bold** 回應,手機看到的是純文字(沒粗體) |
LINE plugin 把 markdown strip 掉,因為 LINE 本身不支援 markdown 渲染 |
| 第一則訊息可能雙 send | 你送一句,bot 回兩條(先短後長) | hermes 用 LINE bubble 分訊息回應;正常行為,不是 bug |
| 慢 LLM 會出 postback 按鈕 | 若用 deepseek free 之類較慢 model,可能看到「請按這個按鈕拿答案」 | LINE reply token 60 秒就過期;hermes 為了不浪費付費 Push API,先回 button,等學員按再傳完整答案 |
| ngrok URL 重啟會換 | 隔天醒來 bot 不回 → 多半是 ngrok agent process 死了 / 重連、URL 換了 | 需要:重啟 ngrok → 抓新 URL → 改 ~/.hermes/.env 的 LINE_PUBLIC_URL → 改 LINE Console webhook URL → 重啟 hermes gateway |
下次預告
下次(Lesson 5 暫定 / 未排)可能會涵蓋:
- LINE Rich Menu 客製化按鈕
- 多 platform 同跑(Telegram + LINE 同支 hermes)
- 或你想學什麼下次告訴我
🎁 加碼 A · systemd 24/7 守護(out of scope,預告用)
本堂教的前景版有兩個限制:
- Window B / C 任何一個關閉 → 整條鏈路斷
- WSL 重啟或機器關機 → 需要手動把兩支重起
要做到 24/7 在背景自動跑、機器重開也自動拉起,需要:
- systemd --user service 守護 ngrok agent(unit 檔指定
ExecStart=/usr/local/bin/ngrok http 8646,Restart=on-failure) - systemd --user service 守護 hermes gateway(類似 unit,
ExecStart=$(which hermes) gateway run) - ngrok URL 自動同步 watcher:ngrok agent 重連會換 URL;寫一支 watcher script 對比 ngrok API(
http://localhost:4040/api/tunnels)跟.env的LINE_PUBLIC_URL,不一致時 sed 改 .env +systemctl --user restart hermes-gateway。LINE Console 端的 webhook URL 仍需手動改(LINE 沒開 API)。
完整步驟在後續的 docs/advanced/lesson-4-systemd.md(尚未寫,本堂不必修)。
🎁 加碼 B · 用 hermes gateway lifecycle 指令快速複習
同 Lesson 2 Step 5 加碼,這邊只列常用:
hermes gateway status
hermes gateway restart
hermes gateway stop
log:
tail -f ~/.hermes/logs/gateway.log
到這邊就是 Lesson 4 全部內容。下次見。