· BigDog · AI 工程实验  · 10 min read

Clash Verge Script 规则管理指南

使用 Script 统一管理 Clash Verge 规则新增和维护。

目录

这篇记录的是 Clash Verge 规则脚本的维护方式。目标不是堆更多规则,而是把规则来源、插入位置和验证方法固定下来,避免以后代理配置越改越乱。

这篇笔记怎么读

  • 先看规则来源:硬编码、本地文件、远程文件分别适合不同维护频率。
  • 再看规则插入位置:Clash 采用首条匹配,顺序比规则数量更重要。
  • 最后看验证方式:改完脚本后要观察命中情况,不要只看配置能否保存。

脚本支持三种规则来源:

  • 硬编码:直接在脚本中写入固定规则。
  • 本地文件:从你电脑上的 .txt.yaml 文件加载规则。
  • 远程文件:从网络 URL(例如社区维护的规则集)加载规则,并自动格式化为 Clash 所需格式。

所有操作均通过 Script 配置 完成,兼容 Clash Verge 最新版本(v1.7.2+)。


1. 原理说明

Clash Verge 的 Script 配置 是一个 JavaScript 函数,它在主配置加载后、最终生效前被执行。你可以通过修改 config.rules 数组来插入、删除或重排规则。

由于 Clash 采用 首条匹配 原则,新增规则通常应插入到现有规则列表的 最前面(使用 unshift)以获得最高优先级。


2. 完整脚本

将以下脚本完整复制到你的 Script 配置中,根据需要修改开头的配置部分。

// ==================== 配置区域(请按需修改) ====================
// 1. 硬编码规则列表
const hardcodedRules = [
  "DOMAIN-SUFFIX,overleaf.com,DIRECT",
  "DOMAIN-SUFFIX,baidu.com,DIRECT",
  "DOMAIN-KEYWORD,google,PROXY"
];

// 2. 本地文件路径(绝对路径或相对于 Clash Verge 工作目录的路径)
//    例如:C:/Users/你的用户名/my-rules.txt 或 ./my-rules.txt
const localFilePath = "";   // 留空表示不使用本地文件

// 3. 远程规则集 URL(支持每行一个域名或完整 Clash 规则)
//    参考项目:https://github.com/Loyalsoldier/clash-rules
const remoteUrl = "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/direct.txt";
// ==============================================================

// 同步 HTTP GET 函数(用于加载远程文件)
function httpGet(url) {
  let req = new XMLHttpRequest();
  req.open("GET", url, false);
  req.send(null);
  if (req.status === 200) return req.responseText;
  return null;
}

// 读取本地文件(注意:QuickJS 环境不支持 Node.js fs 模块,此函数仅为示例,实际不可用)
// 说明:Clash Verge Script 环境无法直接读取任意本地文件,但可以通过 Merge 配置的 !file 指令替代。
// 如果你确实需要本地文件,请改用 Merge 配置(参考第 4 节)。
function readLocalFile(path) {
  // 由于环境限制,这里不实现真正的文件读取。
  // 建议将本地规则直接写在 hardcodedRules 中,或改用 Merge 配置。
  console.log("本地文件读取在当前 Script 环境中不可用,请使用 hardcodedRules 或 Merge 配置。");
  return null;
}

// 将远程响应文本转换为 Clash 规则数组
function parseRemoteRules(text, sourceType) {
  const lines = text.split(/\r?\n/);
  const rules = [];
  for (let line of lines) {
    line = line.trim();
    if (line === "" || line.startsWith("#")) continue;
    
    if (sourceType === "domain-list") {
      // 如果远程文件只包含域名(如 Loyalsoldier 的 direct.txt 实际已是完整规则)
      // 这里不做额外处理,因为 Loyalsoldier 文件本身就是 "DOMAIN-SUFFIX,domain,DIRECT" 格式
      rules.push(line);
    } else {
      // 默认直接添加
      rules.push(line);
    }
  }
  return rules;
}

function main(config, profileName) {
  const newRules = [];
  
  // 1. 添加硬编码规则
  newRules.push(...hardcodedRules);
  
  // 2. 添加远程规则(如果提供了 URL)
  if (remoteUrl) {
    const remoteData = httpGet(remoteUrl);
    if (remoteData) {
      const remoteRules = parseRemoteRules(remoteData, "domain-list");
      newRules.push(...remoteRules);
      console.log(`已加载远程规则 ${remoteRules.length} 条`);
    } else {
      console.log(`远程规则加载失败: ${remoteUrl}`);
    }
  }
  
  // 3. 将新规则插入到已有规则的最前面
  if (newRules.length > 0) {
    config.rules.unshift(...newRules);
  }
  
  return config;
}

3. 使用步骤

3.1 创建 Script 配置

  1. 打开 Clash Verge,进入 Profiles(配置)页面。
  2. 点击 NewScript,命名为 规则补充(或任意名称)。
  3. 将上面的完整脚本粘贴到编辑器中。

3.2 按需修改配置区域

