跳到主要內容

首頁 / 部落格 / 部署實戰

Clash 外部控制 API 完全指南:接口、面板與自動化腳本

部署實戰2026-06-011699 字約 4 分鐘
Clash 外部控制 API 完全指南:接口、面板與自動化腳本

Mihomo 核心自帶一個 RESTful API。Clash Verge 的介面本身就是通過它和核心通信的——理解這套接口,你可以用腳本做任何介面上能做的事。

開啟與安全

external-controller: 127.0.0.1:9090
secret: "一段足够长的随机字符串"

生成一個隨機 secret:

openssl rand -hex 24

認證方式

所有請求帶上 Bearer Token:

curl -H "Authorization: Bearer 你的secret" http://127.0.0.1:9090/version

WebSocket 接口(日誌、流量)可以用查詢參數:

ws://127.0.0.1:9090/traffic?token=你的secret

接口全表

方法路徑作用
GET/version核心版本
GET/configs當前設定
PATCH/configs修改執行時設定(連接埠、模式等)
PUT/configs?force=true重載設定檔
GET/proxies所有節點與策略組
GET/proxies/:name單個節點/組的詳情
PUT/proxies/:name切換策略組選中的節點
GET/proxies/:name/delay測試單個節點延遲
GET/group/:name/delay測試整個策略組
GET/connections當前所有連接
DELETE/connections斷開所有連接
DELETE/connections/:id斷開指定連接
GET/rules當前生效的規則列表
GET/providers/proxies所有 proxy-provider
PUT/providers/proxies/:name手動更新某個 provider
GET/providers/rules所有 rule-provider
PUT/providers/rules/:name手動更新規則集
GET/logs日誌流(WebSocket)
GET/traffic實時流量(WebSocket)
GET/memory記憶體佔用(WebSocket)

常用操作

查看所有策略組和當前選中的節點

curl -s -H "Authorization: Bearer $SECRET" \
  http://127.0.0.1:9090/proxies | jq '.proxies | to_entries[] | select(.value.type=="Selector") | {group: .key, now: .value.now}'

切換節點

curl -X PUT \
  -H "Authorization: Bearer $SECRET" \
  -H "Content-Type: application/json" \
  -d '{"name":"HK-01"}' \
  http://127.0.0.1:9090/proxies/PROXY

策略組名含中文或 emoji 時需要 URL 編碼:

GROUP=$(printf '%s' "🚀 节点选择" | jq -sRr @uri)
curl -X PUT -H "Authorization: Bearer $SECRET" \
  -d '{"name":"HK-01"}' \
  "http://127.0.0.1:9090/proxies/$GROUP"

測試節點延遲

curl -s -H "Authorization: Bearer $SECRET" \
  "http://127.0.0.1:9090/proxies/HK-01/delay?timeout=5000&url=http%3A%2F%2Fwww.gstatic.com%2Fgenerate_204"
# 回傳 {"delay":123}

切換代理模式

curl -X PATCH -H "Authorization: Bearer $SECRET" \
  -H "Content-Type: application/json" \
  -d '{"mode":"global"}' \
  http://127.0.0.1:9090/configs

mode 可選 rule / global / direct。同一個接口還能改 log-levelallow-lan 等。

重載設定

curl -X PUT -H "Authorization: Bearer $SECRET" \
  -H "Content-Type: application/json" \
  -d '{"path":"/etc/mihomo/config.yaml"}' \
  "http://127.0.0.1:9090/configs?force=true"

斷開所有連接

curl -X DELETE -H "Authorization: Bearer $SECRET" \
  http://127.0.0.1:9090/connections

換節點後連接不會自動切換(已建立的 TCP 連接會繼續用舊節點),執行這條能強制全部重連。

更新 provider

# 更新節點訂閱
curl -X PUT -H "Authorization: Bearer $SECRET" \
  http://127.0.0.1:9090/providers/proxies/main

# 更新規則集
curl -X PUT -H "Authorization: Bearer $SECRET" \
  http://127.0.0.1:9090/providers/rules/cn-domain

實用腳本

一、自動選擇延遲最低的節點

#!/bin/bash
# pick-fastest.sh —— 測速後切到最快的節點
set -euo pipefail
API="http://127.0.0.1:9090"
SECRET="你的secret"
GROUP="AUTO"
TEST_URL="http%3A%2F%2Fwww.gstatic.com%2Fgenerate_204"

# 觸發整組測速
curl -s -H "Authorization: Bearer $SECRET" \
  "$API/group/$GROUP/delay?timeout=5000&url=$TEST_URL" > /dev/null

