Skip to content

Instantly share code, notes, and snippets.

@2045gemini
Last active April 14, 2025 04:32
Show Gist options
  • Save 2045gemini/4aea375b94c60a883f8e6c16ca3875b8 to your computer and use it in GitHub Desktop.
Save 2045gemini/4aea375b94c60a883f8e6c16ca3875b8 to your computer and use it in GitHub Desktop.
懒人配置js覆写模板mihomo (Clash Meta)
// Mihomo (Clash Meta) 通用 JavaScript 覆写脚本模板 v1.1
// By: 2045gemini
//
// 导入链接:https://gist.githubusercontent.com/2045gemini/4aea375b94c60a883f8e6c16ca3875b8/raw/d6779c142d9a298436f99a7bfc277610c52f49a1/%25E6%2587%2592%25E4%25BA%25BA%25E8%25A6%2586%25E5%2586%2599%25E6%25A8%25A1%25E6%259D%25BF.js
// ghfast.top加速导入链接(适用于无proxy):https://ghfast.top/https://gist.githubusercontent.com/2045gemini/4aea375b94c60a883f8e6c16ca3875b8/raw/d6779c142d9a298436f99a7bfc277610c52f49a1/%25E6%2587%2592%25E4%25BA%25BA%25E8%25A6%2586%25E5%2586%2599%25E6%25A8%25A1%25E6%259D%25BF.js
//
// 这是一个 Mihomo (Clash Meta) "懒人配置" 的补充覆写脚本模板。
// 感谢原作者 笨蛋ovo (bdovo.cc) 的懒人配置!
// 懒人配置 Gist 地址: https://gist.github.com/liuran001/5ca84f7def53c70b554d3f765ff86a33
// Clash Meta 文档 (官方 Wiki): https://wiki.metacubex.one
//
// ## 关于此脚本
//
// **重要提示**: JavaScript 覆写功能并非 Mihomo (Clash Meta) 内核原生支持,
// 而是由使用 Mihomo 内核的 **客户端/前端** 提供。
// 此脚本已在 Mihomo Party 上测试通过,其他客户端 (如 Clash Verge) 可能也支持。
//
// 这个脚本能帮你做什么?
// 1. 添加你自己的代理节点 (如 VLESS, Trojan 等)。
// 2. 覆盖 "懒人配置" 中的默认订阅链接,换成你自己的机场链接。
// 3. 修改现有代理组的参数 (例如调整 `tolerance` 或 `interval`)。
// 4. 添加全新的自定义代理组和对应的分流规则。
//
// 使用 JS 覆写的好处在于,当基础的 "懒人配置" 更新时,
// 你可以直接更新 YAML 文件,而无需担心丢失自己的个性化配置,
// 只需要保持此 JS 覆写脚本启用即可。
//
// ## 使用说明
// 1. 将本脚本内容完整复制到你正在使用的 **支持 JS 覆写的客户端**
// (例如 Mihomo Party) 的「配置覆写」->「JavaScript」设置区域。
// 2. 仔细阅读并修改下方标记为 "↓↓↓ 用户配置区域 ↓↓↓" 的部分,填入你自己的信息。
// 3. 保存设置。客户端会在加载基础配置后执行此脚本。
//
// ## 注意
// 修改前请理解相关配置项的含义,不确定时建议查阅 Clash Meta 文档。
// 脚本中的示例值仅供参考,必须替换为你的实际信息才能正常工作。
//
// ## 反馈
// 如果对脚本有任何功能建议或疑问,欢迎提出。
function main(config) {
console.log("JS 覆写脚本:开始执行...");
// --- 示例 1: 添加自定义代理节点 (例如 VLESS) 并加入 '节点选择' 组 ---
// 如果不需要添加自定义节点,可以注释或删除此代码块。
console.log("JS 覆写:处理自定义节点...");
// 检查 config.proxies 是否为数组,如果不是则初始化
if (!Array.isArray(config.proxies)) {
config.proxies = [];
}
// ↓↓↓ 用户配置区域 ↓↓↓
const myCustomNode = {
// --- 节点基本信息 ---
name: "我的自定义节点", // (必需) 节点名称,用于后续引用
type: "vless", // (必需) 节点协议类型 (vless, trojan, ss...)
server: "YOUR_SERVER_ADDRESS", // <--- (必需) 服务器地址或域名
port: 443, // <--- (必需) 端口
uuid: "YOUR_UUID", // <--- (必需, vless/vmess/trojan等) UUID 或密码
// --- 传输和加密配置 (根据实际情况填写) ---
network: "tcp", // (可选, 默认 tcp) 传输协议 (tcp, ws, grpc...)
tls: true, // (可选, 默认 false) 是否启用 TLS
servername: "YOUR_SNI", // (可选, TLS 启用时建议配置) SNI,通常是域名
flow: "xtls-rprx-vision", // (可选, VLESS XTLS) 流控设置
// --- WebSocket (ws) 选项 (如果 network 是 'ws') ---
// "ws-opts": {
// path: "/your-ws-path", // WebSocket 路径
// headers: { Host: "your-ws-host.com" } // WebSocket Host
// },
// --- gRPC 选项 (如果 network 是 'grpc') ---
// "grpc-opts": {
// "grpc-service-name": "your-grpc-service-name" // gRPC 服务名
// },
// --- 其他常用选项 ---
udp: true, // (可选, 默认 false) 是否启用 UDP 转发
"skip-cert-verify": false, // (可选, 默认 false) 跳过证书验证 (自签名证书等情况设为 true)
"client-fingerprint": "chrome", // (可选) TLS 指纹伪装
"ip-version": "ipv6-prefer" // (可选) IP 版本偏好 (ipv4-prefer / ipv6-prefer)
};
// ↑↑↑ 用户配置区域 ↑↑↑
// 将节点添加到全局 proxies 列表
config.proxies.push(myCustomNode);
console.log(`JS 覆写:已添加自定义节点 '${myCustomNode.name}'。`);
// 将节点名添加到 '节点选择' 代理组的列表开头
const mainSelectGroupName = '节点选择'; // '懒人配置' 中的主选择组名
const mainSelectGroupIndex = config['proxy-groups'].findIndex(group => group.name === mainSelectGroupName);
if (mainSelectGroupIndex !== -1) {
if (!Array.isArray(config['proxy-groups'][mainSelectGroupIndex].proxies)) {
config['proxy-groups'][mainSelectGroupIndex].proxies = [];
}
config['proxy-groups'][mainSelectGroupIndex].proxies.unshift(myCustomNode.name); // 添加节点名称
console.log(`JS 覆写:已将 '${myCustomNode.name}' 添加至 '${mainSelectGroupName}' 组。`);
} else {
console.warn(`JS 覆写警告:未找到名为 '${mainSelectGroupName}' 的代理组,无法添加自定义节点至该组。`);
}
// --- 示例 1 结束 ---
// --- 示例 2: 覆盖 '懒人配置' 中的机场订阅链接 ---
// 如果不需要修改订阅链接,可以注释或删除此代码块。
console.log("JS 覆写:处理代理提供者 (订阅)...");
// 检查 config['proxy-providers'] 是否为对象,如果不是则初始化
if (typeof config['proxy-providers'] !== 'object' || config['proxy-providers'] === null) {
config['proxy-providers'] = {};
}
// --- 覆盖 '订阅一' ---
// ↓↓↓ 用户配置区域 (订阅一) ↓↓↓
const providerOneConfig = {
type: 'http', // 通常为 http
interval: 3600, // (可选) 订阅自动更新间隔 (秒)
// 健康检查配置 (建议保持与基础配置一致)
'health-check': {
enable: true,
url: 'https://cp.cloudflare.com', // 健康检查 URL
interval: 300, // 检查间隔 (秒)
timeout: 1000, // 超时时间 (毫秒)
tolerance: 100 // 切换容差 (毫秒)
},
// --- 你的订阅信息 (订阅一) ---
url: "YOUR_SUBSCRIBE_URL_1", // <--- (必需) 第一个机场订阅链接
path: "./proxy_provider/provider_1.yaml", // (必需) 订阅缓存文件路径,建议每个订阅独立
override: {
'additional-prefix': "[机场一]" // (可选) 为此订阅下所有节点名称添加前缀
}
};
// ↑↑↑ 用户配置区域 (订阅一) ↑↑↑
config['proxy-providers']['订阅一'] = providerOneConfig; // 覆盖 '订阅一'
console.log("JS 覆写:已覆盖 '订阅一'。");
// --- 覆盖 '订阅二' ---
// 如果你只使用一个订阅,可以注释或删除以下 '订阅二' 部分。
// ↓↓↓ 用户配置区域 (订阅二) ↓↓↓
const providerTwoConfig = {
type: 'http',
interval: 3600,
'health-check': {
enable: true,
url: 'https://cp.cloudflare.com',
interval: 300,
timeout: 1000,
tolerance: 100
},
// --- 你的订阅信息 (订阅二) ---
url: "YOUR_SUBSCRIBE_URL_2", // <--- (必需) 第二个机场订阅链接
path: "./proxy_provider/provider_2.yaml", // <--- (必需) 缓存文件路径,与第一个不同
override: {
'additional-prefix': "[机场二]" // (可选) 添加节点名称前缀
}
};
// ↑↑↑ 用户配置区域 (订阅二) ↑↑↑
config['proxy-providers']['订阅二'] = providerTwoConfig; // 覆盖 '订阅二'
console.log("JS 覆写:已覆盖 '订阅二'。");
// --- 示例 2 结束 ---
// --- 示例 3: 修改现有代理组的特定参数 ---
// 例如,修改 '美国' 组的延迟容差 (tolerance)。
console.log("JS 覆写:处理现有代理组修改...");
// ↓↓↓ 用户配置区域 ↓↓↓
const targetGroupName = '美国'; // <--- (必需) 要修改的代理组的确切名称 (如 '香港', '台湾', '美国', '自动选择')
const keyToModify = 'tolerance'; // <--- (必需) 要修改的参数名 (如 'tolerance', 'interval')
const valueToSet = 200; // <--- (必需) 要设置的新值
// ↑↑↑ 用户配置区域 ↑↑↑
const targetGroupIndex = config['proxy-groups'].findIndex(group => group.name === targetGroupName);
if (targetGroupIndex !== -1) {
config['proxy-groups'][targetGroupIndex][keyToModify] = valueToSet;
console.log(`JS 覆写:已将 '${targetGroupName}' 组的 '${keyToModify}' 修改为 ${valueToSet}。`);
} else {
console.warn(`JS 覆写警告:未找到名为 '${targetGroupName}' 的代理组。`);
}
// --- 示例 3 结束 ---
// --- 示例 4: 添加全新的自定义代理组和规则 ---
// 例如,为特定服务创建独立的代理组和分流规则。
console.log("JS 覆写:处理自定义代理组和规则...");
// 检查 proxy-groups 和 rules 是否为数组
if (!Array.isArray(config['proxy-groups'])) {
config['proxy-groups'] = [];
}
if (!Array.isArray(config.rules)) {
config.rules = [];
}
// ↓↓↓ 用户配置区域 ↓↓↓
// 1. 定义自定义代理组
const myCustomGroup = {
name: '我的自定义组', // <--- (必需) 新代理组的名称
type: 'select', // <--- (必需) 代理组类型 (select, url-test, fallback, load-balance)
proxies: [ // <--- (必需) 该组包含的代理或策略组
'DIRECT', // 例如: 直连
'节点选择', // 例如: 引用 '懒人配置' 的主选择组
// '我的自定义节点' // 也可以引用本脚本添加的自定义节点
// '香港' // 也可以引用其他现有代理组
]
// 如果 type 不是 'select', 可能需要额外参数 (参考 Clash Meta 文档)
// 例如 url-test:
// url: 'http://www.gstatic.com/generate_204', // 测试 URL
// interval: 300, // 测试间隔 (秒)
// tolerance: 50, // 延迟容差 (毫秒, 仅 url-test)
};
// 2. 定义自定义规则 (将流量引导至新代理组)
const myCustomRules = [
// 规则格式: 类型, 值, 目标策略组/策略 [,no-resolve]
// 常用类型: DOMAIN-SUFFIX, DOMAIN, DOMAIN-KEYWORD, IP-CIDR, GEOIP, GEOSITE, RULE-SET, MATCH 等
'DOMAIN-SUFFIX,example-service.com,' + myCustomGroup.name, // 示例:example-service.com 走 '我的自定义组'
'DOMAIN-KEYWORD,special-app,' + myCustomGroup.name, // 示例:含 special-app 关键词的域名走 '我的自定义组'
// 'IP-CIDR,192.168.100.0/24,' + myCustomGroup.name, // 示例:特定内网 IP 段走 '我的自定义组'
// 'GEOSITE,category-games,' + myCustomGroup.name, // 示例:GEOSITE 游戏分类走 '我的自定义组'
];
// ↑↑↑ 用户配置区域 ↑↑↑
// 将自定义代理组添加到列表开头
config['proxy-groups'].unshift(myCustomGroup);
console.log(`JS 覆写:已添加自定义代理组 '${myCustomGroup.name}'。`);
// 将自定义规则添加到列表开头 (确保优先匹配)
config.rules.unshift(...myCustomRules.reverse()); // 使用 reverse() 保证规则按预期顺序插入
console.log("JS 覆写:已添加自定义规则。");
// --- 示例 4 结束 ---
// --- 返回修改后的配置 ---
console.log("JS 覆写脚本:执行完毕。");
return config;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment