自动化 进阶

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