~/ai-book-club — 2026.05

當 AI 學會開鎖

讓 AI 助理接管真實世界系統的四場實戰

Ryan × Claude Code | 逆向工程 · 跨機器委派 · 網站爬梳 · 語音對話
↓ scroll or press arrow keys
// context

先說結論:我跟 AI 一起蓋了一個管家

Emma 是跑在我桌機上的 Node.js AI 助理。她有 80 多個工具,能幫我管行事曆、寄信、查資料、排程任務、甚至幫我做影片。

但她遇到了一個工程師都會有的問題——

「世界上大部分的系統都沒有 API 文件。」

所以這週,我跟 Claude 做了四件事:逆向家裡的路由器和數據機、讓兩台電腦上的 AI 協作、爬一個封閉的商業網站、接上語音對話。

Emma (桌機) ├── 🧠 Claude Opus → 大腦 ├── 🔧 80+ Tools → 手腳 ├── 📱 Telegram → 跟我聊天 ├── 🌐 Web UI → 網頁介面 ├── 🗄️ SQLite → 記憶庫 │ ├── 🔌 路由器 API ← 本週新增 ├── 🔌 數據機 API ← 本週新增 ├── 🤖 Hermes 委派 ← 本週新增 ├── 🕸️ BNI 爬蟲 ← 本週新增 └── 🎤 語音對話 ← 本週新增
01

家用網路設備逆向工程

沒有 API 文件?那就自己寫一份。

01.a // ASUS RT-AC1200G+

路由器:相對善良的對手

1
Base64 encode 帳密 → POST /login.cgi
2
拿到 asus_token cookie
3
appGet.cgi?hook=nvram_get(key) 查 NVRAM
4
apply.cgi 改設定(Wi-Fi 頻道、重啟...)

💡 關鍵發現

每個請求都需要 Referer header — 不只 POST,連 GET 都要。少了這個 header,整個 session 直接報廢。

🤡 惱人的地方

Client list 回傳的不是 JSON,是一坨 JavaScript 變數。要用 regex 硬解。

🔒 Single Session

路由器只允許一個管理 session。API 登入會踢掉你在瀏覽器的 session。所以查完要 logout。

01.b // 中華電信 RTF8207W

數據機:Boss 戰

🔐 帳密加密方式

// 不是 hash,是 XOR 0x1f — 可逆的 function mess(str) { return str.split('').map(c => String.fromCharCode( c.charCodeAt(0) ^ 0x1f ) ).join(''); } // 'cht' → '|wk' // '207w4520' → '-/(h+*-/'

🧩 CAPTCHA — 用 AI 打 AI

每次登入都要解 CAPTCHA(4 張圖各一個字元)。但圖片太簡單了——白字黑底零干擾。Gemini Vision 辨識率 100%

⚠️ 登入要送 5 個東西

