Clash Verge 扩展脚本:保留原规则并按订阅追加分流
使用 main(config, profileName) 编写扩展脚本,处理空规则、避免重复追加,检查输出配置并恢复原脚本。
本页目录
扩展脚本接收当前配置对象,修改后返回给客户端。它适合保留旧列表后增加规则、根据配置名称执行不同逻辑,以及批量处理已有节点。只改一个固定字段时,优先使用扩展覆写配置 ,代码越少越容易排错。
备份与编辑入口
打开「订阅」,备份已有 Script 内容。页面中的「全局扩展脚本」会处理全部订阅;右键某张订阅卡片,选择「扩展脚本」,则只对那份订阅生效。第一次使用建议选订阅级入口。
准备一份原本可以连接的订阅,记下卡片名称和已有代理组名称。先不要同时修改 DNS、节点和策略组,这样可以单独验证脚本是否正确生效。
脚本入口及返回值
最小脚本如下:
function main(config, profileName) {
return config;
}
config 是 YAML 转换而来的对象;带连字符的键使用方括号,例如 config["proxy-groups"]。profileName 是当前处理的配置文件名称,可以用于条件判断。
必须返回配置对象。不要只在函数里修改属性却漏掉 return config,也不要返回 JSON 字符串。这里运行的是客户端内的脚本引擎,不是浏览器页面或 Node.js,不能用 fetch 下载订阅,也不能使用 require 或文件读写 API。
完整示例:在原规则前加一个直连域名
将下面代码放入目标订阅的扩展脚本。它只针对示例域名添加直连规则,保留原有规则顺序,并删除旧列表中完全相同的重复项。
function main(config, profileName) {
const newRule = "DOMAIN,example.com,DIRECT";
const oldRules = Array.isArray(config.rules)
? config.rules
: [];
config.rules = [newRule].concat(
oldRules.filter(function (rule) {
return rule !== newRule;
})
);
return config;
}
保存后确认没有脚本语法错误。此例使用 DIRECT,不依赖订阅中的特定组名。需要改成代理时,将其替换为真实存在的组名;组名在其他订阅中可能不同,不宜直接把这种脚本放到全局使用。
如果只需偶尔添加一两条规则,也可以使用自定义规则 的可视化编辑方式,不必维护脚本。
全局脚本怎样只处理一个订阅
在全局 Script 中根据名称提前返回,可限制作用范围:
function main(config, profileName) {
if (profileName !== "我的订阅") {
return config;
}
const rule = "DOMAIN,example.com,DIRECT";
const original = Array.isArray(config.rules)
? config.rules
: [];
config.rules = [rule].concat(
original.filter(function (item) {
return item !== rule;
})
);
return config;
}
把「我的订阅」改成目标卡片准确名称。以后重命名订阅,也要同步修改条件。不要把两个完整的 main 函数一起粘贴到同一文件;选择一个版本,或把不同修改整理进同一个函数。
查看最终结果并验证连接
- 保存脚本后,打开订阅页顶部的「查看运行时订阅」。
- 搜索
DOMAIN,example.com,DIRECT,确认它只出现一次,并位于rules的前面。 - 检查后面的原有规则仍然存在,特别是原来的兜底规则。
- 将客户端设为规则模式,打开「连接」,新建对目标域名的请求。
- 核对主机、命中的规则和链路。若浏览器还在复用旧连接,关闭该连接后重新测试。
全局脚本后面还有订阅扩展配置、订阅扩展脚本。如果最终结果与代码不同,应检查后续步骤是否替换了 rules。端口、模式和 TUN 开关等应用设置接管的字段,也不能靠脚本在最后强行更改。
常见错误与撤回
**提示语法错误:**检查英文引号、括号和逗号;不要复制代码块标记。先恢复最小脚本,确认能保存,再加入修改。
**提示某属性不存在:**确认它应为数组还是对象。使用数组操作前先检查类型,不要假设所有订阅都带有 rules 或 proxies。
**规则重复或越加越多:**加入前先过滤同一条规则;不要依靠持续 push,也不要把 MATCH 插到首行。
**脚本成功但网站没变化:**查看运行配置及实际命中,不能把“没有报错”当成分流成功。
恢复时将备份完整贴回原入口;原来没有脚本则恢复为最小 main。重新激活订阅并检查连接。仍有加载错误,可按导出日志
保留相关报错,避免把含订阅密钥的整个配置公开发送。