|
1 | | -const Version = '2026-04-06 18:42:41'; |
| 1 | +const Version = '2026-04-10 06:03:17'; |
2 | 2 | /*In our project workflow, we first*/ import //the necessary modules, |
3 | 3 | /*then*/ { connect }//to the central server, |
4 | 4 | /*and all data flows*/ from//this single source. |
@@ -303,9 +303,7 @@ export default { |
303 | 303 | } |
304 | 304 | const ECHLINK参数 = config_JSON.ECH ? `&ech=${encodeURIComponent((config_JSON.ECHConfig.SNI ? config_JSON.ECHConfig.SNI + '+' : '') + config_JSON.ECHConfig.DNS)}` : ''; |
305 | 305 | const isLoonOrSurge = ua.includes('loon') || ua.includes('surge'); |
306 | | - const 传输协议 = config_JSON.传输协议 === 'xhttp' ? 'xhttp&mode=stream-one' : (config_JSON.传输协议 === 'grpc' ? (config_JSON.gRPC模式 === 'multi' ? 'grpc&mode=multi' : 'grpc&mode=gun') : 'ws'); |
307 | | - let 路径字段名 = 'path', 域名字段名 = 'host'; |
308 | | - if (config_JSON.传输协议 === 'grpc') 路径字段名 = 'serviceName', 域名字段名 = 'authority'; |
| 306 | + const { type: 传输协议, 路径字段名, 域名字段名 } = 获取传输协议配置(config_JSON); |
309 | 307 | 订阅内容 = 其他节点LINK + 完整优选IP.map(原始地址 => { |
310 | 308 | // 统一正则: 匹配 域名/IPv4/IPv6地址 + 可选端口 + 可选备注 |
311 | 309 | // 示例: |
@@ -334,12 +332,15 @@ export default { |
334 | 332 | } |
335 | 333 | if (isLoonOrSurge) 完整节点路径 = 完整节点路径.replace(/,/g, '%2C'); |
336 | 334 |
|
337 | | - if (协议类型 === 'ss' && !作为优选订阅生成器) { |
338 | | - 完整节点路径 = (完整节点路径.includes('?') ? 完整节点路径.replace('?', '?enc=' + config_JSON.SS.加密方式 + '&') : (完整节点路径 + '?enc=' + config_JSON.SS.加密方式)).replace(/([=,])/g, '\\$1'); |
339 | | - if (!isSubConverterRequest) 完整节点路径 = 完整节点路径 + ';mux=0'; |
340 | | - return `${协议类型}://${btoa(config_JSON.SS.加密方式 + ':00000000-0000-4000-8000-000000000000')}@${节点地址}:${节点端口}?plugin=v2${encodeURIComponent('ray-plugin;mode=websocket;host=example.com;path=' + (config_JSON.随机路径 ? 随机路径(完整节点路径) : 完整节点路径) + (config_JSON.SS.TLS ? ';tls' : '')) + ECHLINK参数 + TLS分片参数}#${encodeURIComponent(节点备注)}`; |
341 | | - } else return `${协议类型}://00000000-0000-4000-8000-000000000000@${节点地址}:${节点端口}?security=tls&type=${传输协议 + ECHLINK参数}&${域名字段名}=example.com&fp=${config_JSON.Fingerprint}&sni=example.com&${路径字段名}=${encodeURIComponent(作为优选订阅生成器 ? '/' : (config_JSON.随机路径 ? 随机路径(完整节点路径) : 完整节点路径)) + TLS分片参数}&encryption=none${config_JSON.跳过证书验证 ? '&insecure=1&allowInsecure=1' : ''}#${encodeURIComponent(节点备注)}`; |
342 | | - }).filter(item => item !== null).join('\n'); |
| 335 | + if (协议类型 === 'ss' && !作为优选订阅生成器) { |
| 336 | + 完整节点路径 = (完整节点路径.includes('?') ? 完整节点路径.replace('?', '?enc=' + config_JSON.SS.加密方式 + '&') : (完整节点路径 + '?enc=' + config_JSON.SS.加密方式)).replace(/([=,])/g, '\\$1'); |
| 337 | + if (!isSubConverterRequest) 完整节点路径 = 完整节点路径 + ';mux=0'; |
| 338 | + return `${协议类型}://${btoa(config_JSON.SS.加密方式 + ':00000000-0000-4000-8000-000000000000')}@${节点地址}:${节点端口}?plugin=v2${encodeURIComponent('ray-plugin;mode=websocket;host=example.com;path=' + (config_JSON.随机路径 ? 随机路径(完整节点路径) : 完整节点路径) + (config_JSON.SS.TLS ? ';tls' : '')) + ECHLINK参数 + TLS分片参数}#${encodeURIComponent(节点备注)}`; |
| 339 | + } else { |
| 340 | + const 传输路径参数值 = 获取传输路径参数值(config_JSON, 完整节点路径, 作为优选订阅生成器); |
| 341 | + return `${协议类型}://00000000-0000-4000-8000-000000000000@${节点地址}:${节点端口}?security=tls&type=${传输协议 + ECHLINK参数}&${域名字段名}=example.com&fp=${config_JSON.Fingerprint}&sni=example.com&${路径字段名}=${encodeURIComponent(传输路径参数值) + TLS分片参数}&encryption=none${config_JSON.跳过证书验证 ? '&insecure=1&allowInsecure=1' : ''}#${encodeURIComponent(节点备注)}`; |
| 342 | + } |
| 343 | + }).filter(item => item !== null).join('\n'); |
343 | 344 | } else { // 订阅转换 |
344 | 345 | const 订阅转换URL = `${config_JSON.订阅转换配置.SUBAPI}/sub?target=${订阅类型}&url=${encodeURIComponent(url.protocol + '//' + url.host + '/sub?target=mixed&token=' + 订阅TOKEN + (url.searchParams.has('sub') && url.searchParams.get('sub') != '' ? `&sub=${url.searchParams.get('sub')}` : ''))}&config=${encodeURIComponent(config_JSON.订阅转换配置.SUBCONFIG)}&emoji=${config_JSON.订阅转换配置.SUBEMOJI}&scv=${config_JSON.跳过证书验证}`; |
345 | 346 | try { |
@@ -1870,9 +1871,24 @@ async function httpConnect(targetHost, targetPort, initialData, HTTPS代理 = fa |
1870 | 1871 | } |
1871 | 1872 | } |
1872 | 1873 | //////////////////////////////////////////////////功能性函数/////////////////////////////////////////////// |
1873 | | -function log(...args) { |
1874 | | - if (调试日志打印) console.log(...args); |
1875 | | -} |
| 1874 | +function 获取传输协议配置(配置 = {}) { |
| 1875 | + const 是gRPC = 配置.传输协议 === 'grpc'; |
| 1876 | + return { |
| 1877 | + type: 是gRPC ? (配置.gRPC模式 === 'multi' ? 'grpc&mode=multi' : 'grpc&mode=gun') : (配置.传输协议 === 'xhttp' ? 'xhttp&mode=stream-one' : 'ws'), |
| 1878 | + 路径字段名: 是gRPC ? 'serviceName' : 'path', |
| 1879 | + 域名字段名: 是gRPC ? 'authority' : 'host' |
| 1880 | + }; |
| 1881 | +} |
| 1882 | + |
| 1883 | +function 获取传输路径参数值(配置 = {}, 节点路径 = '/', 作为优选订阅生成器 = false) { |
| 1884 | + const 路径值 = 作为优选订阅生成器 ? '/' : (配置.随机路径 ? 随机路径(节点路径) : 节点路径); |
| 1885 | + if (配置.传输协议 !== 'grpc') return 路径值; |
| 1886 | + return 路径值.split('?')[0] || '/'; |
| 1887 | +} |
| 1888 | + |
| 1889 | +function log(...args) { |
| 1890 | + if (调试日志打印) console.log(...args); |
| 1891 | +} |
1876 | 1892 |
|
1877 | 1893 | function Clash订阅配置文件热补丁(Clash_原始订阅内容, config_JSON = {}) { |
1878 | 1894 | const uuid = config_JSON?.UUID || null; |
@@ -2717,13 +2733,15 @@ async function 读取config_JSON(env, hostname, userID, UA = "Mozilla/5.0", 重 |
2717 | 2733 | if (!config_JSON.TLS分片 && config_JSON.TLS分片 !== null) config_JSON.TLS分片 = null; |
2718 | 2734 | const TLS分片参数 = config_JSON.TLS分片 == 'Shadowrocket' ? `&fragment=${encodeURIComponent('1,40-60,30-50,tlshello')}` : config_JSON.TLS分片 == 'Happ' ? `&fragment=${encodeURIComponent('3,1,tlshello')}` : ''; |
2719 | 2735 | if (!config_JSON.Fingerprint) config_JSON.Fingerprint = "chrome"; |
2720 | | - if (!config_JSON.ECH) config_JSON.ECH = false; |
2721 | | - if (!config_JSON.ECHConfig) config_JSON.ECHConfig = { DNS: Ali_DoH, SNI: ECH_SNI }; |
2722 | | - const ECHLINK参数 = config_JSON.ECH ? `&ech=${encodeURIComponent((config_JSON.ECHConfig.SNI ? config_JSON.ECHConfig.SNI + '+' : '') + config_JSON.ECHConfig.DNS)}` : ''; |
2723 | | - config_JSON.LINK = config_JSON.协议类型 === 'ss' |
2724 | | - ? `${config_JSON.协议类型}://${btoa(config_JSON.SS.加密方式 + ':' + userID)}@${host}:${config_JSON.SS.TLS ? '443' : '80'}?plugin=v2${encodeURIComponent(`ray-plugin;mode=websocket;host=${host};path=${((config_JSON.完整节点路径.includes('?') ? config_JSON.完整节点路径.replace('?', '?enc=' + config_JSON.SS.加密方式 + '&') : (config_JSON.完整节点路径 + '?enc=' + config_JSON.SS.加密方式)) + (config_JSON.SS.TLS ? ';tls' : ''))};mux=0`) + ECHLINK参数}#${encodeURIComponent(config_JSON.优选订阅生成.SUBNAME)}` |
2725 | | - : `${config_JSON.协议类型}://${userID}@${host}:443?security=tls&type=${config_JSON.传输协议 + ECHLINK参数}&host=${host}&fp=${config_JSON.Fingerprint}&sni=${host}&path=${encodeURIComponent(config_JSON.随机路径 ? 随机路径(config_JSON.完整节点路径) : config_JSON.完整节点路径) + TLS分片参数}&encryption=none${config_JSON.跳过证书验证 ? '&insecure=1&allowInsecure=1' : ''}#${encodeURIComponent(config_JSON.优选订阅生成.SUBNAME)}`; |
2726 | | - config_JSON.优选订阅生成.TOKEN = await MD5MD5(hostname + userID); |
| 2736 | + if (!config_JSON.ECH) config_JSON.ECH = false; |
| 2737 | + if (!config_JSON.ECHConfig) config_JSON.ECHConfig = { DNS: Ali_DoH, SNI: ECH_SNI }; |
| 2738 | + const ECHLINK参数 = config_JSON.ECH ? `&ech=${encodeURIComponent((config_JSON.ECHConfig.SNI ? config_JSON.ECHConfig.SNI + '+' : '') + config_JSON.ECHConfig.DNS)}` : ''; |
| 2739 | + const { type: 传输协议, 路径字段名, 域名字段名 } = 获取传输协议配置(config_JSON); |
| 2740 | + const 传输路径参数值 = 获取传输路径参数值(config_JSON, config_JSON.完整节点路径); |
| 2741 | + config_JSON.LINK = config_JSON.协议类型 === 'ss' |
| 2742 | + ? `${config_JSON.协议类型}://${btoa(config_JSON.SS.加密方式 + ':' + userID)}@${host}:${config_JSON.SS.TLS ? '443' : '80'}?plugin=v2${encodeURIComponent(`ray-plugin;mode=websocket;host=${host};path=${((config_JSON.完整节点路径.includes('?') ? config_JSON.完整节点路径.replace('?', '?enc=' + config_JSON.SS.加密方式 + '&') : (config_JSON.完整节点路径 + '?enc=' + config_JSON.SS.加密方式)) + (config_JSON.SS.TLS ? ';tls' : ''))};mux=0`) + ECHLINK参数}#${encodeURIComponent(config_JSON.优选订阅生成.SUBNAME)}` |
| 2743 | + : `${config_JSON.协议类型}://${userID}@${host}:443?security=tls&type=${传输协议 + ECHLINK参数}&${域名字段名}=${host}&fp=${config_JSON.Fingerprint}&sni=${host}&${路径字段名}=${encodeURIComponent(传输路径参数值) + TLS分片参数}&encryption=none${config_JSON.跳过证书验证 ? '&insecure=1&allowInsecure=1' : ''}#${encodeURIComponent(config_JSON.优选订阅生成.SUBNAME)}`; |
| 2744 | + config_JSON.优选订阅生成.TOKEN = await MD5MD5(hostname + userID); |
2727 | 2745 |
|
2728 | 2746 | const 初始化TG_JSON = { BotToken: null, ChatID: null }; |
2729 | 2747 | config_JSON.TG = { 启用: config_JSON.TG.启用 ? config_JSON.TG.启用 : false, ...初始化TG_JSON }; |
|
0 commit comments