rqcaptchaValue=1024865 ← 數字 token rqCaptchaText=lysh ← OCR 結果 rqUsername=|wk ← XOR 後的帳號 rqPasswd=-/(h+*-/ ← XOR 後的密碼 rqLanguage=TW ← 不是 zh_TW!
最坑的發現:
rqLanguage 要送 TW,不是 zh_TW
送錯就 403。最後是開 Chrome DevTools 比對瀏覽器實際送出的 payload 才發現的。

🕵️ API 藏在 JS 檔裡

ASP 頁面是空殼 HTML。真正的 API endpoint 要去讀對應的 .js 檔才找得到。

02

跨機器 AI 委派

一台電腦上的 AI 把工作丟給另一台電腦上的 AI。
聽起來像科幻片,但其實只要一個 HTTP POST。

02 // emma ↔ hermes

兩個 AI,兩台電腦,一個 VPN

🧠 Emma — 桌機上的管家

Claude Opus 大腦,擅長對話、整合、管理。
「什麼都會一點,但寫 code 不是最快。」

⚡ Hermes — MiniBook 上的碼農

GPT-5.5 Codex 大腦,專精軟體開發。
「給我 repo 路徑,我就能改 code。」

🔗 怎麼連?

Tailscale VPN 直連。不需要公網 IP,
不需要 port forwarding,就像區網。

用戶: 「幫我在 CodingMap 加功能」 │ ▼ Emma 判斷 │ ├─ 小任務 (<2min) │ POST /v1/chat/completions │ ↳ 同步等結果 │ ↳ 回報用戶 ✅ │ └─ 大任務 (>2min) POST /v1/runs ↳ 拿到 run_id ↳ 建排程每 2min 輪詢 ↳ Hermes 寫完了! ↳ Telegram 通知你 ↳ git diff 看改了什麼 ↳ 確認 → 部署 🚀
02 // 關鍵發現

Hermes 的 /v1/runs API

一般 AI API 是同步的 — 你送 prompt,等它回覆。但 Hermes 有個非同步 API,送完任務立刻回傳 run_id,你隨時都能回來查進度。這讓「火後不理」的委派模式成為可能。

# 同步 — 等到天荒地老 POST /v1/chat/completions { "input": "重構整個模組" } → (等 10 分鐘...) → { "output": "改好了..." }
# 非同步 — 丟了就跑 POST /v1/runs { "input": "重構整個模組" } → { "run_id": "run_abc", "status": "started" } # 5 分鐘後回來問 GET /v1/runs/run_abc → { "status": "completed", "output": "..." }
🐛 踩到的 bug:condition task 在 met=true 後不會自動停止,會每 2 分鐘重複通知你「任務完成了」。修了。
03

封閉系統爬梳

BNI Connect Global — 一個有 CSRF、session timeout、
HTML 表格當 API 回傳的封閉會員系統。

03 // bni connect

把封閉網站變成 REST API

為什麼不能用 requests

  • 🛡️CSRF Token 嵌在 HTML meta tag,每頁不同
  • 🍪Cookie 有 SameSite 策略,302 redirect 鏈很長
  • ⏱️Session 30 分鐘過期,需要自動重新登入
  • 📊PALMS 報表回傳 HTML 表格,不是 JSON
解法:Playwright 管理一個真實瀏覽器 session,全自動處理 cookie、CSRF、session 更新。外面再包一層 FastAPI,讓 Emma 用 curl 就能呼叫。
Emma (Node.js) │ curl -H "X-API-Key: ..." ▼ FastAPI (localhost:8000) ├── /members/search ├── /palms/summary ← HTML 硬解 ├── /chapters/search └── /auth/login │ ▼ Playwright Browser → 管理登入狀態 → 自動 CSRF 更新 → Session 過期自動重連 │ ▼ BNI Connect Global (connect.bni.com)

🤯 PALMS 報表解析

表格用 rowspan 合併儲存格,表頭跟資料列不對齊,要逐行手動對應。這是整個專案最痛苦的部分。

04

語音對話

OpenAI Realtime API — 不是 STT→LLM→TTS 三段式,
而是端對端語音模型。邊聽邊想邊說。

04 // openai realtime api

這不是你阿嬤的語音助理

傳統 STT → LLM → TTS Realtime API gpt-realtime-2
延遲3-8 秒(三段排隊)0.5-1 秒(端對端)
打斷不支援或超爛原生支援,隨時插話
工具呼叫自己接水管內建 function calling
等待填充自己做或放罐頭音自動說「讓我查一下」
語調TTS 機械感自然語調,有感情
核心:gpt-realtime-2 是具備 GPT-5 級推理能力的端對端語音模型。它在你說話的同時就開始推理,說完後幾乎立即開始回答。
04 // 架構

WebRTC 直連,Emma 只管發 Token

瀏覽器 (手機/電腦) │ ├─ 🎤 麥克風 ── WebRTC ──→ OpenAI │ │ │ 🔊 喇叭 ◄── WebRTC ─── │ │ (語音直連, 超低延遲) │ │ 📡 DataChannel ◄──────── │ │ │ (事件: 文字, 工具呼叫) │ │ │ └─→ POST /v1/voice/tool-execute │ ↓ │ Emma 執行工具 │ (行事曆/記憶/郵件...) │ ↓ │ 結果送回 DataChannel │ ↓ │ AI 用語音回報結果

🔑 Ephemeral Token

後端用 API Key 產生短期 ek_ token → 前端拿這個 token 建立 WebRTC。真正的 API key 永不暴露。

踩坑精選

🔒HTTP 沒有麥克風 — Chrome 只在 HTTPS 或 localhost 給 getUserMedia。解:走 Cloudflare Tunnel。
📝toolExecutor 簽名搞錯 — 傳了 (name, args) 但要 ({name, args})。所有工具回 "not found: undefined"。找了半天。
🎤VAD 太敏感 — 環境噪音會打斷 AI 回答。threshold 從 0.5 調到 0.7,靜音判定 500ms→800ms。
💸成本 — 一般 30 秒對話 ~$0.01。每天用 20 分鐘 ~$0.5-1.0。比想像中便宜。
// patterns

四場實戰的共通模式

🔍 看實際封包

文件不可信(如果有的話)。Chrome DevTools Network 面板 + 瀏覽器實際送出的 payload 才是真相。

🧩 AI 解 AI 的鎖

數據機用 CAPTCHA 防自動化?Gemini Vision 一秒解。反爬蟲在 AI 時代越來越像裝飾品。

🔌 包成獨立服務

Python 爬蟲不要硬塞進 Node.js。包成 FastAPI 微服務,Emma 用 curl 呼叫。各自重啟互不影響。

🤝 讓 AI 自己判斷

不要硬規定「所有開發任務都丟 Hermes」。給 AI skill 描述,讓它根據任務性質自己決定要不要委派。

🔒 用完就登出

Single session 設備很常見。API 佔住 session,人就進不去管理頁面。查完資料立刻 logout。

🐛 最後的 bug 最蠢

TW vs zh_TW(name, args) vs ({name, args})。最難找的 bug 往往是最低級的錯誤。

🔓

AI 不需要 API 文件

有 DevTools 就能逆向,有 Playwright 就能爬,
有 VPN 就能跨機器協作,有 WebRTC 就能開口說話。

真正的門檻不是技術,
是你願不願意花一個下午跟 AI pair programming。

Ryan — AI 讀書會 2026.05 | github / telegram / email