// Clash Verge 全局扩展脚本
// 将此脚本复制到 Clash Verge -> 订阅 -> 全局扩展脚本

// ==================== 配置常量 ====================

// 代理组基础配置
const groupBaseOption = {
  interval: 0,
  timeout: 3000,
  url: "https://www.google.com/generate_204",
  lazy: true,
  "max-failed-times": 3,
  hidden: false,
};

// 图标 URL 基础路径
const iconBaseUrl = "https://fastly.jsdelivr.net/gh/clash-verge-rev/clash-verge-rev.github.io@main/docs/assets/icons";

// 落地节点排除过滤器(用于排除落地节点不参与自动选择)
const landingNodeExcludeFilter = "(?i)webshare";

// ==================== 主函数 ====================
function main(config) {
  // 添加代理提供者
  config["proxy-providers"] = getProxyProviders();

  // 添加落地节点代理
  config.proxies = getProxies();

  // 配置 DNS
  config.dns = getDnsConfig();

  // 添加规则提供者
  config["rule-providers"] = getRuleProviders();

  // 添加规则
  config.rules = getRules();

  // 添加代理组
  config["proxy-groups"] = getProxyGroups();

  return config;
}

// ==================== 代理提供者配置 ====================
function getProxyProviders() {
  return {
    p1: {
      type: "http",
      url: "", // 请替换成你的订阅链接
      interval: 86400,
      proxy: "🔰 模式选择",
      path: "./proxy_providers/p1.yaml",
      "health-check": {
        enable: false,
        url: "http://www.gstatic.com/generate_204",
        interval: 3600,
      },
      override: {
        "additional-prefix": "p1 | ",
        udp: true,
      },
    },
    // --- 在这里添加其他订阅 ---
    // p2: {
    //   type: "http",
    //   url: "YOUR_SECOND_SUBSCRIPTION_URL",
    //   interval: 86400,
    //   path: "./proxy_providers/p2.yaml",
    //   "health-check": {
    //     enable: true,
    //     url: "http://www.gstatic.com/generate_204",
    //     interval: 3600,
    //   },
    //   override: {
    //     "additional-prefix": "p2 | ",
    //   },
    // },
  };
}

// ==================== 落地节点配置 ====================
function getProxies() {
  return [
    // --- 机场节点 开始 (请替换成你自己的信息) ---
    {
      name: "", // 替换成你的机场节点起个名字
      server: "",  // 替换成你的机场节点IP或域名
      port: ,  // 替换成你的机场节点端口
      sni: "", // Server Name Indication(服务器名称指示),TLS 握手时发送的域名,用于伪装流量-SNI 伪装原理:将流量伪装成访问正常网站,防火墙看到的是你在访问一个普通 HTTPS 网站
      up: "100 Mbps",  // 上传带宽限制,告诉服务器你的上行速度
      down: "200 Mbps",  // 下载带宽限制,告诉服务器你的下行速度
      "skip-cert-verify": true,  // 跳过 TLS 证书验证,true 表示不验证证书(自签证书时需要)
      type: "hysteria2",  //  代理协议类型,这里是 Hysteria2 协议
      password: "",  // 认证密码,连接服务器时的验证凭证
    },
	
	// 落地节点
    {
      name: "", // 替换成你的落地节点起个名字
      server: "",  // 替换成你的落地节点IP或域名
      port: ,  // 替换成你的落地节点端口
      type: "",  // 代理协议类型,这里是 SOCKS5 协议
      username: "",  // 替换成你的用户名
      password: "",  // 替换成你的密码
      tls: false,  //  是否启用 TLS 加密,false 表示不加密
      "skip-cert-verify": true,  // 跳过证书验证(TLS 关闭时此项无实际作用) true 表示:跳过证书验证
      udp: true,  // 是否支持 UDP 转发,true 表示支持
      "dialer-proxy": "⚙️ 节点选择",  // 链式代理,指定通过哪个代理组连接此节点
    },
    // --- 如果有更多落地节点,在这里继续添加 ---
  ];
}

