mirror of
https://github.com/lush2020/edgetunnel.git
synced 2026-03-20 16:33:06 +08:00
fix: 更新读取config_JSON函数,简化参数并添加完整节点路径生成逻辑
This commit is contained in:
@@ -119,12 +119,11 @@
|
||||
| **ADMIN** | ✅ | `123456` | 后台管理面板登录密码 |
|
||||
| **KEY** | ❌ | `CMLiussss` | 快速订阅路径密钥,访问 `/CMLiussss` 即可快速获取节点 |
|
||||
| **UUID** | ❌ | `90cd4a77-141a-43c9-991b-08263cfe9c10` | 强制固定UUID,只支持**UUIDv4**标准格式 |
|
||||
| **HOST** | ❌ | `edt.pages.dev` | 强制固定伪装域名 |
|
||||
| **PATH** | ❌ | `/` | 强制固定伪装路径 |
|
||||
| ~~HOST~~ | ❌ | `edt.pages.dev` | ~~强制固定伪装域名~~可通过面板直接设置 |
|
||||
| ~~PATH~~ | ❌ | `/` | ~~强制固定伪装路径~~可通过面板直接设置 |
|
||||
| **PROXYIP** | ❌ | `proxyip.cmliussss.net:443` | 全局自定义反代 IP |
|
||||
| **URL** | ❌ | `https://cloudflare-error-page-3th.pages.dev` | 默认主页伪装地址(可填写网页 URL 或 `1101`) |
|
||||
| **GO2SOCKS5** | ❌ | `blog.cmliussss.com`,`*.ip111.cn`,`*google.com` | 强制走 SOCKS5 的名单 (`*` 为全局,域名用逗号分隔) |
|
||||
| **DOH** | ❌ | `https://doh.cmliussss.com/CMLiussss` | 用于解析ECH的DoH服务器 |
|
||||
|
||||
---
|
||||
|
||||
|
||||
29
_worker.js
29
_worker.js
@@ -92,11 +92,11 @@ export default {
|
||||
return new Response(JSON.stringify(检测代理响应, null, 2), { status: 200, headers: { 'Content-Type': 'application/json;charset=utf-8' } });
|
||||
}
|
||||
|
||||
config_JSON = await 读取config_JSON(env, host, userID, env.PATH);
|
||||
config_JSON = await 读取config_JSON(env, host, userID);
|
||||
|
||||
if (访问路径 === 'admin/init') {// 重置配置为默认值
|
||||
try {
|
||||
config_JSON = await 读取config_JSON(env, host, userID, env.PATH, true);
|
||||
config_JSON = await 读取config_JSON(env, host, userID, true);
|
||||
ctx.waitUntil(请求日志记录(env, request, 访问IP, 'Init_Config', config_JSON));
|
||||
config_JSON.init = '配置已重置为默认值';
|
||||
return new Response(JSON.stringify(config_JSON, null, 2), { status: 200, headers: { 'Content-Type': 'application/json;charset=utf-8' } });
|
||||
@@ -191,7 +191,7 @@ export default {
|
||||
} else if (访问路径 === 'sub') {//处理订阅请求
|
||||
const 订阅TOKEN = await MD5MD5(host + userID);
|
||||
if (url.searchParams.get('token') === 订阅TOKEN) {
|
||||
config_JSON = await 读取config_JSON(env, host, userID, env.PATH);
|
||||
config_JSON = await 读取config_JSON(env, host, userID);
|
||||
ctx.waitUntil(请求日志记录(env, request, 访问IP, 'Get_SUB', config_JSON));
|
||||
const ua = UA.toLowerCase();
|
||||
const expire = 4102329600;//2099-12-31 到期时间
|
||||
@@ -233,7 +233,6 @@ export default {
|
||||
const 协议类型 = (url.searchParams.has('surge') || ua.includes('surge')) ? 'tro' + 'jan' : config_JSON.协议类型;
|
||||
let 订阅内容 = '';
|
||||
if (订阅类型 === 'mixed') {
|
||||
const 节点路径 = config_JSON.启用0RTT ? config_JSON.PATH + '?ed=2560' : config_JSON.PATH;
|
||||
const TLS分片参数 = config_JSON.TLS分片 == 'Shadowrocket' ? `&fragment=${encodeURIComponent('1,40-60,30-50,tlshello')}` : config_JSON.TLS分片 == 'Happ' ? `&fragment=${encodeURIComponent('3,1,tlshello')}` : '';
|
||||
let 完整优选IP = [], 其他节点LINK = '';
|
||||
|
||||
@@ -301,7 +300,7 @@ export default {
|
||||
return null;
|
||||
}
|
||||
|
||||
return `${协议类型}://00000000-0000-4000-8000-000000000000@${节点地址}:${节点端口}?security=tls&type=${config_JSON.传输协议 + ECHLINK参数}&host=example.com&fp=${config_JSON.Fingerprint}&sni=example.com&path=${encodeURIComponent(config_JSON.随机路径 ? 随机路径() + 节点路径 : 节点路径) + TLS分片参数}&encryption=none${config_JSON.跳过证书验证 ? '&insecure=1&allowInsecure=1' : ''}#${encodeURIComponent(节点备注)}`;
|
||||
return `${协议类型}://00000000-0000-4000-8000-000000000000@${节点地址}:${节点端口}?security=tls&type=${config_JSON.传输协议 + ECHLINK参数}&host=example.com&fp=${config_JSON.Fingerprint}&sni=example.com&path=${encodeURIComponent(config_JSON.随机路径 ? 随机路径() + config_JSON.完整节点路径 : config_JSON.完整节点路径) + TLS分片参数}&encryption=none${config_JSON.跳过证书验证 ? '&insecure=1&allowInsecure=1' : ''}#${encodeURIComponent(节点备注)}`;
|
||||
}).filter(item => item !== null).join('\n');
|
||||
} else { // 订阅转换
|
||||
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.跳过证书验证}`;
|
||||
@@ -1188,12 +1187,11 @@ function Surge订阅配置文件热补丁(content, url, config_JSON) {
|
||||
const 每行内容 = content.includes('\r\n') ? content.split('\r\n') : content.split('\n');
|
||||
|
||||
let 输出内容 = "";
|
||||
const realSurgePath = config_JSON.启用0RTT ? config_JSON.PATH + '?ed=2560' : config_JSON.PATH;
|
||||
for (let x of 每行内容) {
|
||||
if (x.includes('= tro' + 'jan,') && !x.includes('ws=true') && !x.includes('ws-path=')) {
|
||||
const host = x.split("sni=")[1].split(",")[0];
|
||||
const 备改内容 = `sni=${host}, skip-cert-verify=${config_JSON.跳过证书验证}`;
|
||||
const 正确内容 = `sni=${host}, skip-cert-verify=${config_JSON.跳过证书验证}, ws=true, ws-path=${realSurgePath}, ws-headers=Host:"${host}"`;
|
||||
const 正确内容 = `sni=${host}, skip-cert-verify=${config_JSON.跳过证书验证}, ws=true, ws-path=${config_JSON.随机路径 ? 随机路径() + config_JSON.完整节点路径 : config_JSON.完整节点路径}, ws-headers=Host:"${host}"`;
|
||||
输出内容 += x.replace(new RegExp(备改内容, 'g'), 正确内容).replace("[", "").replace("]", "") + '\n';
|
||||
} else {
|
||||
输出内容 += x + '\n';
|
||||
@@ -1351,7 +1349,7 @@ async function getECH(host) {
|
||||
}
|
||||
}
|
||||
|
||||
async function 读取config_JSON(env, hostname, userID, path, 重置配置 = false) {
|
||||
async function 读取config_JSON(env, hostname, userID, 重置配置 = false) {
|
||||
//const host = 随机替换通配符(hostname);
|
||||
const host = hostname, CM_DoH = "https://doh.cmliussss.net/CMLiussss";
|
||||
const 初始化开始时间 = performance.now();
|
||||
@@ -1360,6 +1358,7 @@ async function 读取config_JSON(env, hostname, userID, path, 重置配置 = fal
|
||||
HOST: host,
|
||||
HOSTS: [hostname],
|
||||
UUID: userID,
|
||||
PATH: "/",
|
||||
协议类型: "v" + "le" + "ss",
|
||||
传输协议: "ws",
|
||||
跳过证书验证: true,
|
||||
@@ -1438,14 +1437,24 @@ async function 读取config_JSON(env, hostname, userID, path, 重置配置 = fal
|
||||
config_JSON.UUID = userID;
|
||||
if (!config_JSON.随机路径) config_JSON.随机路径 = false;
|
||||
if (!config_JSON.启用0RTT) config_JSON.启用0RTT = false;
|
||||
config_JSON.PATH = path ? (path.startsWith('/') ? path : '/' + path) : (config_JSON.反代.SOCKS5.启用 ? ('/' + config_JSON.反代.SOCKS5.启用 + (config_JSON.反代.SOCKS5.全局 ? '://' : '=') + config_JSON.反代.SOCKS5.账号) : (config_JSON.反代.PROXYIP === 'auto' ? '/' : `/proxyip=${config_JSON.反代.PROXYIP}`));
|
||||
|
||||
if (env.PATH) config_JSON.PATH = env.PATH.startsWith('/') ? env.PATH : '/' + env.PATH;
|
||||
else if (!config_JSON.PATH) config_JSON.PATH = '/';
|
||||
|
||||
const PATH反代参数 = config_JSON.反代.SOCKS5.启用 ? ('/' + config_JSON.反代.SOCKS5.启用 + (config_JSON.反代.SOCKS5.全局 ? '://' : '=') + config_JSON.反代.SOCKS5.账号) : (config_JSON.反代.PROXYIP === 'auto' ? '/' : `/proxyip=${config_JSON.反代.PROXYIP}`);
|
||||
let PATH固定参数 = config_JSON.PATH;
|
||||
if (PATH固定参数 === '/') PATH固定参数 = '';
|
||||
else while (PATH固定参数.endsWith('/')) PATH固定参数 = PATH固定参数.slice(0, -1);
|
||||
|
||||
config_JSON.完整节点路径 = config_JSON.启用0RTT ? PATH固定参数 + PATH反代参数 + '?ed=2560' : PATH固定参数 + PATH反代参数;
|
||||
|
||||
if (!config_JSON.TLS分片 && config_JSON.TLS分片 !== null) config_JSON.TLS分片 = null;
|
||||
const TLS分片参数 = config_JSON.TLS分片 == 'Shadowrocket' ? `&fragment=${encodeURIComponent('1,40-60,30-50,tlshello')}` : config_JSON.TLS分片 == 'Happ' ? `&fragment=${encodeURIComponent('3,1,tlshello')}` : '';
|
||||
if (!config_JSON.Fingerprint) config_JSON.Fingerprint = "chrome";
|
||||
if (!config_JSON.ECH) config_JSON.ECH = false;
|
||||
if (!config_JSON.ECHConfig) config_JSON.ECHConfig = { DNS: CM_DoH, SNI: null };
|
||||
const ECHLINK参数 = config_JSON.ECH ? `&ech=${encodeURIComponent((config_JSON.ECHConfig.SNI ? config_JSON.ECHConfig.SNI + '+' : '') + config_JSON.ECHConfig.DNS)}` : '';
|
||||
config_JSON.LINK = `${config_JSON.协议类型}://${userID}@${host}:443?security=tls&type=${config_JSON.传输协议 + ECHLINK参数}&host=${host}&fp=${config_JSON.Fingerprint}&sni=${host}&path=${encodeURIComponent(config_JSON.启用0RTT ? config_JSON.PATH + '?ed=2560' : config_JSON.PATH) + TLS分片参数}&encryption=none${config_JSON.跳过证书验证 ? '&insecure=1&allowInsecure=1' : ''}#${encodeURIComponent(config_JSON.优选订阅生成.SUBNAME)}`;
|
||||
config_JSON.LINK = `${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)}`;
|
||||
config_JSON.优选订阅生成.TOKEN = await MD5MD5(hostname + userID);
|
||||
|
||||
const 初始化TG_JSON = { BotToken: null, ChatID: null };
|
||||
|
||||
Reference in New Issue
Block a user