Skip to content

Clash 节点智能切换脚本说明

这个方案是给你当前这份 Clash / Mihomo 配置定制的。

目标是:

  1. 每隔几分钟检查一次 Proxies 主组当前实际出网节点的延迟
  2. 如果当前节点延迟小于 300ms,保持不动
  3. 如果当前节点延迟大于等于 300ms,先记一次“超阈值”
  4. 只有连续 2 次都超 300ms,才真正开始切换
  5. 真要切时,先在当前国家内找更快节点
  6. 如果当前国家的节点都不可用,再按 美国 -> 日本 -> 新加坡 -> 其他国家 的优先级选择最快节点
  7. 通过 Clash Controller API 直接完成切换

1. 这套方案为什么能实现自动切换

因为你本机的 Clash Controller 已经可访问:

  • Controller: http://127.0.0.1:9097
  • Secret: 123456
  • 内核版本:v1.19.25

脚本会调用这几类接口:

  1. 读取当前代理组状态
  2. 测试单个节点延迟
  3. Proxies 组切换到指定节点

所以这不是“改配置后等 Clash 自己猜”,而是脚本主动决定并下发切换命令。


2. 当前脚本文件


3. 默认策略

脚本默认管理的主组是:

  • Proxies

默认阈值:

  • 300ms

默认防抖:

  • 连续 2 次超阈值才切换

默认测速地址:

  • https://www.gstatic.com/generate_204

默认国家优先级:

  • US
  • JP
  • SG
  • OTHER

这里的 OTHER 包括:

  • 台湾
  • 香港
  • 韩国
  • 德国
  • 荷兰
  • 以及其他没有被识别为 US / JP / SG 的节点

说明一下:

  • 你这次明确说的是“优先美国,然后日本、新加坡,然后其他国家”
  • 所以我把台湾、香港都归到 OTHER
  • 如果你后面想改成 US -> JP -> SG -> HK -> TW -> OTHER,脚本也很容易改

4. 切换逻辑

脚本每次执行时,流程是:

  1. 读取 Proxies 当前选中的对象
  2. 如果当前选中的是子组,比如 SG,继续递归解析到最终实际节点
  3. 测当前实际节点延迟
  4. < 300ms,把连续超阈值计数清零,不切
  5. >= 300ms 或者测不通: 连续超阈值计数 +1
  6. 只有连续计数达到 2,才进入真正的选路阶段
  7. 真正选路时,先在“当前国家”里找更快节点
  8. 如果当前国家没有可用节点: 按 US -> JP -> SG -> OTHER 依次找可用国家
  9. 在命中的国家里,选延迟最小的那个节点
  10. 调用 Controller API 把 Proxies 切过去

脚本会在下面这个状态文件里记住连续次数:

  • /04-Clash配置/.clash-smart-switch-state.json

5. 直接运行方式

先做一次 dry run:

bash
python3 /04-Clash配置/0008-Clash智能切换服务脚本.py --dry-run --verbose

确认没问题后,真实切换:

bash
python3 /04-Clash配置/0008-Clash智能切换服务脚本.py --verbose

6. 常用参数

修改阈值:

bash
python3 /04-Clash配置/0008-Clash智能切换服务脚本.py --threshold-ms 250

修改优先级:

bash
python3 /04-Clash配置/0008-Clash智能切换服务脚本.py --priority US,JP,SG,OTHER

修改连续超阈值次数:

bash
python3 /04-Clash配置/0008-Clash智能切换服务脚本.py --required-consecutive-high 2

切换到别的主组:

bash
python3 /04-Clash配置/0008-Clash智能切换服务脚本.py --group Proxies

修改 controller:

bash
python3 /04-Clash配置/0008-Clash智能切换服务脚本.py --controller http://127.0.0.1:9097 --secret 123456

7. 几分钟检查一次更合适

我的建议还是:

  • 首选 3 分钟

原因是:

  1. 对“节点偶发抖动”响应比较及时
  2. 不会像 1 分钟 那样太敏感
  3. 也不会像 5~10 分钟 那样恢复太慢

如果你后面发现切换还是偏频繁,可以继续再加严一点:

  1. 把阈值改成 350ms
  2. 把连续超阈值次数调成 3

这次已经按你刚才认可的思路,默认实现成“连续 2 次超过阈值才考虑切换”。


8. 推荐定时方式

最适合 macOS 的是 launchd

比如每 180 秒执行一次:

bash
*/3 * * * * 不是 launchd 的写法

launchd 通常会用 StartInterval = 180 这种方式。

如果你要,我下一步可以继续帮你补一份:

  1. LaunchAgent plist
  2. 一键安装命令
  3. 查看日志命令
  4. 开关脚本

这样你后面就不需要手动跑了。