Last active
April 14, 2025 04:32
-
-
Save 2045gemini/4aea375b94c60a883f8e6c16ca3875b8 to your computer and use it in GitHub Desktop.
懒人配置js覆写模板mihomo (Clash Meta)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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