// ==================== DNS 配置 ====================
function getDnsConfig() {
  return {
    enable: true,
    listen: "0.0.0.0:1053",
    "prefer-h3": false,
    "respect-rules": true,
    "use-system-hosts": false,
    "cache-algorithm": "arc",
    "enhanced-mode": "fake-ip",
    "fake-ip-range": "198.18.0.1/16",
    "fake-ip-filter": [
      "+.lan",
      "+.local",
      "+.msftconnecttest.com",
      "+.msftncsi.com",
      "localhost.ptlogin2.qq.com",
      "localhost.sec.qq.com",
      "localhost.work.weixin.qq.com",
    ],
    "default-nameserver": ["223.5.5.5", "1.2.4.8"],
    nameserver: [
      "https://cloudflare-dns.com/dns-query",
      "https://77.88.8.8/dns-query",
      "https://8.8.4.4/dns-query#ecs=1.1.1.1/24&ecs-override=true",
      "https://208.67.222.222/dns-query#ecs=1.1.1.1/24&ecs-override=true",
    ],
    "proxy-server-nameserver": [
      "https://223.5.5.5/dns-query",
      "https://doh.pub/dns-query",
    ],
    "direct-nameserver": [
      "https://223.5.5.5/dns-query",
      "https://doh.pub/dns-query",
    ],
    "direct-nameserver-follow-policy": false,
    "nameserver-policy": {
      "geosite:cn": [
        "https://223.5.5.5/dns-query",
        "https://doh.pub/dns-query",
      ],
    },
  };
}

// ==================== 规则提供者配置 ====================
function getRuleProviders() {
  const loyalsoldierBase = "https://fastly.jsdelivr.net/gh/Loyalsoldier/clash-rules@release";
  const metaCubeXBase = "https://raw.githubusercontent.com/MetaCubeX/meta-rules-dat/refs/heads/meta/geo/geosite/classical";

  return {
    // Loyalsoldier 规则集
    reject: {
      type: "http",
      format: "yaml",
      interval: 86400,
      behavior: "domain",
      url: `${loyalsoldierBase}/reject.txt`,
      path: "./ruleset/loyalsoldier/reject.yaml",
    },
    icloud: {
      type: "http",
      format: "yaml",
      interval: 86400,
      behavior: "domain",
      url: `${loyalsoldierBase}/icloud.txt`,
      path: "./ruleset/loyalsoldier/icloud.yaml",
    },
    apple: {
      type: "http",
      format: "yaml",
      interval: 86400,
      behavior: "domain",
      url: `${loyalsoldierBase}/apple.txt`,
      path: "./ruleset/loyalsoldier/apple.yaml",
    },
    google: {
      type: "http",
      format: "yaml",
      interval: 86400,
      behavior: "domain",
      url: `${loyalsoldierBase}/google.txt`,
      path: "./ruleset/loyalsoldier/google.yaml",
    },
    proxy: {
      type: "http",
      format: "yaml",
      interval: 86400,
      behavior: "domain",
      url: `${loyalsoldierBase}/proxy.txt`,
      path: "./ruleset/loyalsoldier/proxy.yaml",
    },
    direct: {
      type: "http",
      format: "yaml",
      interval: 86400,
      behavior: "domain",
      url: `${loyalsoldierBase}/direct.txt`,
      path: "./ruleset/loyalsoldier/direct.yaml",
    },
    private: {
      type: "http",
      format: "yaml",
      interval: 86400,
      behavior: "domain",
      url: `${loyalsoldierBase}/private.txt`,
      path: "./ruleset/loyalsoldier/private.yaml",
    },
    gfw: {
      type: "http",
      format: "yaml",
      interval: 86400,
      behavior: "domain",
      url: `${loyalsoldierBase}/gfw.txt`,
      path: "./ruleset/loyalsoldier/gfw.yaml",
    },
    "tld-not-cn": {
      type: "http",
      format: "yaml",
      interval: 86400,
      behavior: "domain",
      url: `${loyalsoldierBase}/tld-not-cn.txt`,
      path: "./ruleset/loyalsoldier/tld-not-cn.yaml",
    },
    telegramcidr: {
      type: "http",
      format: "yaml",
      interval: 86400,
      behavior: "ipcidr",
      url: `${loyalsoldierBase}/telegramcidr.txt`,
      path: "./ruleset/loyalsoldier/telegramcidr.yaml",
    },
    cncidr: {
      type: "http",
      format: "yaml",
      interval: 86400,
      behavior: "ipcidr",
      url: `${loyalsoldierBase}/cncidr.txt`,
      path: "./ruleset/loyalsoldier/cncidr.yaml",
    },
    lancidr: {
      type: "http",
      format: "yaml",
      interval: 86400,
      behavior: "ipcidr",
      url: `${loyalsoldierBase}/lancidr.txt`,
      path: "./ruleset/loyalsoldier/lancidr.yaml",
    },
    applications: {
      type: "http",
      format: "yaml",
      interval: 86400,
      behavior: "classical",
      url: `${loyalsoldierBase}/applications.txt`,
      path: "./ruleset/loyalsoldier/applications.yaml",
    },
    // MetaCubeX 规则集
    openai: {
      type: "http",
      format: "yaml",
      interval: 86400,
      behavior: "classical",
      url: `${metaCubeXBase}/openai.yaml`,
      path: "./ruleset/MetaCubeX/openai.yaml",
    },
    bybit: {
      type: "http",
      format: "yaml",
      interval: 86400,
      behavior: "classical",
      url: `${metaCubeXBase}/bybit.yaml`,
      path: "./ruleset/MetaCubeX/bybit.yaml",
    },
    pikpak: {
      type: "http",
      format: "yaml",
      interval: 86400,
      behavior: "classical",
      url: `${metaCubeXBase}/pikpak.yaml`,
      path: "./ruleset/MetaCubeX/pikpak.yaml",
    },
    anthropic: {
      type: "http",
      format: "yaml",
      interval: 86400,
      behavior: "classical",
      url: `${metaCubeXBase}/anthropic.yaml`,
      path: "./ruleset/MetaCubeX/anthropic.yaml",
    },
    "google-gemini": {
      type: "http",
      format: "yaml",
      interval: 86400,
      behavior: "classical",
      url: `${metaCubeXBase}/google-gemini.yaml`,
      path: "./ruleset/MetaCubeX/google-gemini.yaml",
    },
    xai: {
      type: "http",
      format: "yaml",
      interval: 86400,
      behavior: "classical",
      url: `${metaCubeXBase}/xai.yaml`,
      path: "./ruleset/MetaCubeX/xai.yaml",
    },
    perplexity: {
      type: "http",
      format: "yaml",
      interval: 86400,
      behavior: "classical",
      url: `${metaCubeXBase}/perplexity.yaml`,
      path: "./ruleset/MetaCubeX/perplexity.yaml",
    },
    microsoft: {
      type: "http",
      format: "yaml",
      interval: 86400,
      behavior: "classical",
      url: `${metaCubeXBase}/microsoft.yaml`,
      path: "./ruleset/MetaCubeX/microsoft.yaml",
    },
  };
}

