Appearance
Clash 节点智能切换脚本说明
这个方案是给你当前这份 Clash / Mihomo 配置定制的。
目标是:
- 每隔几分钟检查一次
Proxies主组当前实际出网节点的延迟 - 如果当前节点延迟小于
300ms,保持不动 - 如果当前节点延迟大于等于
300ms,先记一次“超阈值” - 只有连续
2次都超300ms,才真正开始切换 - 真要切时,先在当前国家内找更快节点
- 如果当前国家的节点都不可用,再按
美国 -> 日本 -> 新加坡 -> 其他国家的优先级选择最快节点 - 通过 Clash Controller API 直接完成切换
1. 这套方案为什么能实现自动切换
因为你本机的 Clash Controller 已经可访问:
- Controller:
http://127.0.0.1:9097 - Secret:
123456 - 内核版本:
v1.19.25
脚本会调用这几类接口:
- 读取当前代理组状态
- 测试单个节点延迟
- 把
Proxies组切换到指定节点
所以这不是“改配置后等 Clash 自己猜”,而是脚本主动决定并下发切换命令。
2. 当前脚本文件
- 脚本文件: 0008-Clash智能切换服务脚本.py
3. 默认策略
脚本默认管理的主组是:
Proxies
默认阈值:
300ms
默认防抖:
- 连续
2次超阈值才切换
默认测速地址:
https://www.gstatic.com/generate_204
默认国家优先级:
USJPSGOTHER
这里的 OTHER 包括:
- 台湾
- 香港
- 韩国
- 德国
- 荷兰
- 以及其他没有被识别为
US/JP/SG的节点
说明一下:
- 你这次明确说的是“优先美国,然后日本、新加坡,然后其他国家”
- 所以我把台湾、香港都归到
OTHER - 如果你后面想改成
US -> JP -> SG -> HK -> TW -> OTHER,脚本也很容易改
4. 切换逻辑
脚本每次执行时,流程是:
- 读取
Proxies当前选中的对象 - 如果当前选中的是子组,比如
SG,继续递归解析到最终实际节点 - 测当前实际节点延迟
- 若
< 300ms,把连续超阈值计数清零,不切 - 若
>= 300ms或者测不通: 连续超阈值计数+1 - 只有连续计数达到
2,才进入真正的选路阶段 - 真正选路时,先在“当前国家”里找更快节点
- 如果当前国家没有可用节点: 按
US -> JP -> SG -> OTHER依次找可用国家 - 在命中的国家里,选延迟最小的那个节点
- 调用 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 --verbose6. 常用参数
修改阈值:
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 1234567. 几分钟检查一次更合适
我的建议还是:
- 首选
3 分钟
原因是:
- 对“节点偶发抖动”响应比较及时
- 不会像
1 分钟那样太敏感 - 也不会像
5~10 分钟那样恢复太慢
如果你后面发现切换还是偏频繁,可以继续再加严一点:
- 把阈值改成
350ms - 把连续超阈值次数调成
3
这次已经按你刚才认可的思路,默认实现成“连续 2 次超过阈值才考虑切换”。
8. 推荐定时方式
最适合 macOS 的是 launchd。
比如每 180 秒执行一次:
bash
*/3 * * * * 不是 launchd 的写法launchd 通常会用 StartInterval = 180 这种方式。
如果你要,我下一步可以继续帮你补一份:
LaunchAgent plist- 一键安装命令
- 查看日志命令
- 开关脚本
这样你后面就不需要手动跑了。