场景 A:仅使用硬编码规则

const hardcodedRules = [
  "DOMAIN-SUFFIX,overleaf.com,DIRECT",
  "DOMAIN-SUFFIX,github.com,PROXY"
];
const localFilePath = "";
const remoteUrl = "";

场景 B:使用 Loyoldsoldier 远程直连规则

保持 remoteUrl 为默认值:

const remoteUrl = "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/direct.txt";

你也可以使用其他分类:

规则类型URL
直连(国内域名)https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/direct.txt
代理(GFW列表)https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/proxy.txt
广告拦截https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/reject.txt

场景 C:同时使用多个远程规则集

修改 remoteUrl 为你的自定义 URL,或者将脚本扩展为循环加载多个 URL(参考进阶部分)。

3.3 启用 Script 配置

  • 保存脚本后,右键点击该 Script 配置 → Enable(启用)。
  • 然后在 Profiles 页面点击你的主配置文件,Clash Verge 会自动重新加载并生效。

4. 关于本地文件的替代方案

由于 Clash Verge 的 Script 环境(QuickJS)不支持直接读取本地文件,如果你确实需要从本地文件加载规则,请使用 Merge 配置 + !file 指令。

4.1 创建本地规则文件

新建一个文本文件,例如 my-rules.txt,每行一条 Clash 规则:

DOMAIN-SUFFIX,local.dev,DIRECT
DOMAIN-SUFFIX,company.com,PROXY

4.2 创建 Merge 配置

  1. 新建 Merge 配置:NewMerge
  2. 写入以下内容:
    prepend-rules: !file ./my-rules.txt

    注意:新版 Clash Verge (v1.7.2+) 已移除 prepend-rules 语法,请改用可视化规则编辑器导入本地文件,或降级到旧版本。

推荐做法:将本地规则直接写在 Script 配置的 hardcodedRules 数组中,这是最简单可靠的方式。


5. 验证规则是否生效

  1. 打开 Clash Verge 的 Logs(日志)页面。
  2. 访问一个你添加了规则的网站(如 overleaf.com)。
  3. 查看日志中匹配到的规则,应显示 DIRECT(或其他你指定的策略)。

6. 进阶:加载多个远程规则集

若需同时加载 Loyalsoldier 的直连、代理等多个规则集,可修改脚本如下:

const remoteUrls = [
  "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/direct.txt",
  "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/proxy.txt"
];

function main(config) {
  const newRules = [];
  
  for (const url of remoteUrls) {
    const data = httpGet(url);
    if (data) {
      const rules = data.split('\n')
        .map(l => l.trim())
        .filter(l => l && !l.startsWith('#'));
      newRules.push(...rules);
    }
  }
  
  // 去重(可选,保留先出现的)
  const uniqueRules = [...new Map(newRules.map(r => [r, r])).values()];
  config.rules.unshift(...uniqueRules);
  
  return config;
}

7. 常见问题

Q: 添加的规则不生效?

  • 检查规则顺序:使用 unshift 插入到最前面是正确的,但如果主配置中已经有更早匹配的规则(例如 DOMAIN-SUFFIX,com,PROXY),则会优先匹配。确保你的规则足够具体。
  • 查看日志:在 Logs 中观察匹配详情。

Q: 远程规则加载失败?

  • 确认 URL 可以直接在浏览器中访问。
  • 如果使用 raw.githubusercontent.com,请替换为 cdn.jsdelivr.net 镜像。
  • 检查网络连接,可能需要临时关闭代理。

Q: 能否与 Rule Providers 同时使用?

可以。Script 配置会在 Rule Providers 加载后执行,所以你的 unshift 规则仍然会在最前面,优先级最高。


8. 总结

需求推荐方案
添加少量固定规则硬编码到 Script 的 hardcodedRules
使用社区维护的规则集(如 Loyolsoldier)Script 中配置 remoteUrl
从本地文件加载规则将内容复制到 hardcodedRules,或改用 Merge(旧版)
同时使用多个远程规则集扩展脚本循环加载

通过上述脚本,你可以在不修改原始订阅配置的前提下,灵活地扩展任何规则。

Clash Verge Script 规则管理指南

Clash Verge版本:v2.4.2

// ==================== 配置区域(请按需修改) ====================
// 1. 硬编码规则列表
const hardcodedRules = [
  "DOMAIN-SUFFIX,overleaf.com,DIRECT",
  "DOMAIN-SUFFIX,deepseek.com,DIRECT",
  "DOMAIN-SUFFIX,kimi.com,DIRECT",
  "DOMAIN-SUFFIX,overleafusercontent.com,DIRECT"
];

function main(config, profileName) {
  const newRules = [];
  
  // 1. 添加硬编码规则
  newRules.push(...hardcodedRules);
  
  // 3. 将新规则插入到已有规则的最前面
  if (newRules.length > 0) {
    config.rules.unshift(...newRules);
  }
  
  return config;
}```
Back to Blog

Related Posts

View All Posts »