Clash Verge Rev 订阅预处理脚本编写实操:利用 JavaScript 自动清洗节点名称与重构策略组

一、为什么纯手动改 YAML 是件苦差事

许多服务商提供的 Clash 订阅链接,拉取下来之后让人非常头疼:

节点列表的第一行是 `【官网:xxx.com】`,第二行是 `【剩余流量:150G】`,底下真正的节点名字还带了一长串花哨的 Emoji、促销广告词和毫无意义的速率倍率。

每次更新订阅,配置文件就会被远端全量覆盖重写一次。

如果你手动去本地改 YAML,下次点「更新」,所有修改瞬间灰飞烟灭。

Clash Verge Rev 提供了极其强大的原生脚本注入引擎(基于内置的 JavaScript 运行时)。只要给订阅挂载一个后处理 Script,客户端每次从云端拉取完原始 YAML 后,都会在内存中自动跑一遍你的 JS 代码,完成清洗、过滤和重组,再交付给内核渲染。本地完全零人工干预。

二、开箱即用的预处理代码实现

Clash Verge Rev 扩展脚本代码编辑器中编写订阅预处理 JavaScript

完整脚本源码与注释

点击 Clash Verge Rev 左侧菜单的 「订阅」。

右键你要优化的订阅卡片,选择 「扩展配置 (Script)」(或在全局设置的 Script 扩展中新建)。

清空默认模板,将以下健壮的过滤与重组代码完整粘贴进去:

// Clash Verge Rev 订阅预处理核心入口
function main(config) {
  // 1. 定义需要彻底剔除的垃圾节点黑名单关键字正则
  const excludeRegex = /(官网|流量|到期|通知|群|返利|网站|测速|expire|traffic|reset)/i;

  // 2. 过滤无用的提示性伪节点
  if (Array.isArray(config.proxies)) {
    config.proxies = config.proxies.filter(proxy => {
      // 排除名称匹配黑名单的节点
      return !excludeRegex.test(proxy.name);
    });

    // 3. 规范化清洗节点名称(去除冗余修饰词)
    config.proxies.forEach(proxy => {
      proxy.name = proxy.name
        .replace(/(\[.*?\]|\(.*?\))/g, '') // 去除中括号和圆括号内容
        .replace(/\s+/g, ' ')              // 压缩多个空格为一个
        .trim();                           // 去除首尾空格
    });
  }

  // 4. 获取所有清洗后的纯净节点名称数组
  const cleanProxyNames = config.proxies ? config.proxies.map(p => p.name) : [];

  // 5. 动态重构或注入自定义策略组
  if (Array.isArray(config['proxy-groups']) && cleanProxyNames.length > 0) {
    // 遍历现有的策略组,确保引用的节点池也是清洗后的纯净列表
    config['proxy-groups'].forEach(group => {
      if (group.proxies && Array.isArray(group.proxies)) {
        // 保留原策略组中非垃圾节点的引用
        group.proxies = group.proxies.filter(name => !excludeRegex.test(name));
      }
    });

    // 新增一个纯净的“自动优选”测速组
    const autoGroupIndex = config['proxy-groups'].findIndex(g => g.name === '🚀 自动选择');
    if (autoGroupIndex === -1) {
      config['proxy-groups'].unshift({
        name: '🚀 自动选择',
        type: 'url-test',
        url: 'http://www.gstatic.com/generate_204',
        interval: 300,
        tolerance: 50,
        proxies: cleanProxyNames
      });
    }
  }

  // 必须返回处理后的完整 config 对象
  return config;
}

 

三、配置生效与语法排错

步骤验证

代码粘贴完成后,点击编辑器右下角的 「保存并测试」 按钮。

观察控制台输出面板:

  • 如果返回绿色的 `Script executed successfully`,说明 JavaScript 语法校验通过。

返回主界面,在对应的订阅卡片上点击 「刷新订阅」。切换到左侧菜单的 「代理」 节点列表:原本充斥着垃圾广告词、过长域名的杂乱节点列表,瞬间被清洗得干干净净,顶部直接生成了配置完备的快速自动测速组。

常见报错与避坑说明

  • 报错 `TypeError: Cannot read properties of undefined`:

原因:某些极简订阅中根本没有 `proxy-groups` 字段,直接调用 `forEach` 导致空指针异常。上面的代码中已经加入了 `Array.isArray()` 前置防御性校验,能完美规避此问题。

  • 脚本保存后节点列表全空了:

原因:黑名单正则匹配范围写得太宽泛(例如误写了 `/(.*)/`)。检查代码第一行的 `excludeRegex`,只保留明确的广告或提示性词根。