Skip to content

Commit aa147ba

Browse files
authored
Merge pull request cmliu#1091 from cmliu/beta2.1-BYOB
Beta2.1 byob
2 parents 7238831 + c42ab05 commit aa147ba

1 file changed

Lines changed: 38 additions & 20 deletions

File tree

_worker.js

Lines changed: 38 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
const Version = '2026-04-06 18:42:41';
1+
const Version = '2026-04-10 06:03:17';
22
/*In our project workflow, we first*/ import //the necessary modules,
33
/*then*/ { connect }//to the central server,
44
/*and all data flows*/ from//this single source.
@@ -303,9 +303,7 @@ export default {
303303
}
304304
const ECHLINK参数 = config_JSON.ECH ? `&ech=${encodeURIComponent((config_JSON.ECHConfig.SNI ? config_JSON.ECHConfig.SNI + '+' : '') + config_JSON.ECHConfig.DNS)}` : '';
305305
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);
309307
订阅内容 = 其他节点LINK + 完整优选IP.map(原始地址 => {
310308
// 统一正则: 匹配 域名/IPv4/IPv6地址 + 可选端口 + 可选备注
311309
// 示例:
@@ -334,12 +332,15 @@ export default {
334332
}
335333
if (isLoonOrSurge) 完整节点路径 = 完整节点路径.replace(/,/g, '%2C');
336334

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');
343344
} else { // 订阅转换
344345
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.跳过证书验证}`;
345346
try {
@@ -1870,9 +1871,24 @@ async function httpConnect(targetHost, targetPort, initialData, HTTPS代理 = fa
18701871
}
18711872
}
18721873
//////////////////////////////////////////////////功能性函数///////////////////////////////////////////////
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+
}
18761892

18771893
function Clash订阅配置文件热补丁(Clash_原始订阅内容, config_JSON = {}) {
18781894
const uuid = config_JSON?.UUID || null;
@@ -2717,13 +2733,15 @@ async function 读取config_JSON(env, hostname, userID, UA = "Mozilla/5.0", 重
27172733
if (!config_JSON.TLS分片 && config_JSON.TLS分片 !== null) config_JSON.TLS分片 = null;
27182734
const TLS分片参数 = config_JSON.TLS分片 == 'Shadowrocket' ? `&fragment=${encodeURIComponent('1,40-60,30-50,tlshello')}` : config_JSON.TLS分片 == 'Happ' ? `&fragment=${encodeURIComponent('3,1,tlshello')}` : '';
27192735
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);
27272745

27282746
const 初始化TG_JSON = { BotToken: null, ChatID: null };
27292747
config_JSON.TG = { 启用: config_JSON.TG.启用 ? config_JSON.TG.启用 : false, ...初始化TG_JSON };

0 commit comments

Comments
 (0)