clash-proxy-api¶
透過 Clash / mihomo 執行中的 external-controller REST API,用自然語言操作代理 ——例如「我現在走哪個節點?」「切到日本節點」「切成 global 模式」「開 TUN」「重載設定」 或「Clash API 連不上」。技能內建腳本包裝 controller API 與作業系統系統代理,並附 參考文件說明如何依用戶端啟用 API、以及原始端點清單。
| 介面 | 回答的問題 |
|---|---|
clash_api.py doctor |
「controller 連得上嗎?連不上的話,要在哪個用戶端把 API 打開?」 |
clash_api.py status |
「我目前的節點、模式、TUN 狀態、連接埠、代理群組是什麼?」 |
clash_api.py switch/mode/tun/reload/connections |
「即時調整代理:選節點、切 rule/global/direct、開關 TUN、重載、關連線。」 |
clash_api.py delay/group-delay/proxies/rules |
「測延遲、列節點/規則。」 |
clash_sysproxy.sh |
「用戶端沒有系統代理開關時(mihomo CLI、無頭機、Ubuntu),直接切作業系統的系統代理。」 |
references/enable-api-by-client.md |
「如何在 Verge Rev / ClashX / mihomo 開啟或找到 API 位址?System Proxy、TUN、Service Mode、Mixin 在哪裡?」 |
references/api-endpoints.md |
「/traffic、/providers、/dns/query 這些要 curl 哪個端點?」 |
技能的核心原則是不寫死任何假設。controller 探索順序:--controller/--secret
→ CLASH_CONTROLLER/CLASH_SECRET 環境變數 → 選用的 Television hook → 本機設定檔 →
探測 127.0.0.1:9090 再 :9097(Clash Verge Rev)。第一個連得上的勝出。代理連接埠會從
即時設定讀取,而非假設是 7890。
何時觸發¶
- 「我走哪個節點/模式?」→
status;「把 PROXY 切到日本節點」→ 先delay再switch。 - 「切成 global / rule / direct」→
mode;「開 TUN」→tun on --restart。 - 「重載設定」「關掉所有連線」「查我的出口 IP」→
reload/connections/egress。 - 「Clash API 有開嗎?/ 壞了」→
doctor,再看 enable-API 參考文件。 - 「我 Ubuntu 上沒有系統代理開關」→
clash_sysproxy.sh。 - 用戶提到 Clash、mihomo、Clash Verge (Rev)、ClashX、external-controller、
9090/9097,或用名稱指某個節點。
何時不適用¶
- 手改訂閱/規則 YAML——API 只做重載與切換,不負責撰寫設定;請走政策 repo 與用戶端部署流程。
- Mixin / Merge 設定——那是用戶端的設定檔功能(Clash Verge / CFW),不是執行期 API。技能會引導,但不代寫。
- 購買/挑選節點、管理訂閱。
結構¶
skills/local/clash-proxy-api/
├── SKILL.md #intent→command 對照表 + 陷阱清單
├── scripts/
│ ├── clash_api.py # 純標準函式庫 Python 3;controller API 客戶端
│ └── clash_sysproxy.sh # bash 3.2;作業系統系統代理開關
├── references/
│ ├── enable-api-by-client.md # 各用戶端×OS:啟用 API、System Proxy、TUN、Service Mode、Mixin
│ └── api-endpoints.md # 完整端點清單 + 原始 curl 範例
└── agents/openai.yaml # OpenAI 風格啟動描述檔
設計重點¶
clash_api.py只用標準函式庫——不需uv、不需 pip,只要有python3就能跑(下游最實際的情況)。若能 import PyYAML 就用,否則用小型正規表達式掃描讀取所需的兩個設定鍵。- 每個寫入操作都支援
--dry-run;具破壞性的connections close --all需要--yes;永遠不印出 secret(status只說secret: yes/no)。 - 結束碼用於分支重試邏輯:
0成功、1用法錯誤、2群組/節點不存在(訊息會列出實際成員)、3controller 連不上、4操作被拒。clash_sysproxy.sh:0/1/2/3。 - 三層模型——controller API(可靠)、啟用/探索(API 關閉時)、API 做不到的 OS/用戶端開關(System Proxy、Service Mode、Mixin)。
技能內建的陷阱提醒¶
- controller 不一定是
127.0.0.1:9090(Verge Rev 是9097;GUI 會隨機挑埠;路由器在 LAN 上)——一律探索。 - 代理連接埠不一定是
7890——從status的 ports 讀取。 - 透過 API 開 TUN 需要有特權的核心(Service Mode / root)且通常要
POST /restart;單純PATCH會回 204 但不會真的接管流量。 - System Proxy 是作業系統設定,不是 API 概念——用用戶端開關或
clash_sysproxy.sh。 group-delay//providers//restart是 mihomo 專屬(在傳統 Premium 核心上會 404)。
驗證¶
bash skills/local/skill-author/scripts/lint-skill.sh skills/local/clash-proxy-api
python3 skills/local/clash-proxy-api/scripts/clash_api.py doctor # 探索 + 診斷
python3 skills/local/clash-proxy-api/scripts/clash_api.py status # 對著真實 controller
bash skills/local/clash-proxy-api/scripts/clash_sysproxy.sh detect # 唯讀查看系統代理狀態
讀取指令對真實 controller 是安全的;寫入指令(switch、mode、tun、reload、
connections close)可用 --dry-run 預覽。
有時間上限的診斷與 managed router¶
以 --controller https://HOST:PORT --ca-cert PATH --secret-file PATH --read-only
指定 TLS 目標。憑證與 hostname 仍須驗證;controller request 不使用環境代理且拒絕
redirect。明確指定的目標失敗時不會轉向本機 controller。遠端 egress 必須提供 --proxy。
observe DOMAIN --client IP --duration 20 合併篩選後的 connection snapshots 與 routing
logs。JSON 包含核心版本、時間、matched rule、原始 chain 次序、收集警告與證據狀態。
它不主動開網站、不證明應用成功,也不回推過去流量;報告屬於私密瀏覽 metadata。
Managed Pi 的 Nikki 使用專案 just diagnose-site wrapper,同時檢查 client route
並綁定 confirmed profile。設定變更走裝置 transaction。詳見 skill 內的
references/managed-router-diagnosis.md 與
政策知識庫。
Transport 與觀測回歸測試:
python3 -m unittest discover -s skills/local/clash-proxy-api/tests -v