// ==================== 规则配置 ====================
function getRules() {
  return [
    // 额外自定义规则
    "PROCESS-NAME,steam.exe,🐬 自定义直连",
    "DOMAIN-SUFFIX,immersivetranslate.com,🐳 自定义代理",

    // 自定义规则
    "DOMAIN-SUFFIX,googleapis.cn,🔰 模式选择",
    "DOMAIN-SUFFIX,gstatic.com,🔰 模式选择",
    "DOMAIN-SUFFIX,xn--ngstr-lra8j.com,🔰 模式选择",
    "DOMAIN-SUFFIX,github.io,🔰 模式选择",
    "DOMAIN,v2rayse.com,🔰 模式选择",

    // MetaCubeX 规则集
    "RULE-SET,openai,💸 ChatGPT-Gemini-XAI-Perplexity",
    "RULE-SET,pikpak,🅿️ PikPak",
    "RULE-SET,bybit,🪙 Bybit",
    "RULE-SET,anthropic,💵 Claude",
    "RULE-SET,google-gemini,💸 ChatGPT-Gemini-XAI-Perplexity",
    "RULE-SET,xai,💸 ChatGPT-Gemini-XAI-Perplexity",
    "RULE-SET,perplexity,💸 ChatGPT-Gemini-XAI-Perplexity",

    // Loyalsoldier 规则集
    "RULE-SET,applications,🔗 全局直连",
    "RULE-SET,private,🔗 全局直连",
    "RULE-SET,reject,🥰 广告过滤",
    "RULE-SET,microsoft,Ⓜ️ 微软服务",
    "RULE-SET,icloud,🍎 苹果服务",
    "RULE-SET,apple,🍎 苹果服务",
    "RULE-SET,google,📢 谷歌服务",
    "RULE-SET,proxy,🔰 模式选择",
    "RULE-SET,gfw,🔰 模式选择",
    "RULE-SET,tld-not-cn,🔰 模式选择",
    "RULE-SET,direct,🔗 全局直连",
    "RULE-SET,lancidr,🔗 全局直连,no-resolve",
    "RULE-SET,cncidr,🔗 全局直连,no-resolve",
    "RULE-SET,telegramcidr,📲 电报消息,no-resolve",

    // 其他规则
    "GEOIP,LAN,🔗 全局直连,no-resolve",
    "GEOIP,CN,🔗 全局直连,no-resolve",
    "MATCH,🐟 漏网之鱼",
  ];
}