# 取出延遲最低的
BEST=$(curl -s -H "Authorization: Bearer $SECRET" "$API/proxies" \
  | jq -r --arg g "$GROUP" '
    .proxies[$g].all[] as $n
    | .proxies[$n]
    | select(.history | length > 0)
    | select(.history[-1].delay > 0)
    | "\(.history[-1].delay) \(.name)"
  ' | sort -n | head -1 | cut -d' ' -f2-)

echo "最快节点:$BEST"
curl -s -X PUT -H "Authorization: Bearer $SECRET" \
  -d "{\"name\":\"$BEST\"}" "$API/proxies/$GROUP" > /dev/null

二、監控節點健康,全掛時告警

#!/bin/bash
# health-watch.sh
API="http://127.0.0.1:9090"
SECRET="你的secret"

ALIVE=$(curl -s -H "Authorization: Bearer $SECRET" "$API/proxies" \
  | jq '[.proxies[] | select(.type != "Selector" and .type != "URLTest")
         | select(.history | length > 0)
         | select(.history[-1].delay > 0)] | length')

if [ "$ALIVE" -eq 0 ]; then
  echo "$(date '+%F %T') 所有节点不可用" >> /var/log/mihomo-alert.log
  # 這裡可以接你的通知渠道
fi

三、統計流量最大的連接

curl -s -H "Authorization: Bearer $SECRET" http://127.0.0.1:9090/connections \
  | jq -r '.connections
      | sort_by(-.download)
      | .[:10][]
      | "\(.download/1048576 | floor)MB  \(.metadata.host // .metadata.destinationIP)  \(.metadata.processPath // "-")"'

排查「誰在偷跑流量」時很好用。

四、實時看日誌

# 需要 websocat 或 wscat
websocat "ws://127.0.0.1:9090/logs?token=你的secret&level=info"

部署 Web 面板

面板是純靜態頁面,通過 API 和核心通信。

方式一:核心托管(推薦)

external-ui: /etc/mihomo/ui
external-ui-name: metacubexd
external-ui-url: "https://面板发布地址/dist.zip"

把面板檔案解壓縮到 external-ui 指定的目錄,然後瀏覽器訪問:

http://内核地址:9090/ui

首次打開需要填 API 地址(http://内核地址:9090)和 secret。

方式二:用公開托管的面板

面板本身是純前端,你也可以用別人托管好的頁面,填上你的 API 地址和 secret 即可連接。

常見面板對比

三類面板metacubexd功能全,支援 Mih介面現代體積稍大zashboard輕量,行動端友好適合手機上操作yacd 系經典款資源佔用最低部分新特性不支援
面板只是 API 的前端,隨時可以換,不影響核心

用 API 做的幾個巧妙用法

定時切換節點

晚高峰自動切到專線,白天用普通節點:

# crontab
0 20 * * * /usr/local/bin/switch-node.sh "IPLC-HK"
0 1  * * * /usr/local/bin/switch-node.sh "AUTO"

快速鍵切換(桌面端)

配合 AutoHotkey(Windows)或 Hammerspoon(macOS),一個快速鍵切換全局/規則模式:

# 切到全局
curl -X PATCH -H "Authorization: Bearer $SECRET" \
  -d '{"mode":"global"}' http://127.0.0.1:9090/configs

接入監控系統

/traffic 是 WebSocket 接口,每秒推送上下行速率。可以采集後寫入時序資料庫,做成流量圖表。

排查

API 連不上時連接埠是否在監聽:ss -tlnp \grep 9090監聽地址是 127.0.0.1 還是 0.0.0.0(決定能否遠程訪問)secret 是否正確,Authorization 頭格式是否是 Bearer xxx防火牆是否放行 9090回傳 401 —— secret 錯了回傳 404 —— 路徑錯了,注意策略組名要 URL 編碼連不上但核心在跑 —— 檢查設定裡 external-controller 是否被註釋掉了

快速驗證:

curl -i -H "Authorization: Bearer $SECRET" http://127.0.0.1:9090/version

回傳 200 和版本號 JSON 就是通的。

小結

  • API 能做介面上的一切,包括切節點、改模式、重載設定
  • secret 是必須的,尤其監聽在 0.0.0.0
  • 策略組名含中文/emoji 要 URL 編碼
  • 換節點後記得 DELETE /connections,否則已有連接還在用舊節點
  • 面板只是前端,自建比用第三方托管的更安全

相關:Mihomo 家庭閘道部署流量與連接排查


相關文件

讓 Docker 和 WSL2 用上宿主機的 Clash 代理
部署實戰 讓 Docker 和 WSL2 用上宿主機的 Clash 代理

容器裡的 127.0.0.1 不是宿主機。這篇給出 Docker 構建期、執行期、daemon 拉取鏡像三種場景的設定方法,以及 WSL2 網路模式差異下的兩套方案。

2026-06-141716 字約 4 分鐘