自动化
进阶
Clash Verge API 自动化:用脚本实现节点自动切换
2024年11月20日
约8分钟
Clash Verge 提供完整的 RESTful API,我一直想用它做点自动化的事情。
最近写了一套脚本,实现了节点自动测速和切换。现在我的代理会每5分钟测一次延迟,自动选最快的节点。
开启 External Controller
先要开启 Clash 的 API 功能。在 YAML 配置文件中添加:
external-controller: 127.0.0.1:9090
secret: your-secret-token-here
或者在 Clash Verge 的「设置」→「高级设置」中直接配置。API 默认监听 localhost,需要远程访问可以改成 0.0.0.0(注意安全)。
Python 脚本:自动切换最快节点
import requests
import json
import time
API_URL = "http://127.0.0.1:9090"
SECRET = "your-secret-token-here"
HEADERS = {"Authorization": f"Bearer {SECRET}"}
def get_proxies():
"""获取所有节点列表"""
r = requests.get(f"{API_URL}/proxies", headers=HEADERS)
return r.json()
def test_delay(proxy_name):
"""测试节点延迟(毫秒)"""
r = requests.get(f"{API_URL}/proxies/{proxy_name}/delay",
params={"url": "https://www.google.com", "timeout": 5000},
headers=HEADERS)
data = r.json()
return data.get("delay", float('inf'))
def select_fastest():
"""选择延迟最低的节点"""
proxies = get_proxies()
# 找出所有代理节点(排除策略组)
proxy_list = []
for name, info in proxies.get("proxies", {}).items():
if info.get("type") == "proxy":
delay = test_delay(name)
proxy_list.append({"name": name, "delay": delay})
# 按延迟排序
proxy_list.sort(key=lambda x: x["delay"])
# 选择最快的
if proxy_list:
fastest = proxy_list[0]
print(f"最快节点: {fastest['name']} ({fastest['delay']}ms)")
# 切换到该节点(假设有个叫"auto"的策略组)
requests.put(
f"{API_URL}/proxies/auto",
headers=HEADERS,
json={"name": fastest["name"]}
)
if __name__ == "__main__":
while True:
try:
select_fastest()
except Exception as e:
print(f"错误: {e}")
time.sleep(300) # 每5分钟执行一次
进阶:Home Assistant 集成
我还把它接入了 Home Assistant,在手机上一键切换节点:
# Home Assistant 配置示例
rest_command:
switch_proxy:
url: "http://127.0.0.1:9090/proxies/auto"
method: put
headers:
Authorization: "Bearer your-secret-token"
payload: '{"name": "{{ node_name }}"}'
提示:API 支持查看连接、修改配置、热更新订阅等操作。完整 API 文档:Clash Wiki