// ==================== 代理组配置 ====================
function getProxyGroups() {
  // 代理提供者列表
  const providersList = ["p1"]; // 如果有 p2,添加到这里: ["p1", "p2"]

  // 落地节点列表
  const landingNodes = [""];  // 替换你的第2个节点 

  // 基础代理组选项
  const baseProxies = [
    "🔰 模式选择",
    "⚙️ 节点选择",
    "🕊️ 落地节点",
    "♻️ 延迟选优",
    "🚑 故障转移",
    "⚖️ 负载均衡(散列)",
    "☁️ 负载均衡(轮询)",
    "🔗 全局直连",
  ];

  return [
    // 模式选择
    {
      ...groupBaseOption,
      name: "🔰 模式选择",
      type: "select",
      proxies: ["⚙️ 节点选择", "🕊️ 落地节点", "🔗 全局直连"],
      icon: `${iconBaseUrl}/adjust.svg`,
    },

    // 节点选择
    {
      ...groupBaseOption,
      name: "⚙️ 节点选择",
      type: "select",
      proxies: [
        "♻️ 延迟选优",
        "🚑 故障转移",
        "⚖️ 负载均衡(散列)",
        "☁️ 负载均衡(轮询)",
        "",  // 替换你的第1个节点
      ],
      "exclude-filter": landingNodeExcludeFilter,
      icon: `${iconBaseUrl}/adjust.svg`,
    },

    // 落地节点
    {
      ...groupBaseOption,
      name: "🕊️ 落地节点",
      type: "select",
      proxies: landingNodes,
      icon: `${iconBaseUrl}/openwrt.svg`,
    },

    // 延迟选优
    {
      ...groupBaseOption,
      name: "♻️ 延迟选优",
      type: "url-test",
      tolerance: 50,
      use: providersList,
      "exclude-filter": landingNodeExcludeFilter,
      icon: `${iconBaseUrl}/speed.svg`,
    },

    // 故障转移
    {
      ...groupBaseOption,
      name: "🚑 故障转移",
      type: "fallback",
      use: providersList,
      icon: `${iconBaseUrl}/ambulance.svg`,
    },

    // 负载均衡(散列)
    {
      ...groupBaseOption,
      name: "⚖️ 负载均衡(散列)",
      type: "load-balance",
      strategy: "consistent-hashing",
      use: providersList,
      "exclude-filter": landingNodeExcludeFilter,
      icon: `${iconBaseUrl}/merry_go.svg`,
    },

    // 负载均衡(轮询)
    {
      ...groupBaseOption,
      name: "☁️ 负载均衡(轮询)",
      type: "load-balance",
      strategy: "round-robin",
      use: providersList,
      "exclude-filter": landingNodeExcludeFilter,
      icon: `${iconBaseUrl}/balance.svg`,
    },

    // 国外媒体
    {
      ...groupBaseOption,
      name: "🌍 国外媒体",
      type: "select",
      proxies: baseProxies,
      use: providersList,
      icon: `${iconBaseUrl}/youtube.svg`,
    },

    // ChatGPT-Gemini-XAI-Perplexity
    {
      ...groupBaseOption,
      name: "💸 ChatGPT-Gemini-XAI-Perplexity",
      type: "select",
      proxies: [
        "🔰 模式选择",
        "⚙️ 节点选择",
        "🕊️ 落地节点",
        "🔗 全局直连",
        "♻️ 延迟选优",
        "🚑 故障转移",
        "⚖️ 负载均衡(散列)",
        "☁️ 负载均衡(轮询)",
      ],
      use: providersList,
      "exclude-filter": "(?i)港|hk|hongkong|hong kong|俄|ru|russia|澳|macao",
      icon: `${iconBaseUrl}/chatgpt.svg`,
    },

    // Claude
    {
      ...groupBaseOption,
      name: "💵 Claude",
      type: "select",
      proxies: baseProxies,
      use: providersList,
      icon: `${iconBaseUrl}/claude.svg`,
    },

    // Bybit
    {
      ...groupBaseOption,
      name: "🪙 Bybit",
      type: "select",
      proxies: baseProxies,
      use: providersList,
      icon: `${iconBaseUrl}/link.svg`,
    },

    // PikPak
    {
      ...groupBaseOption,
      name: "🅿️ PikPak",
      type: "select",
      proxies: baseProxies,
      use: providersList,
      icon: `${iconBaseUrl}/link.svg`,
    },

    // 电报消息
    {
      ...groupBaseOption,
      name: "📲 电报消息",
      type: "select",
      proxies: baseProxies,
      use: providersList,
      icon: `${iconBaseUrl}/telegram.svg`,
    },

    // 谷歌服务
    {
      ...groupBaseOption,
      name: "📢 谷歌服务",
      type: "select",
      proxies: baseProxies,
      use: providersList,
      icon: `${iconBaseUrl}/google.svg`,
    },

    // 苹果服务
    {
      ...groupBaseOption,
      name: "🍎 苹果服务",
      type: "select",
      proxies: baseProxies,
      use: providersList,
      icon: `${iconBaseUrl}/apple.svg`,
    },

    // 微软服务
    {
      ...groupBaseOption,
      name: "Ⓜ️ 微软服务",
      type: "select",
      proxies: [
        "🔰 模式选择",
        "⚙️ 节点选择",
        "🕊️ 落地节点",
        "🔗 全局直连",
        "♻️ 延迟选优",
        "🚑 故障转移",
        "⚖️ 负载均衡(散列)",
        "☁️ 负载均衡(轮询)",
      ],
      use: providersList,
      icon: `${iconBaseUrl}/microsoft.svg`,
    },

    // 广告过滤
    {
      ...groupBaseOption,
      name: "🥰 广告过滤",
      type: "select",
      proxies: ["REJECT", "DIRECT"],
      icon: `${iconBaseUrl}/bug.svg`,
    },

    // 全局直连
    {
      ...groupBaseOption,
      name: "🔗 全局直连",
      type: "select",
      proxies: [
        "DIRECT",
        "⚙️ 节点选择",
        "♻️ 延迟选优",
        "🚑 故障转移",
        "⚖️ 负载均衡(散列)",
        "☁️ 负载均衡(轮询)",
      ],
      icon: `${iconBaseUrl}/link.svg`,
    },

    // 全局拦截
    {
      ...groupBaseOption,
      name: "❌ 全局拦截",
      type: "select",
      proxies: ["REJECT", "DIRECT"],
      icon: `${iconBaseUrl}/block.svg`,
    },

    // 自定义直连
    {
      ...groupBaseOption,
      name: "🐬 自定义直连",
      type: "select",
      proxies: [
        "🔗 全局直连",
        "🔰 模式选择",
        "⚙️ 节点选择",
        "♻️ 延迟选优",
        "🚑 故障转移",
        "⚖️ 负载均衡(散列)",
        "☁️ 负载均衡(轮询)",
      ],
      icon: `${iconBaseUrl}/unknown.svg`,
    },

    // 自定义代理
    {
      ...groupBaseOption,
      name: "🐳 自定义代理",
      type: "select",
      proxies: baseProxies,
      use: providersList,
      icon: `${iconBaseUrl}/openwrt.svg`,
    },

    // 漏网之鱼
    {
      ...groupBaseOption,
      name: "🐟 漏网之鱼",
      type: "select",
      proxies: baseProxies,
      use: providersList,
      icon: `${iconBaseUrl}/fish.svg`,
    },
  ];
}

📌 转载信息
原作者:
fyhyxp4
转载时间:
2026/1/15 10:18:13

标签: 代理配置, Clash Verge, JavaScript, 网络工具, 脚本编写

添加新评论