// CFnew - 终端 v2.9.8c
// 版本: v2.9.8c
import { connect as 连接 } from 'cloudflare:sockets';
const 基础64文本解码器 = new TextDecoder();
function 解码64(文本) {
const 二进制 = atob(文本);
const 字节 = new Uint8Array(二进制.length);
for (let 索引 = 0; 索引 < 二进制.length; 索引++) 字节[索引] = 二进制.charCodeAt(索引);
return 基础64文本解码器.decode(字节);
}
let 认证令牌 = '351c9981-04b6-4103-aa4b-864aa9c91469';
let 回退地址 = '';
let 代理5配置 = '';
let 自定义优选地址列表 = [];
let 自定义优选域名列表 = [];
let 启用代理降级 = false;
let 禁用非传输层安全 = false;
let 禁用优选 = false;
let 启用地区匹配 = true;
let 当前工作器地区 = '';
let 手动工作器地区 = '';
let 优选地址源 = '';
let 自定义路径 = '';
let 启用明文 = true;
let 启用木马 = false;
let 启用扩展传输 = false;
let 传输路径 = '';
// 启用ECH功能(true启用,false禁用)
let 启用加密客户端问候 = false;
// 自定义DNS服务器(默认:https://223.5.5.5/dns-query)
let 自定义域名系统 = 'https://223.5.5.5/dns-query';
// 自定义ECH域名(默认:cloudflare-ech.com)
let 自定义加密客户端问候域名 = 'cloudflare-ech.com';
let 自定义应用层协议协商 = '';
let 订阅转换接口 = 解码64('aHR0cHM6Ly91cmwudjEubWsvc3Vi');
// 远程配置URL(硬编码)
const 远程配置网址 = 'https://raw.githubusercontent.com/byJoey/test/refs/heads/main/tist.ini';
let 启用优选域名 = true; // 优选域名默认关闭
let 启用优选地址 = true;
let 启用仓库优选 = true;
let 启用原生地址 = false; // 原生地址默认关闭
let 键值存储 = null;
let 键值配置 = {};
let 键值配置上次加载 = 0;
const 键值缓存期限 = 30 * 1000; // 30秒缓存(短窗口内跳过版本检查)
let 键值配置版本 = '';
const 配置默认值 = {
wk: '',
ev: 'yes',
et: 'no',
ex: 'no',
ech: 'no',
tp: '',
customDNS: 'https://223.5.5.5/dns-query',
customECHDomain: 'cloudflare-ech.com',
alpn: '',
d: '',
p: '',
yx: '',
yxURL: '',
s: '',
homepage: '',
scu: 解码64('aHR0cHM6Ly91cmwudjEubWsvc3Vi'),
ena: 'no',
epd: 'yes',
epi: 'yes',
egi: 'yes',
ae: '',
rm: '',
qj: '',
dkby: 'no',
yxby: '',
ipv4: 'yes',
ipv6: 'yes',
ispMobile: 'yes',
ispUnicom: 'yes',
ispTelecom: 'yes'
};
function 是否开启值(值, 默认启用 = false) {
if (值 === undefined || 值 === null || 值 === '') return 默认启用;
if (值 === true || 值 === false) return 值;
const 文本 = String(值).trim().toLowerCase();
if (文本 === 'yes' || 文本 === 'true' || 文本 === '1' || 文本 === 'on') return true;
if (文本 === 'no' || 文本 === 'false' || 文本 === '0' || 文本 === 'off') return false;
return 默认启用;
}
function 归一配置开关(值, 默认启用 = false) {
return 是否开启值(值, 默认启用) ? 'yes' : 'no';
}
function 获取配置开关值(键, 默认启用 = false, 备用值 = undefined) {
const 默认值 = 备用值 !== undefined ? 备用值 : (默认启用 ? 'yes' : 'no');
return 是否开启值(获取配置值(键, 默认值), 默认启用);
}
function 获取配置文本值(键, 默认值 = '', 备用值 = undefined) {
const 值 = 获取配置值(键, 备用值 !== undefined ? 备用值 : 默认值);
return 值 === undefined || 值 === null ? 默认值 : String(值);
}
function 整理有效配置(配置) {
const 快照 = {
...配置默认值,
...配置
};
['ev', 'et', 'ex', 'ech', 'ena', 'epd', 'epi', 'egi', 'ipv4', 'ipv6', 'ispMobile', 'ispUnicom', 'ispTelecom'].forEach(键 => {
快照[键] = 归一配置开关(快照[键], 是否开启值(配置默认值[键]));
});
if (快照.ev === 'no' && 快照.et === 'no' && 快照.ex === 'no') {
快照.ev = 'yes';
}
if (快照.ech === 'yes') {
快照.dkby = 'yes';
}
return 快照;
}
function 读取环境配置值(环境值, ...名称列表) {
if (!环境值) return undefined;
for (const 名称 of 名称列表) {
if (环境值[名称] !== undefined && 环境值[名称] !== null && 环境值[名称] !== '') {
return 环境值[名称];
}
}
return undefined;
}
function 获取环境配置快照(环境值 = {}) {
const 映射 = {
wk: ['wk', 'WK'],
ev: ['ev', 'EV'],
et: ['et', 'ET'],
ex: ['ex', 'EX'],
ech: ['ech', 'ECH'],
tp: ['tp', 'TP'],
customDNS: ['customDNS', 'CUSTOMDNS', 'CUSTOM_DNS'],
customECHDomain: ['customECHDomain', 'CUSTOMECHDOMAIN', 'CUSTOM_ECH_DOMAIN'],
alpn: ['alpn', 'ALPN'],
d: ['d', 'D'],
p: ['p', 'P'],
yx: ['yx', 'YX'],
yxURL: ['yxURL', 'YXURL', 'YX_URL'],
s: ['s', 'S'],
homepage: ['homepage', 'HOMEPAGE'],
scu: ['scu', 'SCU'],
ena: ['ena', 'ENA'],
epd: ['epd', 'EPD'],
epi: ['epi', 'EPI'],
egi: ['egi', 'EGI'],
ae: ['ae', 'AE'],
rm: ['rm', 'RM'],
qj: ['qj', 'QJ'],
dkby: ['dkby', 'DKBY'],
yxby: ['yxby', 'YXBY'],
ipv4: ['ipv4', 'IPV4'],
ipv6: ['ipv6', 'IPV6'],
ispMobile: ['ispMobile', 'ISPMOBILE', 'ISP_MOBILE'],
ispUnicom: ['ispUnicom', 'ISPUNICOM', 'ISP_UNICOM'],
ispTelecom: ['ispTelecom', 'ISPTELECOM', 'ISP_TELECOM']
};
const 快照 = {};
for (const [键, 名称列表] of Object.entries(映射)) {
const 值 = 读取环境配置值(环境值, ...名称列表);
if (值 !== undefined) 快照[键] = 值;
}
return 快照;
}
function 获取有效配置快照(环境值 = {}) {
return 整理有效配置({
...获取环境配置快照(环境值),
...键值配置
});
}
const 地区映射 = {
'HK': ['🇭🇰 香港', 'HK', 'Hong Kong'],
'US': ['🇺🇸 美国', 'US', 'United States'],
'SG': ['🇸🇬 新加坡', 'SG', 'Singapore'],
'JP': ['🇯🇵 日本', 'JP', 'Japan'],
'KR': ['🇰🇷 韩国', 'KR', 'South Korea'],
'DE': ['🇩🇪 德国', 'DE', 'Germany'],
'SE': ['🇸🇪 瑞典', 'SE', 'Sweden'],
'NL': ['🇳🇱 荷兰', 'NL', 'Netherlands'],
'FI': ['🇫🇮 芬兰', 'FI', 'Finland'],
'GB': ['🇬🇧 英国', 'GB', 'United Kingdom'],
'Oracle': ['甲骨文', 'Oracle'],
'DigitalOcean': ['数码海', 'DigitalOcean'],
'Vultr': ['Vultr', 'Vultr'],
'Multacom': ['Multacom', 'Multacom']
};
let 备用地址列表 = [{
domain: 解码64('UHJveHlJUC5ISy5DTUxpdXNzc3MubmV0'),
region: 'HK',
regionCode: 'HK',
port: 443
}, {
domain: 解码64('UHJveHlJUC5VUy5DTUxpdXNzc3MubmV0'),
region: 'US',
regionCode: 'US',
port: 443
}, {
domain: 解码64('UHJveHlJUC5TRy5DTUxpdXNzc3MubmV0'),
region: 'SG',
regionCode: 'SG',
port: 443
}, {
domain: 解码64('UHJveHlJUC5KUC5DTUxpdXNzc3MubmV0'),
region: 'JP',
regionCode: 'JP',
port: 443
}, {
domain: 解码64('UHJveHlJUC5LUi5DTUxpdXNzc3MubmV0'),
region: 'KR',
regionCode: 'KR',
port: 443
}, {
domain: 解码64('UHJveHlJUC5ERS5DTUxpdXNzc3MubmV0'),
region: 'DE',
regionCode: 'DE',
port: 443
}, {
domain: 解码64('UHJveHlJUC5TRS5DTUxpdXNzc3MubmV0'),
region: 'SE',
regionCode: 'SE',
port: 443
}, {
domain: 解码64('UHJveHlJUC5OTC5DTUxpdXNzc3MubmV0'),
region: 'NL',
regionCode: 'NL',
port: 443
}, {
domain: 解码64('UHJveHlJUC5GSS5DTUxpdXNzc3MubmV0'),
region: 'FI',
regionCode: 'FI',
port: 443
}, {
domain: 解码64('UHJveHlJUC5HQi5DTUxpdXNzc3MubmV0'),
region: 'GB',
regionCode: 'GB',
port: 443
}, {
domain: 解码64('UHJveHlJUC5PcmFjbGUuY21saXVzc3NzLm5ldA=='),
region: 'Oracle',
regionCode: 'Oracle',
port: 443
}, {
domain: 解码64('UHJveHlJUC5EaWdpdGFsT2NlYW4uQ01MaXVzc3NzLm5ldA=='),
region: 'DigitalOcean',
regionCode: 'DigitalOcean',
port: 443
}, {
domain: 解码64('UHJveHlJUC5WdWx0ci5DTUxpdXNzc3MubmV0'),
region: 'Vultr',
regionCode: 'Vultr',
port: 443
}, {
domain: 解码64('UHJveHlJUC5NdWx0YWNvbS5DTUxpdXNzc3MubmV0'),
region: 'Multacom',
regionCode: 'Multacom',
port: 443
}];
const 直连域名列表 = [{
name: "cloudflare.182682.xyz",
domain: "cloudflare.182682.xyz"
}, {
name: "speed.marisalnc.com",
domain: "speed.marisalnc.com"
}, {
domain: "freeyx.cloudflare88.eu.org"
}, {
domain: "bestcf.top"
}, {
domain: "cdn.2020111.xyz"
}, {
domain: "cfip.cfcdn.vip"
}, {
domain: "cf.0sm.com"
}, {
domain: "cf.090227.xyz"
}, {
domain: "cf.zhetengsha.eu.org"
}, {
domain: "cloudflare.9jy.cc"
}, {
domain: "cf.zerone-cdn.pp.ua"
}, {
domain: "cfip.1323123.xyz"
}, {
domain: "cnamefuckxxs.yuchen.icu"
}, {
domain: "cloudflare-ip.mofashi.ltd"
}, {
domain: "115155.xyz"
}, {
domain: "cname.xirancdn.us"
}, {
domain: "f3058171cad.002404.xyz"
}, {
domain: "8.889288.xyz"
}, {
domain: "cdn.tzpro.xyz"
}, {
domain: "cf.877771.xyz"
}, {
domain: "xn--b6gac.eu.org"
}];
const 错误_无效数据 = atob('aW52YWxpZCBkYXRh');
const 错误_无效用户 = atob('aW52YWxpZCB1c2Vy');
const 错误_不支持命令 = atob('Y29tbWFuZCBpcyBub3Qgc3VwcG9ydGVk');
const 错误_仅支持域名系统用户数据报 = atob('VURQIHByb3h5IG9ubHkgZW5hYmxlIGZvciBETlMgd2hpY2ggaXMgcG9ydCA1Mw==');
const 错误_无效地址类型 = atob('aW52YWxpZCBhZGRyZXNzVHlwZQ==');
const 错误_空地址 = atob('YWRkcmVzc1ZhbHVlIGlzIGVtcHR5');
const 错误_网页套接字未打开 = atob('d2ViU29ja2V0LmVhZHlTdGF0ZSBpcyBub3Qgb3Blbg==');
const 错误_无效标识字符串 = atob('U3RyaW5naWZpZWQgaWRlbnRpZmllciBpcyBpbnZhbGlk');
const 错误_无效代理地址 = atob('SW52YWxpZCBTT0NLUyBhZGRyZXNzIGZvcm1hdA==');
const 错误_代理无可用方法 = atob('bm8gYWNjZXB0YWJsZSBtZXRob2Rz');
const 错误_代理需要认证 = atob('c29ja3Mgc2VydmVyIG5lZWRzIGF1dGg=');
const 错误_代理认证失败 = atob('ZmFpbCB0byBhdXRoIHNvY2tzIHNlcnZlcg==');
const 错误_代理连接失败 = atob('ZmFpbCB0byBvcGVuIHNvY2tzIGNvbm5lY3Rpb24=');
let 已解析代理5配置 = {};
let 是否代理已启用 = false;
const 地址类型_四版 = 1;
const 地址类型_网址 = 2;
const 地址类型_六版 = 3;
const 传输块大小 = 64 * 1024;
const 传输下载包大小 = 32 * 1024;
const 传输下载尾部 = 512;
const 传输下载延迟 = 0;
const 传输上传包大小 = 16 * 1024;
const 传输上传队列上限 = 256 * 1024;
const 传输连接竞速数 = 2;
const 首字节超时 = 3500;
const 共享解码器 = new TextDecoder();
const 唯一标识字节缓存 = new Map();
function 是否有效格式(字符串) {
const 用户正则 = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
return 用户正则.test(字符串);
}
function 是否有效地址(地址792) {
const 值4正则 = /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;
if (值4正则.test(地址792)) return true;
const 值6正则 = /^(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$/;
if (值6正则.test(地址792)) return true;
const 值6值正则 = /^::1$|^::$|^(?:[0-9a-fA-F]{1,4}:)*::(?:[0-9a-fA-F]{1,4}:)*[0-9a-fA-F]{1,4}$/;
if (值6值正则.test(地址792)) return true;
return false;
}
function 创建节点命名器(跳过 = false) {
// 如果配置了 yxURL,则跳过编号
const 值跳过 = typeof 优选地址源 !== 'undefined' && 优选地址源 && 优选地址源.trim();
let 跳过编号791 = 值跳过 || 跳过;
const 计数器组790 = {};
function 设置跳过编号(本地值789) {
if (!值跳过) {
跳过编号791 = 本地值789;
}
}
function 处理命名器(基础名称, 节点名称788 = null) {
if (跳过编号791 || 基础名称 && 基础名称.includes('.')) {
return 节点名称788 || 基础名称;
}
if (!计数器组790[基础名称]) 计数器组790[基础名称] = 0;
计数器组790[基础名称]++;
const 索引787 = String(计数器组790[基础名称]).padStart(2, '0');
return `${节点名称788 || 基础名称}-${索引787}`;
}
return {
namer: 处理命名器,
setSkipNumbering: 设置跳过编号
};
}
function 规范化节点主机(主机786) {
return String(主机786 || '').trim().replace(/^\[([^\]]+)\]$/, '$1');
}
function 处理值节点别名部分(值785, 回退 = 'Node') {
let 文本784 = String(值785 || '').trim();
if (!文本784 || /^自定义优选-/i.test(文本784)) 文本784 = 回退;
文本784 = 文本784.replace(/^\[([^\]]+)\]$/, '$1').replace(/^https?:\/\//i, '').replace(/[/?#].*$/, '').replace(/\s+/g, '_');
return 文本784 || 回退;
}
function 获取值节点别名基础(项目783) {
const 主机782 = 规范化节点主机(项目783?.ip || 项目783?.domain || '');
if (主机782 && 主机782.includes(':') && /^[0-9a-fA-F:.]+$/.test(主机782)) return 'IPv6优选';
if (主机782 && !是否有效地址(主机782)) return '优选域名';
const 本地值781 = 处理值节点别名部分(项目783?.isp || 项目783?.name || '', 'IPv4优选');
const 机房780 = 处理值节点别名部分(项目783?.colo || '', '');
return 机房780 ? `${本地值781}-${机房780}` : 本地值781;
}
function 创建值节点命名器(跳过编号779 = false) {
const 计数器组 = {};
return 项目778 => {
const 基础 = 获取值节点别名基础(项目778);
if (跳过编号779) return 基础;
计数器组[基础] = (计数器组[基础] || 0) + 1;
return `${基础}-${String(计数器组[基础]).padStart(2, '0')}`;
};
}
function 规范化应用层协议协商(值777) {
const 本地值776 = ['', 'h3', 'h2', 'http/1.1', 'h3,h2', 'h2,http/1.1', 'h3,h2,http/1.1'];
const 应用层协议协商775 = String(值777 || '').trim();
return 本地值776.includes(应用层协议协商775) ? 应用层协议协商775 : '';
}
function 处理值应用层协议协商值(参数774) {
const 应用层协议协商 = 规范化应用层协议协商(自定义应用层协议协商);
if (应用层协议协商) 参数774.set('alpn', 应用层协议协商);
}
async function 处理值键值值(本地值773) {
if (本地值773.C) {
try {
键值存储 = 本地值773.C;
await 加载键值配置();
} catch (错误772) {
键值存储 = null;
}
} else {}
}
async function 加载键值配置(本地值771 = false) {
if (!键值存储) {
return;
}
// 短窗口内完全信任缓存,避免高频请求时打爆 KV
if (!本地值771 && 键值配置上次加载 > 0 && Date.now() - 键值配置上次加载 < 键值缓存期限) {
return;
}
try {
// 读取小体积的版本键 c_ver(约 13B),用于跨 isolate 缓存失效
let 本地值770 = '';
try {
本地值770 = (await 键值存储.get('c_ver')) || '';
} catch (忽略值769) {}
// 版本未变化且已有缓存,仅刷新时间戳,跳过完整读取
if (!本地值771 && 本地值770 && 本地值770 === 键值配置版本 && 键值配置 && Object.keys(键值配置).length > 0) {
键值配置上次加载 = Date.now();
return;
}
const 配置数据 = await 键值存储.get('c');
if (配置数据) {
键值配置 = JSON.parse(配置数据);
}
键值配置版本 = 本地值770;
键值配置上次加载 = Date.now();
} catch (错误768) {
// 读取失败时保留现有缓存,避免临时故障导致配置丢失
if (!键值配置) 键值配置 = {};
}
}
async function 保存键值配置() {
if (!键值存储) {
return;
}
try {
const 配置字符串 = JSON.stringify(键值配置);
await 键值存储.put('c', 配置字符串);
// 写入版本号,让其它 isolate 在下次请求时能立即看到变更
const 新值 = String(Date.now());
键值配置版本 = 新值;
try {
await 键值存储.put('c_ver', 新值);
} catch (忽略值767) {}
键值配置上次加载 = Date.now();
} catch (错误766) {
throw 错误766;
}
}
function 获取配置值(键765, 默认值 = '') {
if (键值配置[键765] !== undefined) {
return 键值配置[键765];
}
return 默认值;
}
async function 设置配置值(键764, 值763) {
键值配置[键764] = 值763;
await 保存键值配置();
}
async function 检测工作器地区(请求762) {
try {
const 云墙国家 = 请求762.cf?.country;
if (云墙国家) {
const 国家值地区 = {
'US': 'US',
'SG': 'SG',
'JP': 'JP',
'KR': 'KR',
'DE': 'DE',
'SE': 'SE',
'NL': 'NL',
'FI': 'FI',
'GB': 'GB',
'CN': 'SG',
'TW': 'JP',
'AU': 'SG',
'CA': 'US',
'FR': 'DE',
'IT': 'DE',
'ES': 'DE',
'CH': 'DE',
'AT': 'DE',
'BE': 'NL',
'DK': 'SE',
'NO': 'SE',
'IE': 'GB'
};
if (国家值地区[云墙国家]) {
return 国家值地区[云墙国家];
}
}
return 'SG';
} catch (错误761) {
return 'SG';
}
}
async function 检查地址可用性(域名760, 端口759 = 443, 超时758 = 2000) {
try {
const 控制器757 = new AbortController();
const 超时标识756 = setTimeout(() => 控制器757.abort(), 超时758);
const 响应755 = await fetch(`https://${域名760}`, {
method: 'HEAD',
signal: 控制器757.signal,
headers: {
'User-Agent': 'Mozilla/5.0 (compatible; CF-IP-Checker/1.0)'
}
});
clearTimeout(超时标识756);
return 响应755.status < 500;
} catch (错误754) {
return true;
}
}
async function 获取值备用地址(工作器地区753 = '', 值地区匹配752 = 启用地区匹配) {
if (备用地址列表.length === 0) {
return null;
}
const 可用地址列表751 = 备用地址列表.map(地址750 => ({
...地址750,
available: true
}));
if (值地区匹配752 && 工作器地区753) {
const 值地址列表749 = 获取值地区值(工作器地区753, 可用地址列表751, 值地区匹配752);
if (值地址列表749.length > 0) {
const 已选地址748 = 值地址列表749[0];
return 已选地址748;
}
}
const 已选地址 = 可用地址列表751[0];
return 已选地址;
}
function 获取值值(地区747) {
const 值映射 = {
'US': ['SG', 'JP', 'KR'],
'SG': ['JP', 'KR', 'US'],
'JP': ['SG', 'KR', 'US'],
'KR': ['JP', 'SG', 'US'],
'DE': ['NL', 'GB', 'SE', 'FI'],
'SE': ['DE', 'NL', 'FI', 'GB'],
'NL': ['DE', 'GB', 'SE', 'FI'],
'FI': ['SE', 'DE', 'NL', 'GB'],
'GB': ['DE', 'NL', 'SE', 'FI']
};
return 值映射[地区747] || [];
}
function 获取值值值值(地区746) {
const 值值745 = 获取值值(地区746);
const 值值744 = ['US', 'SG', 'JP', 'KR', 'DE', 'SE', 'NL', 'FI', 'GB'];
return [地区746, ...值值745, ...值值744.filter(结果值743 => 结果值743 !== 地区746 && !值值745.includes(结果值743))];
}
function 获取值地区值(工作器地区, 可用地址列表, 值地区匹配 = 启用地区匹配) {
if (!值地区匹配 || !工作器地区) {
return 可用地址列表;
}
const 值值742 = 获取值值值值(工作器地区);
const 值地址列表741 = [];
for (const 地区 of 值值742) {
const 地区地址列表 = 可用地址列表.filter(地址740 => 地址740.regionCode === 地区);
值地址列表741.push(...地区地址列表);
}
return 值地址列表741;
}
function 解析地址值端口(输入) {
if (输入.includes('[') && 输入.includes(']')) {
const 本地值739 = 输入.match(/^\[([^\]]+)\](?::(\d+))?$/);
if (本地值739) {
return {
address: 本地值739[1],
port: 本地值739[2] ? parseInt(本地值739[2], 10) : null
};
}
}
const 值值索引738 = 输入.lastIndexOf(':');
if (值值索引738 > 0) {
const 地址737 = 输入.substring(0, 值值索引738);
const 端口字符串 = 输入.substring(值值索引738 + 1);
const 端口736 = parseInt(端口字符串, 10);
// address 含 ':' 说明是裸 IPv6(如 2001:db8::1),整体当地址,无端口
if (!地址737.includes(':') && !isNaN(端口736) && 端口736 > 0 && 端口736 <= 65535) {
return {
address: 地址737,
port: 端口736
};
}
}
return {
address: 输入,
port: null
};
}
export default {
async fetch(请求735, 本地值734, 本地值733) {
try {
const 是否网页套接字 = 请求735.headers.get('Upgrade') === atob('d2Vic29ja2V0');
const 是否值732 = 请求735.method === 'POST';
const 请求网址731 = new URL(请求735.url);
const 路径值730 = 请求网址731.pathname.split('/').filter(参数值729 => 参数值729);
if (!是否网页套接字 && !是否值732 && 请求网址731.pathname !== '/') {
const 值值728 = (本地值734.u || 本地值734.U || '').toLowerCase();
const 值值727 = (本地值734.d || 本地值734.D || '').toLowerCase();
const 首次值 = 路径值730[0] || '';
const 清理值 = 值值727.startsWith('/') ? 值值727.substring(1) : 值值727;
if (首次值 !== 值值728 && (清理值 ? 首次值 !== 清理值 : false)) {
return new Response('Not Found', {
status: 404
});
}
}
await 处理值键值值(本地值734);
认证令牌 = (本地值734.u || 本地值734.U || 认证令牌).toLowerCase();
const 值路径 = (本地值734.d || 本地值734.D || 认证令牌).toLowerCase();
const 本地值726 = 获取配置值('p', 本地值734.p || 本地值734.P);
let 值自定义地址 = false;
const 手动地区725 = 获取配置值('wk', 本地值734.wk || 本地值734.WK);
if (手动地区725 && 手动地区725.trim()) {
手动工作器地区 = 手动地区725.trim().toUpperCase();
当前工作器地区 = 手动工作器地区;
} else if (本地值726 && 本地值726.trim()) {
值自定义地址 = true;
当前工作器地区 = 'CUSTOM';
} else {
当前工作器地区 = await 检测工作器地区(请求735);
}
const 地区匹配控制724 = 获取配置文本值('rm', 配置默认值.rm, 本地值734.rm || 本地值734.RM);
启用地区匹配 = !(地区匹配控制724 && 地区匹配控制724.toLowerCase() === 'no');
const 值回退723 = 获取配置文本值('p', 配置默认值.p, 本地值734.p || 本地值734.P);
回退地址 = 值回退723 ? 值回退723.trim() : '';
代理5配置 = 获取配置文本值('s', 配置默认值.s, 本地值734.s || 本地值734.S);
if (代理5配置) {
try {
已解析代理5配置 = 解析代理配置(代理5配置);
是否代理已启用 = true;
} catch (错误722) {
是否代理已启用 = false;
}
} else {
已解析代理5配置 = {};
是否代理已启用 = false;
}
const 自定义优选 = 获取配置值('yx', 本地值734.yx || 本地值734.YX);
if (自定义优选) {
try {
const 优选列表721 = 自定义优选.split(',').map(项目720 => 项目720.trim()).filter(项目719 => 项目719);
自定义优选地址列表 = [];
自定义优选域名列表 = [];
优选列表721.forEach(项目718 => {
let 节点名称717 = '';
let 地址部分716 = 项目718;
if (项目718.includes('#')) {
const 部分列表715 = 项目718.split('#');
地址部分716 = 部分列表715[0].trim();
节点名称717 = 部分列表715[1].trim();
}
const {
address: 地址714,
port: 端口713
} = 解析地址值端口(地址部分716);
if (!节点名称717) {
节点名称717 = '自定义优选-' + 地址714 + (端口713 ? ':' + 端口713 : '');
}
if (是否有效地址(地址714)) {
自定义优选地址列表.push({
ip: 地址714,
port: 端口713,
isp: 节点名称717
});
} else {
自定义优选域名列表.push({
domain: 地址714,
port: 端口713,
name: 节点名称717
});
}
});
} catch (错误712) {
自定义优选地址列表 = [];
自定义优选域名列表 = [];
}
}
const 值控制711 = 获取配置文本值('qj', 配置默认值.qj, 本地值734.qj || 本地值734.QJ);
启用代理降级 = !!(值控制711 && 值控制711.toLowerCase() === 'no');
const 值控制710 = 获取配置文本值('dkby', 配置默认值.dkby, 本地值734.dkby || 本地值734.DKBY);
禁用非传输层安全 = !!(值控制710 && 值控制710.toLowerCase() === 'yes');
const 值控制709 = 获取配置文本值('yxby', 配置默认值.yxby, 本地值734.yxby || 本地值734.YXBY);
禁用优选 = !!(值控制709 && 值控制709.toLowerCase() === 'yes');
启用明文 = 获取配置开关值('ev', true, 本地值734.ev);
启用木马 = 获取配置开关值('et', false, 本地值734.et);
传输路径 = 获取配置文本值('tp', 配置默认值.tp, 本地值734.tp);
启用扩展传输 = 获取配置开关值('ex', false, 本地值734.ex);
订阅转换接口 = 获取配置文本值('scu', 配置默认值.scu, 本地值734.scu);
启用优选域名 = 获取配置开关值('epd', true, 本地值734.epd || 本地值734.EPD);
启用优选地址 = 获取配置开关值('epi', true, 本地值734.epi || 本地值734.EPI);
启用仓库优选 = 获取配置开关值('egi', true, 本地值734.egi || 本地值734.EGI);
启用原生地址 = 获取配置开关值('ena', false, 本地值734.ena || 本地值734.ENA);
启用加密客户端问候 = 获取配置开关值('ech', false, 本地值734.ech || 本地值734.ECH);
// 加载自定义DNS和ECH域名配置
自定义域名系统 = 获取配置文本值('customDNS', 配置默认值.customDNS).trim() || 配置默认值.customDNS;
自定义加密客户端问候域名 = 获取配置文本值('customECHDomain', 配置默认值.customECHDomain).trim() || 配置默认值.customECHDomain;
自定义应用层协议协商 = 规范化应用层协议协商(获取配置文本值('alpn', 配置默认值.alpn, 本地值734.alpn || 本地值734.ALPN));
// 如果启用了ECH,自动启用仅TLS模式(避免80端口干扰)
// ECH需要TLS才能工作,所以必须禁用非TLS节点
if (启用加密客户端问候) {
禁用非传输层安全 = true;
// 检查 KV 中是否有 dkby: yes,没有就直接写入
const 当前值 = 获取配置值('dkby', '');
if (当前值 !== 'yes') {
await 设置配置值('dkby', 'yes');
}
}
if (!启用明文 && !启用木马 && !启用扩展传输) {
启用明文 = true;
}
优选地址源 = 获取配置文本值('yxURL', 配置默认值.yxURL, 本地值734.yxURL || 本地值734.YXURL);
自定义路径 = 获取配置文本值('d', 配置默认值.d, 本地值734.d || 本地值734.D);
const 网址698 = new URL(请求735.url);
if (网址698.pathname.includes('/api/config')) {
const 路径部分列表697 = 网址698.pathname.split('/').filter(参数值696 => 参数值696);
const 接口索引695 = 路径部分列表697.indexOf('api');
if (接口索引695 > 0) {
const 路径值694 = 路径部分列表697.slice(0, 接口索引695);
const 路径值693 = 路径值694.join('/');
let 是否有效692 = false;
if (自定义路径 && 自定义路径.trim()) {
const 清理自定义路径691 = 自定义路径.trim().startsWith('/') ? 自定义路径.trim().substring(1) : 自定义路径.trim();
是否有效692 = 路径值693 === 清理自定义路径691;
} else {
是否有效692 = 是否有效格式(路径值693) && 路径值693 === 认证令牌;
}
if (是否有效692) {
return await 处理配置接口(请求735, 本地值734);
} else {
return new Response(JSON.stringify({
error: '路径验证失败'
}), {
status: 403,
headers: {
'Content-Type': 'application/json'
}
});
}
}
return new Response(JSON.stringify({
error: '无效的API路径'
}), {
status: 404,
headers: {
'Content-Type': 'application/json'
}
});
}
if (网址698.pathname.includes('/api/preferred-ips')) {
const 路径部分列表690 = 网址698.pathname.split('/').filter(参数值689 => 参数值689);
const 接口索引 = 路径部分列表690.indexOf('api');
if (接口索引 > 0) {
const 路径值688 = 路径部分列表690.slice(0, 接口索引);
const 路径值687 = 路径值688.join('/');
let 是否有效686 = false;
if (自定义路径 && 自定义路径.trim()) {
const 清理自定义路径685 = 自定义路径.trim().startsWith('/') ? 自定义路径.trim().substring(1) : 自定义路径.trim();
是否有效686 = 路径值687 === 清理自定义路径685;
} else {
是否有效686 = 是否有效格式(路径值687) && 路径值687 === 认证令牌;
}
if (是否有效686) {
return await 处理优选地址列表接口(请求735);
} else {
return new Response(JSON.stringify({
error: '路径验证失败'
}), {
status: 403,
headers: {
'Content-Type': 'application/json'
}
});
}
}
return new Response(JSON.stringify({
error: '无效的API路径'
}), {
status: 404,
headers: {
'Content-Type': 'application/json'
}
});
}
if (请求735.method === 'POST' && 启用扩展传输) {
const 结果值684 = await 处理扩展超文本值(请求735);
if (结果值684) {
本地值733.waitUntil(结果值684.closed);
return new Response(结果值684.readable, {
headers: {
'X-Accel-Buffering': 'no',
'Cache-Control': 'no-store',
Connection: 'keep-alive',
'User-Agent': 'Go-http-client/2.0',
'Content-Type': 'application/grpc'
}
});
}
return new Response('Internal Server Error', {
status: 500
});
}
if (请求735.headers.get('Upgrade') === atob('d2Vic29ja2V0')) {
return await 处理网页套接字请求(请求735);
}
if (请求735.method === 'GET') {
// 处理 /{UUID}/region 或 /{自定义路径}/region
if (网址698.pathname.endsWith('/region')) {
const 路径部分列表683 = 网址698.pathname.split('/').filter(参数值682 => 参数值682);
if (路径部分列表683.length === 2 && 路径部分列表683[1] === 'region') {
const 路径值681 = 路径部分列表683[0];
let 是否有效680 = false;
if (自定义路径 && 自定义路径.trim()) {
// 使用自定义路径
const 清理自定义路径679 = 自定义路径.trim().startsWith('/') ? 自定义路径.trim().substring(1) : 自定义路径.trim();
是否有效680 = 路径值681 === 清理自定义路径679;
} else {
// 使用UUID路径
是否有效680 = 是否有效格式(路径值681) && 路径值681 === 认证令牌;
}
if (是否有效680) {
const 本地值678 = 获取配置值('p', 本地值734.p || 本地值734.P);
const 手动地区677 = 获取配置值('wk', 本地值734.wk || 本地值734.WK);
if (手动地区677 && 手动地区677.trim()) {
return new Response(JSON.stringify({
region: 手动地区677.trim().toUpperCase(),
detectionMethod: '手动指定地区',
manualRegion: 手动地区677.trim().toUpperCase(),
timestamp: new Date().toISOString()
}), {
headers: {
'Content-Type': 'application/json'
}
});
} else if (本地值678 && 本地值678.trim()) {
return new Response(JSON.stringify({
region: 'CUSTOM',
detectionMethod: 解码64('6Ieq5a6a5LmJUHJveHlJUOaooeW8jw=='),
ci: 本地值678,
timestamp: new Date().toISOString()
}), {
headers: {
'Content-Type': 'application/json'
}
});
} else {
const 值地区 = await 检测工作器地区(请求735);
return new Response(JSON.stringify({
region: 值地区,
detectionMethod: 'API检测',
timestamp: new Date().toISOString()
}), {
headers: {
'Content-Type': 'application/json'
}
});
}
} else {
return new Response(JSON.stringify({
error: '访问被拒绝',
message: '路径验证失败'
}), {
status: 403,
headers: {
'Content-Type': 'application/json'
}
});
}
}
}
// 处理 /{UUID}/test-api 或 /{自定义路径}/test-api
if (网址698.pathname.endsWith('/test-api')) {
const 路径部分列表676 = 网址698.pathname.split('/').filter(参数值675 => 参数值675);
if (路径部分列表676.length === 2 && 路径部分列表676[1] === 'test-api') {
const 路径值 = 路径部分列表676[0];
let 是否有效 = false;
if (自定义路径 && 自定义路径.trim()) {
// 使用自定义路径
const 清理自定义路径674 = 自定义路径.trim().startsWith('/') ? 自定义路径.trim().substring(1) : 自定义路径.trim();
是否有效 = 路径值 === 清理自定义路径674;
} else {
// 使用UUID路径
是否有效 = 是否有效格式(路径值) && 路径值 === 认证令牌;
}
if (是否有效) {
try {
const 测试地区 = await 检测工作器地区(请求735);
return new Response(JSON.stringify({
detectedRegion: 测试地区,
message: 'API测试完成',
timestamp: new Date().toISOString()
}), {
headers: {
'Content-Type': 'application/json'
}
});
} catch (错误673) {
return new Response(JSON.stringify({
error: 错误673.message,
message: 'API测试失败'
}), {
status: 500,
headers: {
'Content-Type': 'application/json'
}
});
}
} else {
return new Response(JSON.stringify({
error: '访问被拒绝',
message: '路径验证失败'
}), {
status: 403,
headers: {
'Content-Type': 'application/json'
}
});
}
}
}
if (网址698.pathname === '/') {
// 检查是否有自定义首页URL配置
const 自定义值 = 获取配置值('homepage', 本地值734.homepage || 本地值734.HOMEPAGE);
if (自定义值 && 自定义值.trim()) {
try {
// 从自定义URL获取内容
const 值响应 = await fetch(自定义值.trim(), {
method: 'GET',
headers: {
'User-Agent': 请求735.headers.get('User-Agent') || 'Mozilla/5.0',
'Accept': 请求735.headers.get('Accept') || '*/*',
'Accept-Language': 请求735.headers.get('Accept-Language') || 'en-US,en;q=0.9'
},
redirect: 'follow'
});
if (值响应.ok) {
// 获取响应内容
const 内容类型672 = 值响应.headers.get('Content-Type') || 'text/html; charset=utf-8';
const 内容671 = await 值响应.text();
// 返回自定义首页内容
return new Response(内容671, {
status: 值响应.status,
headers: {
'Content-Type': 内容类型672,
'Cache-Control': 'no-cache, no-store, must-revalidate'
}
});
}
} catch (错误670) {
// 如果获取失败,继续使用默认终端页面
console.error('获取自定义首页失败:', 错误670);
}
}
// 优先检查Cookie中的语言设置
const 凭据头部669 = 请求735.headers.get('Cookie') || '';
let 语言来源凭据668 = null;
if (凭据头部669) {
const 本地值667 = 凭据头部669.split(';').map(丙值666 => 丙值666.trim());
for (const 凭据665 of 本地值667) {
if (凭据665.startsWith('preferredLanguage=')) {
语言来源凭据668 = 凭据665.split('=')[1];
break;
}
}
}
let 是否值664 = false;
if (语言来源凭据668 === 'fa' || 语言来源凭据668 === 'fa-IR') {
是否值664 = true;
} else if (语言来源凭据668 === 'zh' || 语言来源凭据668 === 'zh-CN') {
是否值664 = false;
} else {
// 如果没有Cookie,使用浏览器语言检测
const 接受语言663 = 请求735.headers.get('Accept-Language') || '';
const 浏览器语言662 = 接受语言663.split(',')[0].split('-')[0].toLowerCase();
是否值664 = 浏览器语言662 === 'fa' || 接受语言663.includes('fa-IR') || 接受语言663.includes('fa');
}
const 语言 = 是否值664 ? 'fa' : 'zh-CN';
const 语言值661 = 是否值664 ? 'fa-IR' : 'zh-CN';
const 本地值660 = {
zh: {
title: '终端 v2.9.8c',
terminal: '终端 v2.9.8c',
congratulations: '恭喜你来到这',
enterU: '请输入你U变量的值',
enterD: '请输入你D变量的值',
command: '命令: connect [',
uuid: 'UUID',
path: 'PATH',
inputU: '输入U变量的内容并且回车...',
inputD: '输入D变量的内容并且回车...',
connecting: '正在连接...',
invading: '正在入侵...',
success: '连接成功!返回结果...',
error: '错误: 无效的UUID格式',
reenter: '请重新输入有效的UUID'
},
fa: {
title: 'ترمینال v2.9.8c',
terminal: 'ترمینال v2.9.8c',
congratulations: 'تبریک میگوییم به شما',
enterU: 'لطفا مقدار متغیر U خود را وارد کنید',
enterD: 'لطفا مقدار متغیر D خود را وارد کنید',
command: 'دستور: connect [',
uuid: 'UUID',
path: 'PATH',
inputU: 'محتویات متغیر U را وارد کرده و Enter را بزنید...',
inputD: 'محتویات متغیر D را وارد کرده و Enter را بزنید...',
connecting: 'در حال اتصال...',
invading: 'در حال نفوذ...',
success: 'اتصال موفق! در حال بازگشت نتیجه...',
error: 'خطا: فرمت UUID نامعتبر',
reenter: 'لطفا UUID معتبر را دوباره وارد کنید'
}
};
const 翻译值659 = 本地值660[是否值664 ? 'fa' : 'zh'];
const 终端页面 = `
${翻译值659.title}
SYS:: ${翻译值659.terminal}
NODE:: NIGHT_CITY
LINK:: SECURE / ENC
LANG_
root:~$
${翻译值659.congratulations}
root:~$
${自定义路径 && 自定义路径.trim() ? 翻译值659.enterD : 翻译值659.enterU}
root:~$
${翻译值659.command}${自定义路径 && 自定义路径.trim() ? 翻译值659.path : 翻译值659.uuid}]
root:~$
`;
return new Response(终端页面, {
status: 200,
headers: {
'Content-Type': 'text/html; charset=utf-8'
}
});
}
if (自定义路径 && 自定义路径.trim()) {
const 清理自定义路径 = 自定义路径.trim().startsWith('/') ? 自定义路径.trim() : '/' + 自定义路径.trim();
const 规范化自定义路径 = 清理自定义路径.endsWith('/') && 清理自定义路径.length > 1 ? 清理自定义路径.slice(0, -1) : 清理自定义路径;
const 规范化路径 = 网址698.pathname.endsWith('/') && 网址698.pathname.length > 1 ? 网址698.pathname.slice(0, -1) : 网址698.pathname;
if (规范化路径 === 规范化自定义路径) {
return await 处理订阅值(请求735, 认证令牌);
}
if (规范化路径 === 规范化自定义路径 + '/sub') {
return await 处理订阅请求(请求735, 认证令牌, 网址698);
}
if (网址698.pathname.length > 1 && 网址698.pathname !== '/') {
const 用户658 = 网址698.pathname.replace(/\/$/, '').replace('/sub', '').substring(1);
if (是否有效格式(用户658)) {
return new Response(JSON.stringify({
error: '访问被拒绝',
message: '当前 Worker 已启用自定义路径模式,UUID 访问已禁用'
}), {
status: 403,
headers: {
'Content-Type': 'application/json'
}
});
}
}
} else {
if (网址698.pathname.length > 1 && 网址698.pathname !== '/' && !网址698.pathname.includes('/sub')) {
const 用户657 = 网址698.pathname.replace(/\/$/, '').substring(1);
if (是否有效格式(用户657)) {
if (用户657 === 认证令牌) {
return await 处理订阅值(请求735, 用户657);
} else {
return new Response(JSON.stringify({
error: 'UUID错误 请注意变量名称是u不是uuid'
}), {
status: 403,
headers: {
'Content-Type': 'application/json'
}
});
}
}
}
if (网址698.pathname.includes('/sub')) {
const 路径部分列表 = 网址698.pathname.split('/');
if (路径部分列表.length === 2 && 路径部分列表[1] === 'sub') {
const 用户656 = 路径部分列表[0].substring(1);
if (是否有效格式(用户656)) {
if (用户656 === 认证令牌) {
return await 处理订阅请求(请求735, 用户656, 网址698);
} else {
return new Response(JSON.stringify({
error: 'UUID错误'
}), {
status: 403,
headers: {
'Content-Type': 'application/json'
}
});
}
}
}
}
}
if (网址698.pathname.toLowerCase().includes(`/${值路径}`)) {
return await 处理订阅请求(请求735, 认证令牌);
}
}
return new Response(JSON.stringify({
error: 'Not Found'
}), {
status: 404,
headers: {
'Content-Type': 'application/json'
}
});
} catch (错误655) {
return new Response(错误655.toString(), {
status: 500
});
}
}
};
function 生成值配置654(链接列表653) {
return btoa(链接列表653.join('\n'));
}
// 解析分享链接并生成客户端节点配置
function 解析链接值值节点(链接652) {
try {
// 解析第一类链接
if (链接652.startsWith(解码64('dmxlc3M6Ly8='))) {
const 网址651 = new URL(链接652);
const 名称650 = decodeURIComponent(网址651.hash.substring(1));
const 唯一标识649 = 网址651.username;
const 本地值648 = 网址651.hostname;
const 端口647 = parseInt(网址651.port) || 443;
const 参数646 = new URLSearchParams(网址651.search);
const 传输层安全645 = 参数646.get('security') === 'tls' || 参数646.get('tls') === 'true';
const 本地值644 = 参数646.get('type') || 'ws';
const 路径643 = 参数646.get('path') || '/?ed=2048';
const 主机642 = 参数646.get('host') || 本地值648;
const 本地值641 = 参数646.get('sni') || 主机642;
const 应用层协议协商原始640 = 参数646.get('alpn') || '';
const 本地值639 = 参数646.get('fp') || 参数646.get('client-fingerprint') || 'chrome';
const 加密客户端问候638 = 参数646.get('ech');
const 节点637 = {
name: 名称650,
type: 解码64('dmxlc3M='),
server: 本地值648,
port: 端口647,
uuid: 唯一标识649,
tls: 传输层安全645,
network: 本地值644,
'client-fingerprint': 本地值639
};
if (传输层安全645) {
节点637.servername = 本地值641;
if (应用层协议协商原始640) 节点637.alpn = 应用层协议协商原始640.split(',').map(甲值636 => 甲值636.trim()).filter(Boolean);
节点637['skip-cert-verify'] = false;
}
if (本地值644 === 'ws') {
节点637['ws-opts'] = {
path: 路径643,
headers: {
Host: 主机642
}
};
}
if (加密客户端问候638) {
const 加密客户端问候域名635 = 自定义加密客户端问候域名 || 'cloudflare-ech.com';
节点637['ech-opts'] = {
enable: true,
'query-server-name': 加密客户端问候域名635
};
}
return 节点637;
}
// 解析第二类链接
if (链接652.startsWith(解码64('dHJvamFuOi8v'))) {
const 网址634 = new URL(链接652);
const 名称633 = decodeURIComponent(网址634.hash.substring(1));
const 密码632 = 网址634.username;
const 本地值631 = 网址634.hostname;
const 端口630 = parseInt(网址634.port) || 443;
const 参数629 = new URLSearchParams(网址634.search);
const 本地值628 = 参数629.get('type') || 'ws';
const 路径 = 参数629.get('path') || '/?ed=2048';
const 主机627 = 参数629.get('host') || 本地值631;
const 服务名称指示626 = 参数629.get('sni') || 主机627;
const 应用层协议协商原始 = 参数629.get('alpn') || '';
const 加密客户端问候 = 参数629.get('ech');
const 节点 = {
name: 名称633,
type: 解码64('dHJvamFu'),
server: 本地值631,
port: 端口630,
password: 密码632,
network: 本地值628,
sni: 服务名称指示626,
'skip-cert-verify': false
};
if (应用层协议协商原始) 节点.alpn = 应用层协议协商原始.split(',').map(甲值625 => 甲值625.trim()).filter(Boolean);
if (本地值628 === 'ws') {
节点['ws-opts'] = {
path: 路径,
headers: {
Host: 主机627
}
};
}
if (加密客户端问候) {
const 加密客户端问候域名624 = 自定义加密客户端问候域名 || 'cloudflare-ech.com';
节点['ech-opts'] = {
enable: true,
'query-server-name': 加密客户端问候域名624
};
}
return 节点;
}
} catch (事件值623) {
return null;
}
return null;
}
// ============================================================
// 内部格式转换器 - 不依赖外部服务
// ============================================================
// 用于 YAML 引号包裹(避免 IPv6 方括号、逗号等被解析为数组)
function 处理本地值622(取值621) {
if (取值621 == null) return '""';
const 字符串值620 = String(取值621);
return '"' + 字符串值620.replace(/\\/g, '\\\\').replace(/"/g, '\\"') + '"';
}
// URL.hostname 对 IPv6 会带方括号,直接写入 YAML 会被当成数组
function 规范化值主机(主机名619) {
if (!主机名619) return 主机名619;
const 头值618 = String(主机名619);
if (头值618.startsWith('[') && 头值618.endsWith(']')) return 头值618.slice(1, -1);
return 头值618;
}
// Clash 策略组 proxies:策略组 + 全部节点(避免分组里只有「节点选择」没有具体节点)
function 处理值选择值(名称列表617, 本地值616 = {}) {
const {
directFirst: 直连首次615 = false,
extraGroups: 值值614 = []
} = 本地值616;
const 节点行列表 = 名称列表617.length ? 名称列表617.map(数量值613 => ` - ${处理本地值622(数量值613)}`).join('\n') : ' - DIRECT';
const 行列表612 = [];
if (直连首次615) {
行列表612.push(' - "🎯 全球直连"', ' - "🚀 节点选择"');
} else {
行列表612.push(' - "🚀 节点选择"', ' - "🎯 全球直连"');
}
for (const 本地值611 of 值值614) 行列表612.push(` - ${处理本地值622(本地值611)}`);
行列表612.push(节点行列表);
return 行列表612.join('\n');
}
// Surge / Loon 策略组列表:策略组 + 全部节点
function 处理值值列表(名称列表610, 本地值609 = {}) {
const {
directFirst: 直连首次 = false,
extraGroups: 值值608 = [],
compact: 本地值607 = false
} = 本地值609;
const 本地值606 = 本地值607 ? ',' : ', ';
const 列表605 = 名称列表610.length ? 名称列表610.join(本地值606) : 'DIRECT';
const 部分列表604 = [];
if (直连首次) 部分列表604.push('🎯 全球直连', '🚀 节点选择');else 部分列表604.push('🚀 节点选择', '🎯 全球直连');
部分列表604.push(...值值608);
if (名称列表610.length) 部分列表604.push(列表605);
return 部分列表604.join(本地值606);
}
// 解析任意分享链接为通用节点对象
function 解析值链接(链接603) {
try {
if (链接603.startsWith(解码64('dmxlc3M6Ly8='))) {
const 网址602 = new URL(链接603);
const 参数值601 = new URLSearchParams(网址602.search);
return {
proto: 解码64('dmxlc3M='),
name: decodeURIComponent(网址602.hash.substring(1)) || 网址602.hostname + ':' + 网址602.port,
uuid: 网址602.username,
server: 规范化值主机(网址602.hostname),
port: parseInt(网址602.port) || 443,
tls: 参数值601.get('security') === 'tls' || 参数值601.get('security') === 'reality',
network: 参数值601.get('type') || 'ws',
path: 参数值601.get('path') || '/?ed=2048',
host: 规范化值主机(参数值601.get('host') || 网址602.hostname),
sni: 规范化值主机(参数值601.get('sni') || 参数值601.get('host') || 网址602.hostname),
alpn: (参数值601.get('alpn') || '').split(',').map(字符串值600 => 字符串值600.trim()).filter(Boolean),
fp: 参数值601.get('fp') || 'chrome',
flow: 参数值601.get('flow') || '',
encryption: 参数值601.get('encryption') || 'none',
mode: 参数值601.get('mode') || '',
ech: 参数值601.get('ech') || ''
};
}
if (链接603.startsWith(解码64('dHJvamFuOi8v'))) {
const 网址599 = new URL(链接603);
const 参数值 = new URLSearchParams(网址599.search);
return {
proto: 解码64('dHJvamFu'),
name: decodeURIComponent(网址599.hash.substring(1)) || 网址599.hostname + ':' + 网址599.port,
password: decodeURIComponent(网址599.username),
server: 规范化值主机(网址599.hostname),
port: parseInt(网址599.port) || 443,
tls: true,
network: 参数值.get('type') || 'ws',
path: 参数值.get('path') || '/?ed=2048',
host: 规范化值主机(参数值.get('host') || 网址599.hostname),
sni: 规范化值主机(参数值.get('sni') || 参数值.get('host') || 网址599.hostname),
alpn: (参数值.get('alpn') || '').split(',').map(字符串值598 => 字符串值598.trim()).filter(Boolean),
fp: 参数值.get('fp') || 'chrome',
ech: 参数值.get('ech') || ''
};
}
} catch (事件值597) {}
return null;
}
// 单个节点 → Clash 块级 YAML(避免 flow style 解析错误)
function 构建值节点行(数量值596) {
const 行列表595 = [];
const 本地值594 = 规范化值主机(数量值596.server);
const 主机593 = 规范化值主机(数量值596.host) || 本地值594;
const 服务名称指示592 = 规范化值主机(数量值596.sni) || 主机593;
行列表595.push(` - name: ${处理本地值622(数量值596.name)}`);
行列表595.push(` type: ${数量值596.proto}`);
行列表595.push(` server: ${处理本地值622(本地值594)}`);
行列表595.push(` port: ${数量值596.port}`);
if (数量值596.proto === 解码64('dmxlc3M=')) {
行列表595.push(` uuid: ${数量值596.uuid}`);
行列表595.push(` udp: true`);
行列表595.push(` tls: ${数量值596.tls ? 'true' : 'false'}`);
if (数量值596.flow) 行列表595.push(` flow: ${处理本地值622(数量值596.flow)}`);
行列表595.push(` client-fingerprint: ${处理本地值622(数量值596.fp || 'chrome')}`);
} else if (数量值596.proto === 解码64('dHJvamFu')) {
行列表595.push(` password: ${处理本地值622(数量值596.password)}`);
行列表595.push(` udp: true`);
行列表595.push(` client-fingerprint: ${处理本地值622(数量值596.fp || 'chrome')}`);
}
if (数量值596.tls) {
行列表595.push(` servername: ${处理本地值622(服务名称指示592)}`);
if (数量值596.alpn && 数量值596.alpn.length) {
行列表595.push(` alpn: [${数量值596.alpn.map(甲值591 => 处理本地值622(甲值591)).join(', ')}]`);
}
行列表595.push(` skip-cert-verify: false`);
}
if (数量值596.network === 'ws' || 数量值596.network === 'xhttp') {
行列表595.push(` network: ws`);
行列表595.push(` ws-opts:`);
行列表595.push(` path: ${处理本地值622(数量值596.path)}`);
行列表595.push(` headers:`);
行列表595.push(` Host: ${处理本地值622(主机593)}`);
} else if (数量值596.network === 'grpc') {
行列表595.push(` network: grpc`);
行列表595.push(` grpc-opts:`);
行列表595.push(` grpc-service-name: ${处理本地值622(数量值596.path)}`);
}
if (数量值596.ech) {
const 加密客户端问候域名590 = 自定义加密客户端问候域名 || 'cloudflare-ech.com';
行列表595.push(` ech-opts:`);
行列表595.push(` enable: true`);
行列表595.push(` query-server-name: ${处理本地值622(加密客户端问候域名590)}`);
}
return 行列表595.join('\n');
}
// 内部生成 Clash YAML(完整规则集:Loyalsoldier rule-providers)
function 生成值值589(链接列表588, 本地值587 = {}) {
const 节点列表586 = 链接列表588.map(解析值链接).filter(数量值585 => 数量值585 && (数量值585.proto === 解码64('dmxlc3M=') || 数量值585.proto === 解码64('dHJvamFu')));
const 名称列表584 = 节点列表586.map(数量值583 => 数量值583.name);
const 域名系统值582 = 自定义域名系统 || 'https://223.5.5.5/dns-query';
const 头部581 = ['mixed-port: 7890', 'allow-lan: true', 'mode: rule', 'log-level: info', 'ipv6: true', 'external-controller: 127.0.0.1:9090', 'unified-delay: true', 'tcp-concurrent: true', 'geodata-mode: true', 'geo-auto-update: true', 'geo-update-interval: 24', 'geox-url:', ' geoip: "https://fastly.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@release/geoip.dat"', ' geosite: "https://fastly.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@release/geosite.dat"', ' mmdb: "https://fastly.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@release/country.mmdb"', ' asn: "https://fastly.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@release/GeoLite2-ASN.mmdb"', 'sniffer:', ' enable: true', ' force-dns-mapping: true', ' parse-pure-ip: true', ' sniff:', ' HTTP:', ' ports: [80, 8080-8880]', ' override-destination: true', ' TLS:', ' ports: [443, 8443]', ' QUIC:', ' ports: [443, 8443]', 'dns:', ' enable: true', ' listen: 0.0.0.0:1053', ' ipv6: true', ' enhanced-mode: fake-ip', ' fake-ip-range: 198.18.0.1/16', ' fake-ip-filter:', ' - "*.lan"', ' - "+.local"', ' - "+.market.xiaomi.com"', ' - "+.msftconnecttest.com"', ' - "+.msftncsi.com"', ' - "localhost.ptlogin2.qq.com"', ' - "+.srv.nintendo.net"', ' - "+.stun.playstation.net"', ' - "+.xboxlive.com"', ' default-nameserver:', ' - 223.5.5.5', ' - 119.29.29.29', ' nameserver:', ` - ${域名系统值582}`, ' - https://119.29.29.29/dns-query', ' fallback:', ' - https://1.1.1.1/dns-query', ' - https://8.8.8.8/dns-query', ' fallback-filter:', ' geoip: true', ' geoip-code: CN', ' ipcidr:', ' - 240.0.0.0/4', ''];
const 值值580 = ['proxies:'];
for (const 数量值579 of 节点列表586) 值值580.push(构建值节点行(数量值579));
const 节点仅 = 名称列表584.length ? 名称列表584.map(数量值578 => ` - ${处理本地值622(数量值578)}`).join('\n') : ' - DIRECT';
const 值值577 = [解码64('cHJveHktZ3JvdXBzOg=='), ' - name: "🚀 节点选择"', ' type: select', ' proxies:', ' - "🎯 全球直连"', 节点仅, ' - name: "🌍 国外媒体"', ' type: select', ' proxies:', 处理值选择值(名称列表584), ' - name: "📺 哔哩哔哩"', ' type: select', ' proxies:', 处理值选择值(名称列表584, {
directFirst: true
}), ' - name: "📹 油管视频"', ' type: select', ' proxies:', 处理值选择值(名称列表584, {
extraGroups: ['🌍 国外媒体']
}), ' - name: "🎬 奈飞视频"', ' type: select', ' proxies:', 处理值选择值(名称列表584, {
extraGroups: ['🌍 国外媒体']
}), ' - name: "📲 电报信息"', ' type: select', ' proxies:', 处理值选择值(名称列表584), ' - name: "🌐 谷歌服务"', ' type: select', ' proxies:', 处理值选择值(名称列表584), ' - name: "🤖 OpenAI"', ' type: select', ' proxies:', 处理值选择值(名称列表584), ' - name: "Ⓜ️ 微软服务"', ' type: select', ' proxies:', 处理值选择值(名称列表584, {
directFirst: true
}), ' - name: "🍎 苹果服务"', ' type: select', ' proxies:', 处理值选择值(名称列表584, {
directFirst: true
}), ' - name: "🎯 全球直连"', ' type: select', ' proxies:', ' - DIRECT', ' - name: "🛑 全球拦截"', ' type: select', ' proxies:', ' - REJECT', ' - DIRECT', ' - name: "🍃 应用净化"', ' type: select', ' proxies:', ' - REJECT', ' - DIRECT', ' - name: "🐟 漏网之鱼"', ' type: select', ' proxies:', 处理值选择值(名称列表584), ''];
// Loyalsoldier 规则源 - CDN: jsDelivr
const 值基础576 = 解码64('aHR0cHM6Ly9mYXN0bHkuanNkZWxpdnIubmV0L2doL0xveWFsc29sZGllci9jbGFzaC1ydWxlc0ByZWxlYXNl');
const 提供器 = (名称575, 本地值574) => [` ${名称575}:`, ` type: http`, ` behavior: ${本地值574}`, ` url: "${值基础576}/${名称575}.txt"`, ` path: ./rulesets/loyalsoldier/${名称575}.txt`, ` interval: 86400`].join('\n');
const 规则值 = ['rule-providers:', 提供器('reject', 'domain'), 提供器('icloud', 'domain'), 提供器('apple', 'domain'), 提供器('google', 'domain'), 提供器(解码64('cHJveHk='), 'domain'), 提供器('direct', 'domain'), 提供器('private', 'domain'), 提供器('gfw', 'domain'), 提供器('greatfire', 'domain'), 提供器('tld-not-cn', 'domain'), 提供器('telegramcidr', 'ipcidr'), 提供器('cncidr', 'ipcidr'), 提供器('lancidr', 'ipcidr'), 提供器('applications', 'classical'), ''];
const 规则列表 = ['rules:', ' - DOMAIN-SUFFIX,acl4.ssr,🎯 全球直连', ' - DOMAIN-SUFFIX,local,🎯 全球直连', 解码64('ICAtIERPTUFJTixjbGFzaC5yYXpvcmQudG9wLPCfjq8g5YWo55CD55u06L+e'), ' - DOMAIN,yacd.haishan.me,🎯 全球直连', ' - DOMAIN,yacd.metacubex.one,🎯 全球直连', ' - DOMAIN,d.metacubex.one,🎯 全球直连', ' - DOMAIN-SUFFIX,googleapis.cn,🌐 谷歌服务', ' - DOMAIN-SUFFIX,gstatic.com,🌐 谷歌服务', ' - DOMAIN-SUFFIX,xn--ngstr-lra8j.com,🌐 谷歌服务', ' - DOMAIN-SUFFIX,googlevideo.com,📹 油管视频', ' - DOMAIN-SUFFIX,googleusercontent.com,🌐 谷歌服务', ' - DOMAIN-KEYWORD,youtube,📹 油管视频', ' - DOMAIN-SUFFIX,youtube.com,📹 油管视频', ' - DOMAIN-SUFFIX,youtu.be,📹 油管视频', ' - DOMAIN-KEYWORD,netflix,🎬 奈飞视频', ' - DOMAIN-SUFFIX,nflxext.com,🎬 奈飞视频', ' - DOMAIN-SUFFIX,nflxso.net,🎬 奈飞视频', ' - DOMAIN-SUFFIX,nflxvideo.net,🎬 奈飞视频', ' - DOMAIN-SUFFIX,nflximg.com,🎬 奈飞视频', ' - DOMAIN-SUFFIX,nflximg.net,🎬 奈飞视频', ' - DOMAIN-SUFFIX,netflix.com,🎬 奈飞视频', ' - DOMAIN-SUFFIX,netflix.net,🎬 奈飞视频', ' - DOMAIN-SUFFIX,bilibili.com,📺 哔哩哔哩', ' - DOMAIN-SUFFIX,bilivideo.com,📺 哔哩哔哩', ' - DOMAIN-SUFFIX,hdslb.com,📺 哔哩哔哩', ' - DOMAIN-KEYWORD,openai,🤖 OpenAI', ' - DOMAIN-KEYWORD,chatgpt,🤖 OpenAI', ' - DOMAIN-SUFFIX,openai.com,🤖 OpenAI', ' - DOMAIN-SUFFIX,chatgpt.com,🤖 OpenAI', ' - DOMAIN-SUFFIX,oaistatic.com,🤖 OpenAI', ' - DOMAIN-SUFFIX,oaiusercontent.com,🤖 OpenAI', ' - DOMAIN-SUFFIX,anthropic.com,🤖 OpenAI', ' - DOMAIN-SUFFIX,claude.ai,🤖 OpenAI', ' - DOMAIN-SUFFIX,perplexity.ai,🤖 OpenAI', ' - DOMAIN-SUFFIX,gemini.google.com,🤖 OpenAI', ' - RULE-SET,applications,🎯 全球直连', ' - RULE-SET,private,🎯 全球直连', ' - RULE-SET,reject,🛑 全球拦截', ' - RULE-SET,icloud,🍎 苹果服务', ' - RULE-SET,apple,🍎 苹果服务', ' - RULE-SET,google,🌐 谷歌服务', 解码64('ICAtIFJVTEUtU0VULHByb3h5LPCfmoAg6IqC54K56YCJ5oup'), ' - RULE-SET,gfw,🚀 节点选择', ' - RULE-SET,greatfire,🚀 节点选择', ' - RULE-SET,tld-not-cn,🚀 节点选择', ' - RULE-SET,direct,🎯 全球直连', ' - RULE-SET,lancidr,🎯 全球直连,no-resolve', ' - RULE-SET,cncidr,🎯 全球直连,no-resolve', ' - RULE-SET,telegramcidr,📲 电报信息,no-resolve', ' - GEOIP,LAN,🎯 全球直连,no-resolve', ' - GEOIP,CN,🎯 全球直连,no-resolve', ' - MATCH,🐟 漏网之鱼'];
return [头部581.join('\n'), 值值580.join('\n'), '', 值值577.join('\n'), 规则值.join('\n'), 规则列表.join('\n'), ''].join('\n');
}
// 内部生成 JSON 客户端配置(完整规则集:MetaCubeX 镜像)
function 生成值值数据对象(链接列表573) {
const 节点列表572 = 链接列表573.map(解析值链接).filter(数量值571 => 数量值571 && (数量值571.proto === 解码64('dmxlc3M=') || 数量值571.proto === 解码64('dHJvamFu')));
const 域名系统值570 = 自定义域名系统 || 'https://223.5.5.5/dns-query';
const 出站值 = 节点列表572.map(数量值569 => 数量值569.name);
function 处理节点值出站(数量值568) {
const 输出567 = {
type: 数量值568.proto,
tag: 数量值568.name,
server: 规范化值主机(数量值568.server),
server_port: 数量值568.port
};
if (数量值568.proto === 解码64('dmxlc3M=')) {
输出567.uuid = 数量值568.uuid;
if (数量值568.flow) 输出567.flow = 数量值568.flow;
} else {
输出567.password = 数量值568.password;
}
if (数量值568.tls) {
输出567.tls = {
enabled: true,
server_name: 数量值568.sni,
insecure: false,
utls: {
enabled: true,
fingerprint: 数量值568.fp || 'chrome'
}
};
if (数量值568.alpn && 数量值568.alpn.length) 输出567.tls.alpn = 数量值568.alpn;
if (数量值568.ech) {
输出567.tls.ech = {
enabled: true,
pq_signature_schemes_enabled: false,
dynamic_record_sizing_disabled: false
};
}
}
if (数量值568.network === 'ws' || 数量值568.network === 'xhttp') {
输出567.transport = {
type: 'ws',
path: 数量值568.path,
headers: {
Host: 数量值568.host
},
max_early_data: 2048,
early_data_header_name: 'Sec-WebSocket-Protocol'
};
} else if (数量值568.network === 'grpc') {
输出567.transport = {
type: 'grpc',
service_name: 数量值568.path
};
}
return 输出567;
}
// 远端 SRS 文件(CDN:jsDelivr 镜像 MetaCubeX 转换的 SagerNet 数据)
const 值基础值 = 'https://fastly.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@sing/geo/geosite';
const 值基础地址 = 'https://fastly.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@sing/geo/geoip';
const 值规则566 = 本地值565 => ({
tag: `geosite-${本地值565}`,
type: 'remote',
format: 'binary',
url: `${值基础值}/${本地值565}.srs`,
download_detour: 'direct'
});
const 地址规则 = 本地值564 => ({
tag: `geoip-${本地值564}`,
type: 'remote',
format: 'binary',
url: `${值基础地址}/${本地值564}.srs`,
download_detour: 'direct'
});
const 配置 = {
log: {
level: 'info',
timestamp: true
},
dns: {
servers: [{
tag: 'remote',
address: 域名系统值570,
detour: 'select'
}, {
tag: 'local',
address: '223.5.5.5',
detour: 'direct'
}, {
tag: 'fakeip',
address: 'fakeip'
}, {
tag: 'block',
address: 'rcode://success'
}],
rules: [{
outbound: 'any',
server: 'local'
}, {
rule_set: 'geosite-category-ads-all',
server: 'block'
}, {
rule_set: 'geosite-cn',
server: 'local'
}, {
query_type: ['A', 'AAAA'],
server: 'fakeip'
}],
fakeip: {
enabled: true,
inet4_range: '198.18.0.0/15',
inet6_range: 'fc00::/18'
},
independent_cache: true,
strategy: 'ipv4_only'
},
inbounds: [{
type: 'mixed',
tag: 'mixed-in',
listen: '127.0.0.1',
listen_port: 2080,
sniff: true,
sniff_override_destination: true
}, {
type: 'tun',
tag: 'tun-in',
interface_name: 解码64('c2luZy1ib3g='),
address: ['172.19.0.1/30', 'fdfe:dcba:9876::1/126'],
mtu: 9000,
auto_route: true,
strict_route: true,
stack: 'mixed',
sniff: true,
sniff_override_destination: true
}],
outbounds: [{
type: 'selector',
tag: 'select',
outbounds: ['direct', ...出站值],
default: 出站值[0] || 'direct'
}, {
type: 'selector',
tag: '🌍 国外媒体',
outbounds: ['select', 'direct', ...出站值]
}, {
type: 'selector',
tag: '📲 电报信息',
outbounds: ['select', 'direct', ...出站值]
}, {
type: 'selector',
tag: '🌐 谷歌服务',
outbounds: ['select', 'direct', ...出站值]
}, {
type: 'selector',
tag: '🤖 OpenAI',
outbounds: ['select', 'direct', ...出站值]
}, {
type: 'selector',
tag: 'Ⓜ️ 微软服务',
outbounds: ['direct', 'select', ...出站值]
}, {
type: 'selector',
tag: '🍎 苹果服务',
outbounds: ['direct', 'select', ...出站值]
}, {
type: 'selector',
tag: '📺 哔哩哔哩',
outbounds: ['direct', 'select', ...出站值]
}, {
type: 'selector',
tag: '📹 油管视频',
outbounds: ['select', '🌍 国外媒体', 'direct', ...出站值]
}, {
type: 'selector',
tag: '🎬 奈飞视频',
outbounds: ['select', '🌍 国外媒体', 'direct', ...出站值]
}, {
type: 'selector',
tag: '🎯 全球直连',
outbounds: ['direct']
}, {
type: 'selector',
tag: '🐟 漏网之鱼',
outbounds: ['select', 'direct', ...出站值]
}, ...节点列表572.map(处理节点值出站), {
type: 'direct',
tag: 'direct'
}, {
type: 'block',
tag: 'block'
}, {
type: 'dns',
tag: 'dns-out'
}],
route: {
rule_set: [值规则566('cn'), 值规则566('private'), 值规则566('apple'), 值规则566('apple-cn'), 值规则566('microsoft'), 值规则566('microsoft@cn'), 值规则566('google'), 值规则566('telegram'), 值规则566('openai'), 值规则566('anthropic'), 值规则566('youtube'), 值规则566('netflix'), 值规则566('disney'), 值规则566('spotify'), 值规则566('tiktok'), 值规则566('twitter'), 值规则566('facebook'), 值规则566('github'), 值规则566('geolocation-!cn'), 值规则566('category-ads-all'), 地址规则('cn'), 地址规则('private'), 地址规则('telegram')],
rules: [{
protocol: 'dns',
outbound: 'dns-out'
}, {
ip_is_private: true,
outbound: 'direct'
}, {
rule_set: 'geosite-category-ads-all',
outbound: 'block'
}, {
rule_set: 'geosite-private',
outbound: 'direct'
}, {
rule_set: 'geosite-apple-cn',
outbound: 'direct'
}, {
rule_set: 'geosite-microsoft@cn',
outbound: 'direct'
}, {
rule_set: 'geosite-apple',
outbound: '🍎 苹果服务'
}, {
rule_set: 'geosite-microsoft',
outbound: 'Ⓜ️ 微软服务'
}, {
rule_set: 'geosite-openai',
outbound: '🤖 OpenAI'
}, {
rule_set: 'geosite-anthropic',
outbound: '🤖 OpenAI'
}, {
rule_set: 'geosite-telegram',
outbound: '📲 电报信息'
}, {
rule_set: 'geoip-telegram',
outbound: '📲 电报信息'
}, {
rule_set: 'geosite-google',
outbound: '🌐 谷歌服务'
}, {
rule_set: 'geosite-youtube',
outbound: '🌍 国外媒体'
}, {
rule_set: 'geosite-netflix',
outbound: '🌍 国外媒体'
}, {
rule_set: 'geosite-disney',
outbound: '🌍 国外媒体'
}, {
rule_set: 'geosite-spotify',
outbound: '🌍 国外媒体'
}, {
rule_set: 'geosite-tiktok',
outbound: '🌍 国外媒体'
}, {
rule_set: 'geosite-twitter',
outbound: '🌍 国外媒体'
}, {
rule_set: 'geosite-facebook',
outbound: '🌍 国外媒体'
}, {
rule_set: 'geosite-github',
outbound: 'select'
}, {
rule_set: 'geosite-geolocation-!cn',
outbound: 'select'
}, {
rule_set: 'geosite-cn',
outbound: 'direct'
}, {
rule_set: 'geoip-cn',
outbound: 'direct'
}, {
ip_is_private: true,
outbound: 'direct'
}],
final: '🐟 漏网之鱼',
auto_detect_interface: true
},
experimental: {
cache_file: {
enabled: true,
store_fakeip: true
},
clash_api: {
external_controller: '127.0.0.1:9090'
}
}
};
return JSON.stringify(配置, null, 2);
}
// ACL4SSR 规则源(CDN:jsDelivr 镜像 GitHub)
const 值基础 = 解码64('aHR0cHM6Ly9mYXN0bHkuanNkZWxpdnIubmV0L2doL0FDTDRTU1IvQUNMNFNTUkBtYXN0ZXIvQ2xhc2g=');
const 值规则 = 名称563 => `${值基础}/${名称563}.list`;
// 内部生成 ini 客户端配置(完整 ACL4SSR 规则集)
function 生成值值562(链接列表561) {
const 节点列表560 = 链接列表561.map(解析值链接).filter(数量值559 => 数量值559 && 数量值559.proto === 解码64('dHJvamFu'));
const 域名系统值558 = 自定义域名系统 || '223.5.5.5';
const 名称列表557 = 节点列表560.map(数量值556 => 数量值556.name);
const 行列表555 = ['[General]', 'loglevel = notify', 'internet-test-url = http://www.apple.com/library/test/success.html', 解码64('cHJveHktdGVzdC11cmwgPSBodHRwOi8vd3d3LmdzdGF0aWMuY29tL2dlbmVyYXRlXzIwNA=='), 'test-timeout = 3', `dns-server = ${域名系统值558.replace(/^https?:\/\//, '').replace(/\/.*$/, '')}, 119.29.29.29, system`, 'encrypted-dns-server = https://223.5.5.5/dns-query, https://1.12.12.12/dns-query', 'ipv6 = true', 'allow-wifi-access = false', 'wifi-access-http-port = 6152', 解码64('d2lmaS1hY2Nlc3Mtc29ja3M1LXBvcnQgPSA2MTUz'), 解码64('c2tpcC1wcm94eSA9IDEyNy4wLjAuMSwgMTkyLjE2OC4wLjAvMTYsIDEwLjAuMC4wLzgsIDE3Mi4xNi4wLjAvMTIsIGxvY2FsaG9zdCwgKi5sb2NhbCwgY2FwdGl2ZS5hcHBsZS5jb20='), 'exclude-simple-hostnames = true', 'show-error-page-for-reject = true', '', 解码64('W1Byb3h5XQ==')];
for (const 数量值554 of 节点列表560) {
const 服务名称指示 = 数量值554.sni;
行列表555.push(`${数量值554.name} = ${解码64('dHJvamFu')}, ${数量值554.server}, ${数量值554.port}, password=${数量值554.password}, sni=${服务名称指示}, ws=true, ws-path=${数量值554.path}, ws-headers=Host:${数量值554.host}, skip-cert-verify=false, tfo=true`);
}
if (!节点列表560.length) {
行列表555.push('Direct = direct');
}
行列表555.push('');
行列表555.push(解码64('W1Byb3h5IEdyb3VwXQ=='));
const 列表553 = 名称列表557.length ? 名称列表557.join(', ') : 'DIRECT';
行列表555.push(`🚀 节点选择 = select, 🎯 全球直连, ${列表553}`);
行列表555.push(`🌍 国外媒体 = select, ${处理值值列表(名称列表557)}`);
行列表555.push(`📺 哔哩哔哩 = select, ${处理值值列表(名称列表557, {
directFirst: true
})}`);
行列表555.push(`📹 油管视频 = select, ${处理值值列表(名称列表557, {
extraGroups: ['🌍 国外媒体']
})}`);
行列表555.push(`🎬 奈飞视频 = select, ${处理值值列表(名称列表557, {
extraGroups: ['🌍 国外媒体']
})}`);
行列表555.push(`📲 电报信息 = select, ${处理值值列表(名称列表557)}`);
行列表555.push(`🌐 谷歌服务 = select, ${处理值值列表(名称列表557)}`);
行列表555.push(`🤖 OpenAI = select, ${处理值值列表(名称列表557)}`);
行列表555.push(`Ⓜ️ 微软服务 = select, ${处理值值列表(名称列表557, {
directFirst: true
})}`);
行列表555.push(`🍎 苹果服务 = select, ${处理值值列表(名称列表557, {
directFirst: true
})}`);
行列表555.push(`🎯 全球直连 = select, DIRECT`);
行列表555.push(`🛑 全球拦截 = select, REJECT, DIRECT`);
行列表555.push(`🐟 漏网之鱼 = select, ${处理值值列表(名称列表557)}`);
行列表555.push('');
行列表555.push('[Rule]');
行列表555.push(`RULE-SET,${值规则('LocalAreaNetwork')},🎯 全球直连`);
行列表555.push(`RULE-SET,${值规则('UnBan')},🎯 全球直连`);
行列表555.push(`RULE-SET,${值规则('BanAD')},🛑 全球拦截`);
行列表555.push(`RULE-SET,${值规则('BanProgramAD')},🛑 全球拦截`);
行列表555.push(`RULE-SET,${值规则('GoogleFCM')},🌐 谷歌服务`);
行列表555.push(`RULE-SET,${值规则('GoogleCN')},🎯 全球直连`);
行列表555.push(`RULE-SET,${值规则('SteamCN')},🎯 全球直连`);
行列表555.push(`RULE-SET,${值规则('Microsoft')},Ⓜ️ 微软服务`);
行列表555.push(`RULE-SET,${值规则('Apple')},🍎 苹果服务`);
行列表555.push(`RULE-SET,${值规则('Telegram')},📲 电报信息`);
行列表555.push(`RULE-SET,${值规则('OpenAi')},🤖 OpenAI`);
行列表555.push(`RULE-SET,${值规则('Claude')},🤖 OpenAI`);
行列表555.push(`RULE-SET,${值规则('Copilot')},🤖 OpenAI`);
行列表555.push(`RULE-SET,${值规则('Netflix')},🌍 国外媒体`);
行列表555.push(`RULE-SET,${值规则('YouTube')},🌍 国外媒体`);
行列表555.push(`RULE-SET,${值规则('Disney')},🌍 国外媒体`);
行列表555.push(`RULE-SET,${值规则('Spotify')},🌍 国外媒体`);
行列表555.push(`RULE-SET,${值规则('TikTok')},🌍 国外媒体`);
行列表555.push(`RULE-SET,${值规则('BiliBili')},📺 哔哩哔哩`);
行列表555.push(`RULE-SET,${值规则(解码64('UHJveHlNZWRpYQ=='))},🌍 国外媒体`);
行列表555.push(`RULE-SET,${值规则(解码64('UHJveHlHRldsaXN0'))},🚀 节点选择`);
行列表555.push(`RULE-SET,${值规则('ChinaDomain')},🎯 全球直连`);
行列表555.push(`RULE-SET,${值规则('ChinaCompanyIp')},🎯 全球直连`);
行列表555.push(`RULE-SET,${值规则('ChinaIp')},🎯 全球直连`);
行列表555.push('GEOIP,CN,🎯 全球直连');
行列表555.push('FINAL,🐟 漏网之鱼,dns-failed');
return 行列表555.join('\n');
}
// 内部生成另一类 ini 客户端配置
function 生成值值552(链接列表551) {
const 节点列表550 = 链接列表551.map(解析值链接).filter(数量值549 => 数量值549 && (数量值549.proto === 解码64('dmxlc3M=') || 数量值549.proto === 解码64('dHJvamFu')));
const 名称列表548 = 节点列表550.map(数量值547 => 数量值547.name);
const 行列表546 = ['[General]', 'ip-mode = dual', `dns-server = ${(自定义域名系统 || '223.5.5.5').replace(/^https?:\/\//, '').replace(/\/.*$/, '')},119.29.29.29,system`, 'doh-server = https://223.5.5.5/dns-query, https://1.12.12.12/dns-query', 解码64('YWxsb3ctdWRwLXByb3h5ID0gdHJ1ZQ=='), 'allow-wifi-access = false', 'sni-sniffing = true', 解码64('c2tpcC1wcm94eSA9IDEyNy4wLjAuMSwxOTIuMTY4LjAuMC8xNiwxMC4wLjAuMC84LDE3Mi4xNi4wLjAvMTIsbG9jYWxob3N0LCoubG9jYWwsY2FwdGl2ZS5hcHBsZS5jb20='), 'bypass-tun = 10.0.0.0/8,100.64.0.0/10,127.0.0.0/8,169.254.0.0/16,172.16.0.0/12,192.0.0.0/24,192.0.2.0/24,192.88.99.0/24,192.168.0.0/16,198.51.100.0/24,203.0.113.0/24,224.0.0.0/4,255.255.255.255/32', '', 解码64('W1Byb3h5XQ==')];
for (const 数量值545 of 节点列表550) {
if (数量值545.proto === 解码64('dmxlc3M=')) {
const 部分列表544 = [`${数量值545.server}`, `${数量值545.port}`, `udp=true`, `username=${数量值545.uuid}`, `transport=ws`, `path=${数量值545.path}`, `host=${数量值545.host}`, `over-tls=${数量值545.tls ? 'true' : 'false'}`];
if (数量值545.tls) {
部分列表544.push(`tls-name=${数量值545.sni}`);
if (数量值545.alpn && 数量值545.alpn.length) 部分列表544.push(`alpn=${数量值545.alpn.join(':')}`);
部分列表544.push(`skip-cert-verify=false`);
}
行列表546.push(`${数量值545.name} = ${解码64('dmxlc3M=')},${部分列表544.join(',')}`);
} else {
const 部分列表543 = [`${数量值545.server}`, `${数量值545.port}`, `password=${数量值545.password}`, `transport=ws`, `path=${数量值545.path}`, `host=${数量值545.host}`, `over-tls=true`, `tls-name=${数量值545.sni}`];
if (数量值545.alpn && 数量值545.alpn.length) 部分列表543.push(`alpn=${数量值545.alpn.join(':')}`);
部分列表543.push(`skip-cert-verify=false`);
行列表546.push(`${数量值545.name} = ${解码64('dHJvamFu')},${部分列表543.join(',')}`);
}
}
行列表546.push('');
行列表546.push(解码64('W1Byb3h5IEdyb3VwXQ=='));
const 列表542 = 名称列表548.length ? 名称列表548.join(',') : 'DIRECT';
行列表546.push(`🚀 节点选择 = select,🎯 全球直连,${列表542}`);
行列表546.push(`🌍 国外媒体 = select,${处理值值列表(名称列表548, {
compact: true
})}`);
行列表546.push(`📺 哔哩哔哩 = select,${处理值值列表(名称列表548, {
directFirst: true,
compact: true
})}`);
行列表546.push(`📹 油管视频 = select,${处理值值列表(名称列表548, {
extraGroups: ['🌍 国外媒体'],
compact: true
})}`);
行列表546.push(`🎬 奈飞视频 = select,${处理值值列表(名称列表548, {
extraGroups: ['🌍 国外媒体'],
compact: true
})}`);
行列表546.push(`📲 电报信息 = select,${处理值值列表(名称列表548, {
compact: true
})}`);
行列表546.push(`🌐 谷歌服务 = select,${处理值值列表(名称列表548, {
compact: true
})}`);
行列表546.push(`🤖 OpenAI = select,${处理值值列表(名称列表548, {
compact: true
})}`);
行列表546.push(`Ⓜ️ 微软服务 = select,${处理值值列表(名称列表548, {
directFirst: true,
compact: true
})}`);
行列表546.push(`🍎 苹果服务 = select,${处理值值列表(名称列表548, {
directFirst: true,
compact: true
})}`);
行列表546.push(`🎯 全球直连 = select,DIRECT`);
行列表546.push(`🛑 全球拦截 = select,REJECT,DIRECT`);
行列表546.push(`🐟 漏网之鱼 = select,${处理值值列表(名称列表548, {
compact: true
})}`);
行列表546.push('');
行列表546.push('[Remote Rule]');
行列表546.push(`${值规则('LocalAreaNetwork')}, policy=🎯 全球直连, tag=局域网, enabled=true`);
行列表546.push(`${值规则('BanAD')}, policy=🛑 全球拦截, tag=广告拦截, enabled=true`);
行列表546.push(`${值规则('BanProgramAD')}, policy=🛑 全球拦截, tag=应用广告, enabled=true`);
行列表546.push(`${值规则('GoogleCN')}, policy=🎯 全球直连, tag=GoogleCN, enabled=true`);
行列表546.push(`${值规则('SteamCN')}, policy=🎯 全球直连, tag=SteamCN, enabled=true`);
行列表546.push(`${值规则('Microsoft')}, policy=Ⓜ️ 微软服务, tag=微软, enabled=true`);
行列表546.push(`${值规则('Apple')}, policy=🍎 苹果服务, tag=苹果, enabled=true`);
行列表546.push(`${值规则('Telegram')}, policy=📲 电报信息, tag=电报, enabled=true`);
行列表546.push(`${值规则('OpenAi')}, policy=🤖 OpenAI, tag=OpenAI, enabled=true`);
行列表546.push(`${值规则('Netflix')}, policy=🌍 国外媒体, tag=Netflix, enabled=true`);
行列表546.push(`${值规则('YouTube')}, policy=🌍 国外媒体, tag=YouTube, enabled=true`);
行列表546.push(`${值规则('Disney')}, policy=🌍 国外媒体, tag=Disney, enabled=true`);
行列表546.push(`${值规则('Spotify')}, policy=🌍 国外媒体, tag=Spotify, enabled=true`);
行列表546.push(`${值规则('TikTok')}, policy=🌍 国外媒体, tag=TikTok, enabled=true`);
行列表546.push(`${值规则('BiliBili')}, policy=📺 哔哩哔哩, tag=哔哩哔哩, enabled=true`);
行列表546.push(`${值规则(解码64('UHJveHlNZWRpYQ=='))}, policy=🌍 国外媒体, tag=${解码64('5Luj55CG5aqS5L2T')}, enabled=true`);
行列表546.push(`${值规则(解码64('UHJveHlHRldsaXN0'))}, policy=🚀 节点选择, tag=${解码64('5Luj55CG5YiX6KGo')}, enabled=true`);
行列表546.push(`${值规则('ChinaDomain')}, policy=🎯 全球直连, tag=中国域名, enabled=true`);
行列表546.push(`${值规则('ChinaIp')}, policy=🎯 全球直连, tag=中国IP, enabled=true`);
行列表546.push('');
行列表546.push('[Rule]');
行列表546.push('GEOIP,CN,🎯 全球直连');
行列表546.push('FINAL,🐟 漏网之鱼');
return 行列表546.join('\n');
}
// 内部生成圈叉配置(完整 ACL4SSR 远端 filter 资源)
function 生成值值(链接列表541) {
const 节点列表 = 链接列表541.map(解析值链接).filter(数量值540 => 数量值540 && (数量值540.proto === 解码64('dmxlc3M=') || 数量值540.proto === 解码64('dHJvamFu')));
const 名称列表 = 节点列表.map(数量值539 => 数量值539.name);
const 圈叉基础配置 = 解码64('aHR0cHM6Ly9mYXN0bHkuanNkZWxpdnIubmV0L2doL2JsYWNrbWF0cml4Ny9pb3NfcnVsZV9zY3JpcHRAbWFzdGVyL3J1bGUvUXVhbnR1bXVsdFg=');
const 行列表538 = ['[general]', 'network_check_url=http://www.gstatic.com/generate_204', 'server_check_url=http://www.gstatic.com/generate_204', 'profile_img_url=https://fastly.jsdelivr.net/gh/byJoey/cfnew@main/snippets/logo.png', 'dns_exclusion_list=*.cmpassport.com, *.jegotrip.com.cn, *.icloud.com, *.icloud.com.cn, *.apple.com, *.weibo.com, *.qq.com', 'running_mode_trigger=filter', '', '[dns]', `server=${(自定义域名系统 || '223.5.5.5').replace(/^https?:\/\//, '').replace(/\/.*$/, '')}`, 'server=119.29.29.29', 'server=https://223.5.5.5/dns-query', 'server=https://1.12.12.12/dns-query', '', '[server_local]'];
for (const 数量值537 of 节点列表) {
if (数量值537.proto === 解码64('dmxlc3M=')) {
const 部分列表536 = [`${数量值537.server}:${数量值537.port}`, `method=none`, `password=${数量值537.uuid}`, `obfs=${数量值537.tls ? 'wss' : 'ws'}`, `obfs-host=${数量值537.host}`, `obfs-uri=${数量值537.path}`];
if (数量值537.tls) 部分列表536.push(`tls-verification=true`, `tls13=true`);
部分列表536.push(`tag=${数量值537.name}`);
行列表538.push(`${解码64('dmxlc3M=')}=${部分列表536.join(', ')}`);
} else {
const 部分列表535 = [`${数量值537.server}:${数量值537.port}`, `password=${数量值537.password}`, `over-tls=true`, `tls-host=${数量值537.sni}`, `obfs=wss`, `obfs-host=${数量值537.host}`, `obfs-uri=${数量值537.path}`, `tls-verification=true`, `tag=${数量值537.name}`];
行列表538.push(`${解码64('dHJvamFu')}=${部分列表535.join(', ')}`);
}
}
行列表538.push('');
行列表538.push('[policy]');
const 列表534 = 名称列表.length ? 名称列表.join(', ') : 'direct';
行列表538.push(`static=🚀 节点选择, ${列表534}, direct, img-url=${解码64('aHR0cHM6Ly9mYXN0bHkuanNkZWxpdnIubmV0L2doL0tvb2xzb24vUXVyZUBtYXN0ZXIvSWNvblNldC9Db2xvci9Qcm94eS5wbmc=')}`);
行列表538.push(`static=🌍 国外媒体, ${处理值值列表(名称列表)}, img-url=https://fastly.jsdelivr.net/gh/Koolson/Qure@master/IconSet/Color/ForeignMedia.png`);
行列表538.push(`static=📺 哔哩哔哩, ${处理值值列表(名称列表, {
directFirst: true
})}, img-url=https://fastly.jsdelivr.net/gh/Koolson/Qure@master/IconSet/Color/bilibili.png`);
行列表538.push(`static=📹 油管视频, ${处理值值列表(名称列表, {
extraGroups: ['🌍 国外媒体']
})}, img-url=https://fastly.jsdelivr.net/gh/Koolson/Qure@master/IconSet/Color/YouTube.png`);
行列表538.push(`static=🎬 奈飞视频, ${处理值值列表(名称列表, {
extraGroups: ['🌍 国外媒体']
})}, img-url=https://fastly.jsdelivr.net/gh/Koolson/Qure@master/IconSet/Color/Netflix.png`);
行列表538.push(`static=📲 电报信息, ${处理值值列表(名称列表)}, img-url=https://fastly.jsdelivr.net/gh/Koolson/Qure@master/IconSet/Color/Telegram.png`);
行列表538.push(`static=🌐 谷歌服务, ${处理值值列表(名称列表)}, img-url=https://fastly.jsdelivr.net/gh/Koolson/Qure@master/IconSet/Color/Google.png`);
行列表538.push(`static=🤖 OpenAI, ${处理值值列表(名称列表)}, img-url=https://fastly.jsdelivr.net/gh/Koolson/Qure@master/IconSet/Color/ChatGPT.png`);
行列表538.push(`static=Ⓜ️ 微软服务, ${处理值值列表(名称列表, {
directFirst: true
})}, img-url=https://fastly.jsdelivr.net/gh/Koolson/Qure@master/IconSet/Color/Microsoft.png`);
行列表538.push(`static=🍎 苹果服务, ${处理值值列表(名称列表, {
directFirst: true
})}, img-url=https://fastly.jsdelivr.net/gh/Koolson/Qure@master/IconSet/Color/Apple.png`);
行列表538.push(`static=🎯 全球直连, direct, img-url=https://fastly.jsdelivr.net/gh/Koolson/Qure@master/IconSet/Color/Direct.png`);
行列表538.push(`static=🛑 全球拦截, reject, direct, img-url=https://fastly.jsdelivr.net/gh/Koolson/Qure@master/IconSet/Color/Advertising.png`);
行列表538.push(`static=🐟 漏网之鱼, ${处理值值列表(名称列表)}, img-url=https://fastly.jsdelivr.net/gh/Koolson/Qure@master/IconSet/Color/Final.png`);
行列表538.push('');
行列表538.push('[filter_remote]');
行列表538.push(`${圈叉基础配置}/Lan/Lan.list, tag=局域网, force-policy=🎯 全球直连, update-interval=86400, opt-parser=false, enabled=true`);
行列表538.push(`${圈叉基础配置}/Advertising/Advertising.list, tag=广告拦截, force-policy=🛑 全球拦截, update-interval=86400, opt-parser=false, enabled=true`);
行列表538.push(`${圈叉基础配置}/Microsoft/Microsoft.list, tag=微软, force-policy=Ⓜ️ 微软服务, update-interval=86400, opt-parser=false, enabled=true`);
行列表538.push(`${圈叉基础配置}/Apple/Apple.list, tag=苹果, force-policy=🍎 苹果服务, update-interval=86400, opt-parser=false, enabled=true`);
行列表538.push(`${圈叉基础配置}/Telegram/Telegram.list, tag=电报, force-policy=📲 电报信息, update-interval=86400, opt-parser=false, enabled=true`);
行列表538.push(`${圈叉基础配置}/Google/Google.list, tag=谷歌, force-policy=🌐 谷歌服务, update-interval=86400, opt-parser=false, enabled=true`);
行列表538.push(`${圈叉基础配置}/OpenAI/OpenAI.list, tag=OpenAI, force-policy=🤖 OpenAI, update-interval=86400, opt-parser=false, enabled=true`);
行列表538.push(`${圈叉基础配置}/Claude/Claude.list, tag=Claude, force-policy=🤖 OpenAI, update-interval=86400, opt-parser=false, enabled=true`);
行列表538.push(`${圈叉基础配置}/YouTube/YouTube.list, tag=YouTube, force-policy=🌍 国外媒体, update-interval=86400, opt-parser=false, enabled=true`);
行列表538.push(`${圈叉基础配置}/Netflix/Netflix.list, tag=Netflix, force-policy=🌍 国外媒体, update-interval=86400, opt-parser=false, enabled=true`);
行列表538.push(`${圈叉基础配置}/Disney/Disney.list, tag=Disney, force-policy=🌍 国外媒体, update-interval=86400, opt-parser=false, enabled=true`);
行列表538.push(`${圈叉基础配置}/Spotify/Spotify.list, tag=Spotify, force-policy=🌍 国外媒体, update-interval=86400, opt-parser=false, enabled=true`);
行列表538.push(`${圈叉基础配置}/TikTok/TikTok.list, tag=TikTok, force-policy=🌍 国外媒体, update-interval=86400, opt-parser=false, enabled=true`);
行列表538.push(`${圈叉基础配置}/BiliBili/BiliBili.list, tag=哔哩哔哩, force-policy=📺 哔哩哔哩, update-interval=86400, opt-parser=false, enabled=true`);
行列表538.push(`${圈叉基础配置}/Global/Global.list, tag=全球加速, force-policy=🚀 节点选择, update-interval=86400, opt-parser=false, enabled=true`);
行列表538.push(`${圈叉基础配置}/ChinaMax/ChinaMax.list, tag=中国直连, force-policy=🎯 全球直连, update-interval=86400, opt-parser=false, enabled=true`);
行列表538.push('');
行列表538.push('[filter_local]');
行列表538.push('geoip, cn, 🎯 全球直连');
行列表538.push('final, 🐟 漏网之鱼');
return 行列表538.join('\n');
}
// 兼容旧调用名
async function 生成值配置533(链接列表532) {
return 生成值值589(链接列表532);
}
function 生成值配置531(链接列表530) {
return 生成值值562(链接列表530);
}
function 生成值配置529(链接列表528) {
return 生成值值552(链接列表528);
}
function 生成值值配置527(链接列表526) {
return 生成值值(链接列表526);
}
function 生成值值配置(链接列表525) {
return 生成值值数据对象(链接列表525);
}
function 生成值配置(链接列表524) {
return btoa(链接列表524.join('\n'));
}
function 生成值2值配置(链接列表523) {
return btoa(链接列表523.join('\n'));
}
// 全局变量存储ECH调试信息
let 加密客户端问候调试值 = '';
async function 获取加密客户端问候配置(域名522) {
if (!启用加密客户端问候) {
加密客户端问候调试值 = 'ECH功能已禁用';
return null;
}
加密客户端问候调试值 = '';
const 调试步骤 = [];
try {
// 优先使用 Google DNS 查询 cloudflare-ech.com 的 ECH 配置
调试步骤.push('尝试使用 Google DNS 查询 cloudflare-ech.com...');
const 加密客户端问候域名网址 = `https://v.recipes/dns/dns.google/dns-query?name=cloudflare-ech.com&type=65`;
const 加密客户端问候响应 = await fetch(加密客户端问候域名网址, {
headers: {
'Accept': 'application/json'
}
});
调试步骤.push(`Google DNS 响应状态: ${加密客户端问候响应.status}`);
if (加密客户端问候响应.ok) {
const 加密客户端问候数据 = await 加密客户端问候响应.json();
调试步骤.push(`Google DNS 返回数据: ${JSON.stringify(加密客户端问候数据).substring(0, 200)}...`);
if (加密客户端问候数据.Answer && 加密客户端问候数据.Answer.length > 0) {
调试步骤.push(`找到 ${加密客户端问候数据.Answer.length} 条答案记录`);
for (const 本地值521 of 加密客户端问候数据.Answer) {
if (本地值521.data) {
调试步骤.push(`解析答案数据: ${typeof 本地值521.data}, 长度: ${String(本地值521.data).length}`);
// Google DNS 返回的数据格式可能不同,需要解析
const 数据字符串520 = typeof 本地值521.data === 'string' ? 本地值521.data : JSON.stringify(本地值521.data);
const 加密客户端问候值519 = 数据字符串520.match(/ech=([^\s"']+)/);
if (加密客户端问候值519 && 加密客户端问候值519[1]) {
加密客户端问候调试值 = 调试步骤.join('\\n') + '\\n✅ 成功从 Google DNS 获取 ECH 配置';
return 加密客户端问候值519[1];
}
// 如果没有找到,尝试直接使用 data(可能是 base64 编码的)
if (本地值521.data && !数据字符串520.includes('ech=')) {
try {
const 已解码518 = atob(本地值521.data);
调试步骤.push(`尝试 base64 解码,解码后长度: ${已解码518.length}`);
const 已解码值517 = 已解码518.match(/ech=([^\s"']+)/);
if (已解码值517 && 已解码值517[1]) {
加密客户端问候调试值 = 调试步骤.join('\\n') + '\\n✅ 成功从 Google DNS (base64解码) 获取 ECH 配置';
return 已解码值517[1];
}
} catch (事件值516) {
调试步骤.push(`base64 解码失败: ${事件值516.message}`);
}
}
}
}
} else {
调试步骤.push('Google DNS 未返回答案记录');
}
} else {
调试步骤.push(`Google DNS 请求失败: ${加密客户端问候响应.status}`);
}
// 如果 cloudflare-ech.com 查询失败,尝试使用 Google DNS 查询目标域名的 HTTPS 记录
调试步骤.push(`尝试使用 Google DNS 查询目标域名 ${域名522}...`);
const 加密域名查询网址 = `https://v.recipes/dns/dns.google/dns-query?name=${encodeURIComponent(域名522)}&type=65`;
const 响应515 = await fetch(加密域名查询网址, {
headers: {
'Accept': 'application/json'
}
});
调试步骤.push(`Google DNS (目标域名) 响应状态: ${响应515.status}`);
if (响应515.ok) {
const 数据514 = await 响应515.json();
调试步骤.push(`Google DNS (目标域名) 返回数据: ${JSON.stringify(数据514).substring(0, 200)}...`);
if (数据514.Answer && 数据514.Answer.length > 0) {
调试步骤.push(`找到 ${数据514.Answer.length} 条答案记录`);
for (const 本地值513 of 数据514.Answer) {
if (本地值513.data) {
const 数据字符串 = typeof 本地值513.data === 'string' ? 本地值513.data : JSON.stringify(本地值513.data);
const 加密客户端问候值512 = 数据字符串.match(/ech=([^\s"']+)/);
if (加密客户端问候值512 && 加密客户端问候值512[1]) {
加密客户端问候调试值 = 调试步骤.join('\\n') + '\\n✅ 成功从 Google DNS (目标域名) 获取 ECH 配置';
return 加密客户端问候值512[1];
}
// 尝试 base64 解码
try {
const 已解码511 = atob(本地值513.data);
const 已解码值 = 已解码511.match(/ech=([^\s"']+)/);
if (已解码值 && 已解码值[1]) {
加密客户端问候调试值 = 调试步骤.join('\\n') + '\\n✅ 成功从 Google DNS (目标域名, base64解码) 获取 ECH 配置';
return 已解码值[1];
}
} catch (事件值510) {
调试步骤.push(`base64 解码失败: ${事件值510.message}`);
}
}
}
} else {
调试步骤.push('Google DNS (目标域名) 未返回答案记录');
}
} else {
调试步骤.push(`Google DNS (目标域名) 请求失败: ${响应515.status}`);
}
// 如果 Google DNS 失败,尝试使用 Cloudflare DNS 作为备选
调试步骤.push('尝试使用 Cloudflare DNS 作为备选...');
const 云墙加密客户端问候网址 = `https://cloudflare-dns.com/dns-query?name=cloudflare-ech.com&type=65`;
const 云墙响应 = await fetch(云墙加密客户端问候网址, {
headers: {
'Accept': 'application/dns-json'
}
});
调试步骤.push(`Cloudflare DNS 响应状态: ${云墙响应.status}`);
if (云墙响应.ok) {
const 云墙数据 = await 云墙响应.json();
调试步骤.push(`Cloudflare DNS 返回数据: ${JSON.stringify(云墙数据).substring(0, 200)}...`);
if (云墙数据.Answer && 云墙数据.Answer.length > 0) {
调试步骤.push(`找到 ${云墙数据.Answer.length} 条答案记录`);
for (const 本地值509 of 云墙数据.Answer) {
if (本地值509.data) {
const 加密客户端问候值 = 本地值509.data.match(/ech=([^\s"']+)/);
if (加密客户端问候值 && 加密客户端问候值[1]) {
加密客户端问候调试值 = 调试步骤.join('\\n') + '\\n✅ 成功从 Cloudflare DNS 获取 ECH 配置';
return 加密客户端问候值[1];
}
}
}
} else {
调试步骤.push('Cloudflare DNS 未返回答案记录');
}
} else {
调试步骤.push(`Cloudflare DNS 请求失败: ${云墙响应.status}`);
}
加密客户端问候调试值 = 调试步骤.join('\\n') + '\\n❌ 所有DNS查询均失败,未获取到ECH配置';
return null;
} catch (错误508) {
加密客户端问候调试值 = 调试步骤.join('\\n') + '\\n❌ 获取ECH配置时发生错误: ' + 错误508.message;
return null;
}
}
async function 处理订阅请求(请求507, 用户506, 网址505 = null) {
if (!网址505) 网址505 = new URL(请求507.url);
const 最终链接列表 = [];
const 工作器域名504 = 网址505.hostname;
const 目标503 = 网址505.searchParams.get('target') || 'base64';
const 别名命名器502 = 创建值节点命名器(false);
// 如果启用了ECH,使用自定义值
let 加密客户端问候配置501 = null;
if (启用加密客户端问候) {
const 域名系统值500 = 自定义域名系统 || 'https://223.5.5.5/dns-query';
const 加密客户端问候域名499 = 自定义加密客户端问候域名 || 'cloudflare-ech.com';
加密客户端问候配置501 = `${加密客户端问候域名499}+${域名系统值500}`;
}
async function 添加节点列表来源列表(列表498) {
if (启用明文) {
最终链接列表.push(...生成链接列表来源源(列表498, 用户506, 工作器域名504, 加密客户端问候配置501, false, 别名命名器502));
}
if (启用木马) {
最终链接列表.push(...(await 生成木马链接列表来源源(列表498, 用户506, 工作器域名504, 加密客户端问候配置501, false, 别名命名器502)));
}
if (启用扩展传输) {
最终链接列表.push(...生成扩展超文本链接列表来源源(列表498, 用户506, 工作器域名504, 加密客户端问候配置501, false, 别名命名器502));
}
}
if (启用原生地址) {
if (当前工作器地区 === 'CUSTOM') {
const 原生列表497 = [{
ip: 工作器域名504,
isp: '原生地址'
}];
await 添加节点列表来源列表(原生列表497);
} else {
try {
const 原生列表496 = [{
ip: 工作器域名504,
isp: '原生地址'
}];
await 添加节点列表来源列表(原生列表496);
} catch (错误495) {
if (!当前工作器地区) {
当前工作器地区 = await 检测工作器地区(请求507);
}
const 值备用地址494 = await 获取值备用地址(当前工作器地区);
if (值备用地址494) {
回退地址 = 值备用地址494.domain + ':' + 值备用地址494.port;
const 备用列表493 = [{
ip: 值备用地址494.domain,
isp: 解码64('UHJveHlJUC0=') + 当前工作器地区
}];
await 添加节点列表来源列表(备用列表493);
} else {
const 原生列表 = [{
ip: 工作器域名504,
isp: '原生地址'
}];
await 添加节点列表来源列表(原生列表);
}
}
}
}
const 是否有自定义优选 = 自定义优选地址列表.length > 0 || 自定义优选域名列表.length > 0;
if (禁用优选) {} else if (是否有自定义优选) {
if (自定义优选地址列表.length > 0 && 启用优选地址) {
await 添加节点列表来源列表(自定义优选地址列表);
}
if (自定义优选域名列表.length > 0 && 启用优选域名) {
const 自定义域名列表 = 自定义优选域名列表.map(丁值492 => ({
ip: 丁值492.domain,
isp: 丁值492.name || 丁值492.domain
}));
await 添加节点列表来源列表(自定义域名列表);
}
} else {
if (启用优选域名) {
const 域名列表 = 直连域名列表.map(丁值491 => ({
ip: 丁值491.domain,
isp: 丁值491.name || 丁值491.domain
}));
await 添加节点列表来源列表(域名列表);
}
if (启用优选地址) {
if (!优选地址源) {
try {
const 值地址列表490 = await 获取值地址列表();
if (值地址列表490.length > 0) {
await 添加节点列表来源列表(值地址列表490);
}
} catch (错误489) {
if (!当前工作器地区) {
当前工作器地区 = await 检测工作器地区(请求507);
}
const 值备用地址488 = await 获取值备用地址(当前工作器地区);
if (值备用地址488) {
回退地址 = 值备用地址488.domain + ':' + 值备用地址488.port;
const 备用列表487 = [{
ip: 值备用地址488.domain,
isp: 解码64('UHJveHlJUC0=') + 当前工作器地区
}];
await 添加节点列表来源列表(备用列表487);
}
}
}
}
if (启用仓库优选) {
try {
const 新地址列表 = await 获取值解析新地址列表();
if (新地址列表.length > 0) {
if (启用明文) {
最终链接列表.push(...生成链接列表来源新地址列表(新地址列表, 用户506, 工作器域名504, 加密客户端问候配置501, false, 别名命名器502));
}
if (启用木马) {
最终链接列表.push(...(await 生成木马链接列表来源新地址列表(新地址列表, 用户506, 工作器域名504, 加密客户端问候配置501, false, 别名命名器502)));
}
if (启用扩展传输) {
最终链接列表.push(...生成扩展超文本链接列表来源源(新地址列表, 用户506, 工作器域名504, 加密客户端问候配置501, false, 别名命名器502));
}
}
} catch (错误486) {
if (!当前工作器地区) {
当前工作器地区 = await 检测工作器地区(请求507);
}
const 值备用地址485 = await 获取值备用地址(当前工作器地区);
if (值备用地址485) {
回退地址 = 值备用地址485.domain + ':' + 值备用地址485.port;
const 备用列表 = [{
ip: 值备用地址485.domain,
isp: 解码64('UHJveHlJUC0=') + 当前工作器地区
}];
await 添加节点列表来源列表(备用列表);
}
}
}
}
if (最终链接列表.length === 0) {
const 错误备注 = "所有节点获取失败";
const 协议484 = atob('dmxlc3M=');
const 错误链接 = `${协议484}://00000000-0000-0000-0000-000000000000@127.0.0.1:80?encryption=none&security=none&type=ws&host=error.com&path=%2F#${encodeURIComponent(错误备注)}`;
最终链接列表.push(错误链接);
}
let 订阅内容;
let 内容类型483 = 'text/plain; charset=utf-8';
switch (目标503.toLowerCase()) {
case atob('Y2xhc2g='):
case atob('Y2xhc2hy'):
case 解码64('c3Rhc2g='):
case 'meta':
case 解码64('Y2xhc2htZXRh'):
订阅内容 = 生成值值589(最终链接列表);
内容类型483 = 'text/yaml; charset=utf-8';
break;
case atob('c3VyZ2U='):
case atob('c3VyZ2Uy'):
case atob('c3VyZ2Uz'):
case atob('c3VyZ2U0'):
订阅内容 = 生成值值562(最终链接列表);
内容类型483 = 'text/plain; charset=utf-8';
break;
case atob('cXVhbnR1bXVsdA=='):
case atob('cXVhbng='):
case 解码64('cXVhbng='):
订阅内容 = 生成值值(最终链接列表);
内容类型483 = 'text/plain; charset=utf-8';
break;
case atob('c3M='):
case atob('c3Ny'):
订阅内容 = btoa(最终链接列表.join('\n'));
break;
case atob('djJyYXk='):
订阅内容 = btoa(最终链接列表.join('\n'));
break;
case atob('bG9vbg=='):
订阅内容 = 生成值值552(最终链接列表);
内容类型483 = 'text/plain; charset=utf-8';
break;
case atob('c2luZ2JveA=='):
case 解码64('c2luZy1ib3g='):
case 解码64('c2luZ2JveA=='):
订阅内容 = 生成值值数据对象(最终链接列表);
内容类型483 = 'application/json; charset=utf-8';
break;
default:
订阅内容 = btoa(最终链接列表.join('\n'));
}
const 响应头部列表 = {
'Content-Type': 内容类型483,
'Cache-Control': 'no-store, no-cache, must-revalidate, max-age=0'
};
// 添加ECH状态到响应头
if (启用加密客户端问候) {
响应头部列表['X-ECH-Status'] = 'ENABLED';
if (加密客户端问候配置501) {
响应头部列表['X-ECH-Config-Length'] = String(加密客户端问候配置501.length);
}
}
return new Response(订阅内容, {
headers: 响应头部列表
});
}
function 生成链接列表来源源(列表482, 用户481, 工作器域名480, 加密客户端问候配置479 = null, 跳过编号478 = false, 别名命名器477 = null) {
const 云墙超文本端口476 = [80, 8080, 8880, 2052, 2082, 2086, 2095];
const 云墙安全超文本端口475 = [443, 2053, 2083, 2087, 2096, 8443];
const 默认安全超文本值474 = [443];
const 默认超文本值473 = 禁用非传输层安全 ? [] : [80];
const 链接列表472 = [];
const 网页套接字路径471 = '/?ed=2048';
const 协议470 = atob('dmxlc3M=');
const 制作节点名称469 = 别名命名器477 || 创建值节点命名器(跳过编号478);
for (const 项目468 of 列表482) {
const 安全地址467 = 项目468.ip.includes(':') ? `[${项目468.ip}]` : 项目468.ip;
let 值值生成466 = [];
if (项目468.port) {
const 端口465 = 项目468.port;
if (云墙安全超文本端口475.includes(端口465)) {
值值生成466.push({
port: 端口465,
tls: true
});
} else if (云墙超文本端口476.includes(端口465)) {
if (!禁用非传输层安全) {
值值生成466.push({
port: 端口465,
tls: false
});
}
} else {
值值生成466.push({
port: 端口465,
tls: true
});
}
} else {
默认安全超文本值474.forEach(端口464 => {
值值生成466.push({
port: 端口464,
tls: true
});
});
默认超文本值473.forEach(端口463 => {
值值生成466.push({
port: 端口463,
tls: false
});
});
}
for (const {
port: 端口462,
tls: 传输层安全461
} of 值值生成466) {
const 网页套接字节点名称460 = 制作节点名称469(项目468);
if (传输层安全461) {
const 网页套接字参数459 = new URLSearchParams({
encryption: 'none',
security: 'tls',
sni: 工作器域名480,
fp: 启用加密客户端问候 ? 'chrome' : 'randomized',
type: 'ws',
host: 工作器域名480,
path: 网页套接字路径471
});
处理值应用层协议协商值(网页套接字参数459);
// 如果启用了ECH,添加ech参数(ECH需要伪装成Chrome浏览器)
if (启用加密客户端问候) {
const 域名系统值458 = 自定义域名系统 || 'https://223.5.5.5/dns-query';
const 加密客户端问候域名457 = 自定义加密客户端问候域名 || 'cloudflare-ech.com';
网页套接字参数459.set('ech', `${加密客户端问候域名457}+${域名系统值458}`);
}
链接列表472.push(`${协议470}://${用户481}@${安全地址467}:${端口462}?${网页套接字参数459.toString()}#${encodeURIComponent(网页套接字节点名称460)}`);
} else {
const 网页套接字参数456 = new URLSearchParams({
encryption: 'none',
security: 'none',
type: 'ws',
host: 工作器域名480,
path: 网页套接字路径471
});
链接列表472.push(`${协议470}://${用户481}@${安全地址467}:${端口462}?${网页套接字参数456.toString()}#${encodeURIComponent(网页套接字节点名称460)}`);
}
}
}
return 链接列表472;
}
async function 生成木马链接列表来源源(列表455, 用户454, 工作器域名453, 加密客户端问候配置452 = null, 跳过编号451 = false, 别名命名器450 = null) {
const 云墙超文本端口449 = [80, 8080, 8880, 2052, 2082, 2086, 2095];
const 云墙安全超文本端口448 = [443, 2053, 2083, 2087, 2096, 8443];
const 默认安全超文本值 = [443];
const 默认超文本值 = 禁用非传输层安全 ? [] : [80];
const 链接列表447 = [];
const 网页套接字路径446 = '/?ed=2048';
const 密码445 = 传输路径 || 用户454;
const 制作节点名称444 = 别名命名器450 || 创建值节点命名器(跳过编号451);
for (const 项目443 of 列表455) {
const 安全地址442 = 项目443.ip.includes(':') ? `[${项目443.ip}]` : 项目443.ip;
let 值值生成 = [];
if (项目443.port) {
const 端口441 = 项目443.port;
if (云墙安全超文本端口448.includes(端口441)) {
值值生成.push({
port: 端口441,
tls: true
});
} else if (云墙超文本端口449.includes(端口441)) {
if (!禁用非传输层安全) {
值值生成.push({
port: 端口441,
tls: false
});
}
} else {
值值生成.push({
port: 端口441,
tls: true
});
}
} else {
默认安全超文本值.forEach(端口440 => {
值值生成.push({
port: 端口440,
tls: true
});
});
默认超文本值.forEach(端口439 => {
值值生成.push({
port: 端口439,
tls: false
});
});
}
for (const {
port: 端口438,
tls: 传输层安全
} of 值值生成) {
const 网页套接字节点名称437 = 制作节点名称444(项目443);
if (传输层安全) {
const 网页套接字参数436 = new URLSearchParams({
security: 'tls',
sni: 工作器域名453,
fp: 'chrome',
type: 'ws',
host: 工作器域名453,
path: 网页套接字路径446
});
处理值应用层协议协商值(网页套接字参数436);
// 如果启用了ECH,添加ech参数(ECH需要伪装成Chrome浏览器)
if (启用加密客户端问候) {
const 域名系统值435 = 自定义域名系统 || 'https://223.5.5.5/dns-query';
const 加密客户端问候域名434 = 自定义加密客户端问候域名 || 'cloudflare-ech.com';
网页套接字参数436.set('ech', `${加密客户端问候域名434}+${域名系统值435}`);
}
链接列表447.push(`${atob('dHJvamFuOi8v')}${密码445}@${安全地址442}:${端口438}?${网页套接字参数436.toString()}#${encodeURIComponent(网页套接字节点名称437)}`);
} else {
const 网页套接字参数 = new URLSearchParams({
security: 'none',
type: 'ws',
host: 工作器域名453,
path: 网页套接字路径446
});
链接列表447.push(`${atob('dHJvamFuOi8v')}${密码445}@${安全地址442}:${端口438}?${网页套接字参数.toString()}#${encodeURIComponent(网页套接字节点名称437)}`);
}
}
}
return 链接列表447;
}
async function 获取值地址列表() {
const 值4网址1 = "https://www.wetest.vip/page/cloudflare/address_v4.html";
const 值6网址1 = "https://www.wetest.vip/page/cloudflare/address_v6.html";
let 结果列表433 = [];
// 读取筛选配置(默认全部启用)
const 值4已启用 = 获取配置值('ipv4', '') === '' || 获取配置值('ipv4', 'yes') !== 'no';
const 值6已启用 = 获取配置值('ipv6', '') === '' || 获取配置值('ipv6', 'yes') !== 'no';
const 值值432 = 获取配置值('ispMobile', '') === '' || 获取配置值('ispMobile', 'yes') !== 'no';
const 值值431 = 获取配置值('ispUnicom', '') === '' || 获取配置值('ispUnicom', 'yes') !== 'no';
const 值值430 = 获取配置值('ispTelecom', '') === '' || 获取配置值('ispTelecom', 'yes') !== 'no';
try {
const 获取承诺列表 = [];
if (值4已启用) {
获取承诺列表.push(获取值解析值(值4网址1));
} else {
获取承诺列表.push(Promise.resolve([]));
}
if (值6已启用) {
获取承诺列表.push(获取值解析值(值6网址1));
} else {
获取承诺列表.push(Promise.resolve([]));
}
const [值4列表, 值6列表] = await Promise.all(获取承诺列表);
结果列表433 = [...值4列表, ...值6列表];
// 按运营商筛选
if (结果列表433.length > 0) {
结果列表433 = 结果列表433.filter(项目429 => {
const 本地值428 = 项目429.isp || '';
if (本地值428.includes('移动') && !值值432) return false;
if (本地值428.includes('联通') && !值值431) return false;
if (本地值428.includes('电信') && !值值430) return false;
return true;
});
}
if (结果列表433.length > 0) {
return 结果列表433;
}
} catch (事件值427) {}
return [];
}
async function 获取值解析值(网址426) {
try {
const 响应425 = await fetch(网址426, {
headers: {
'User-Agent': 'Mozilla/5.0'
}
});
if (!响应425.ok) {
return [];
}
const 页面 = await 响应425.text();
const 结果列表424 = [];
const 值正则423 = //g;
const 值正则422 = /| (.+?)<\/td>[\s\S]*? | ([\d.:a-fA-F]+)<\/td>[\s\S]*? | (.+?)<\/td>/;
let 本地值421;
while ((本地值421 = 值正则423.exec(页面)) !== null) {
const 值页面420 = 本地值421[0];
const 值值419 = 值页面420.match(值正则422);
if (值值419 && 值值419[1] && 值值419[2]) {
const 机房 = 值值419[3] ? 值值419[3].trim().replace(/<.*?>/g, '') : '';
结果列表424.push({
isp: 值值419[1].trim().replace(/<.*?>/g, ''),
ip: 值值419[2].trim(),
colo: 机房
});
}
}
if (结果列表424.length === 0) {}
return 结果列表424;
} catch (错误418) {
return [];
}
}
async function 处理网页套接字请求(请求417) {
// 从请求URL的path query中读取客户端自定义参数
// 从 path query 读取覆盖参数
const 请求网址 = new URL(请求417.url);
const 请求回退416 = 请求网址.searchParams.get('p') || '';
const 请求地区415 = (请求网址.searchParams.get('wk') || '').toUpperCase();
const 请求值字符串 = 请求网址.searchParams.get('rm') || '';
const 请求值414 = 请求值字符串 ? 请求值字符串.toLowerCase() !== 'no' : null;
const 请求代理字符串 = 请求网址.searchParams.get('s') || '';
let 请求代理配置413 = null;
if (请求代理字符串) {
try {
请求代理配置413 = 解析代理配置(请求代理字符串);
} catch (忽略值412) {}
}
// 检测并设置当前Worker地区,确保WebSocket请求能正确进行就近匹配
// 优先级:客户端path参数wk > 全局manualWorkerRegion > 自动检测
let 实际地区411 = 当前工作器地区;
if (!实际地区411 || 实际地区411 === '') {
if (请求地区415) {
实际地区411 = 请求地区415;
} else if (手动工作器地区 && 手动工作器地区.trim()) {
实际地区411 = 手动工作器地区.trim().toUpperCase();
} else {
实际地区411 = await 检测工作器地区(请求417);
}
} else if (请求地区415) {
实际地区411 = 请求地区415;
}
const 网页套接字值 = new WebSocketPair();
const [客户端值, 值值410] = Object.values(网页套接字值);
值值410.accept();
值值410.binaryType = 'arraybuffer';
let 远程连接值409 = {
socket: null,
writer: null,
drainUpload: null
};
let 是否域名系统值 = false;
let 协议类型 = null;
let 值值408 = false;
let 传输值 = false;
const 值队列 = 创建块队列(传输上传包大小, 传输上传队列上限, 传输上传队列上限 >> 8);
const 请求值407 = 请求417.fetcher;
function 处理值远程写入器() {
try {
远程连接值409.writer?.releaseLock();
} catch (忽略值406) {}
远程连接值409.writer = null;
}
function 关闭传输() {
if (传输值) return;
传输值 = true;
值队列.clear();
处理值远程写入器();
try {
远程连接值409.socket?.close();
} catch (忽略值405) {}
关闭套接字值(值值410);
}
function 处理队列值(块404) {
const 数据403 = 处理值值8数组(块404);
if (!数据403.byteLength) return true;
if (!值队列.sow(数据403)) {
关闭传输();
return false;
}
远程连接值409.drainUpload();
return true;
}
async function 处理值值402() {
if (值值408 || 传输值 || !远程连接值409.writer) return;
值值408 = true;
try {
for (;;) {
if (传输值 || !远程连接值409.writer) break;
const [数据401] = 值队列.bundle();
if (!数据401) break;
await 远程连接值409.writer.write(数据401);
}
} catch (忽略值400) {
关闭传输();
} finally {
值值408 = false;
if (!值队列.empty && !传输值 && 远程连接值409.writer) queueMicrotask(处理值值402);
}
}
远程连接值409.drainUpload = () => {
if (!值值408 && !值队列.empty && 远程连接值409.writer) queueMicrotask(处理值值402);
};
const 值数据399 = 请求417.headers.get(atob('c2VjLXdlYnNvY2tldC1wcm90b2NvbA==')) || '';
const 本地值398 = 制作值流(值值410, 值数据399);
本地值398.pipeTo(new WritableStream({
async write(块397) {
if (传输值) return;
const 数据396 = 处理值值8数组(块397);
if (是否域名系统值) return await 处理值用户数据报(数据396, 值值410, null, 请求值407);
if (远程连接值409.socket && 远程连接值409.writer) {
if (!处理队列值(数据396)) throw new Error('upload queue overflow');
return;
}
if (协议类型) {
if (!处理队列值(数据396)) throw new Error('upload queue overflow');
return;
}
if (!协议类型) {
if (启用明文 && 数据396.byteLength >= 24) {
const 轻量协议结果 = 解析网页套接字值头部(数据396, 认证令牌);
if (!轻量协议结果.hasError) {
协议类型 = 解码64('dmxlc3M=');
const {
addressType: 地址类型395,
port: 端口394,
hostname: 主机名393,
rawIndex: 原始索引,
version: 本地值392,
isUDP: 是否用户数据报391
} = 轻量协议结果;
if (是否用户数据报391) {
if (端口394 === 53) 是否域名系统值 = true;else throw new Error(错误_仅支持域名系统用户数据报);
}
const 值头部390 = new Uint8Array([本地值392[0], 0]);
const 原始数据389 = 数据396.subarray(原始索引);
if (是否域名系统值) return 处理值用户数据报(原始数据389, 值值410, 值头部390, 请求值407);
await 处理值值384(地址类型395, 主机名393, 端口394, 原始数据389, 值值410, 值头部390, 远程连接值409, 请求回退416, 实际地区411, 请求值414, 请求代理配置413, 请求值407);
return;
}
}
if (启用木马 && 数据396.byteLength >= 56) {
const 值结果 = await 解析木马头部(数据396, 认证令牌);
if (!值结果.hasError) {
协议类型 = atob('dHJvamFu');
const {
addressType: 地址类型388,
port: 端口387,
hostname: 主机名386,
rawClientData: 原始客户端数据
} = 值结果;
await 处理值值384(地址类型388, 主机名386, 端口387, 原始客户端数据, 值值410, null, 远程连接值409, 请求回退416, 实际地区411, 请求值414, 请求代理配置413, 请求值407);
return;
}
}
throw new Error('Invalid protocol or authentication failed');
}
}
})).catch(错误385 => {
关闭传输();
});
return new Response(null, {
status: 101,
webSocket: 客户端值
});
}
async function 处理值值384(地址类型383, 主机, 端口数字, 原始数据, 网页套接字382, 值头部381, 远程连接值, 请求回退 = '', 请求地区 = '', 请求值380 = null, 请求代理配置 = null, 请求值379 = null) {
// 优先使用客户端path参数,其次回退到全局配置
const 实际回退 = 请求回退 || 回退地址;
const 实际地区 = 请求地区 || 当前工作器地区;
const 实际地区匹配 = 请求值380 !== null ? 请求值380 : 启用地区匹配;
const 实际代理配置 = 请求代理配置 || 已解析代理5配置;
const 实际代理已启用 = 请求代理配置 ? true : 是否代理已启用;
const 值数据378 = 处理值值8数组(原始数据);
async function 连接值发送(地址377, 端口376, 值代理 = false) {
const 远程值375 = 值代理 ? await 处理值代理连接(地址类型383, 地址377, 端口376, 实际代理配置) : await 连接值套接字(地址377, 端口376, 请求值379, 传输连接竞速数);
const 写入器374 = 远程值375.writable.getWriter();
if (值数据378.byteLength) await 写入器374.write(值数据378);
return {
remoteSock: 远程值375,
writer: 写入器374
};
}
function 处理值值当前(远程值373, 写入器372) {
if (远程连接值.socket !== 远程值373) return;
try {
写入器372?.releaseLock();
} catch (忽略值371) {}
远程连接值.socket = null;
远程连接值.writer = null;
}
function 处理值远程(远程值370, 写入器369, 重试值368) {
try {
if (远程连接值.writer && 远程连接值.writer !== 写入器369) {
远程连接值.writer.releaseLock();
}
} catch (忽略值367) {}
远程连接值.socket = 远程值370;
远程连接值.writer = 写入器369;
远程连接值.drainUpload?.();
远程值370.closed.catch(() => {}).finally(() => {
if (远程连接值.socket === 远程值370) 关闭套接字值(网页套接字382);
});
连接值279(远程值370, 网页套接字382, 值头部381, 重试值368).finally(() => {
if (远程连接值.socket === 远程值370) {
try {
写入器369.releaseLock();
} catch (忽略值366) {}
远程连接值.writer = null;
}
});
}
async function 处理重试连接() {
if (启用代理降级 && 实际代理已启用) {
try {
const {
remoteSock: 代理套接字,
writer: 代理写入器
} = await 连接值发送(主机, 端口数字, true);
处理值远程(代理套接字, 代理写入器, null);
return;
} catch (代理错误) {
let 备用主机365, 备用端口364;
if (实际回退 && 实际回退.trim()) {
const 已解析363 = 解析地址值端口(实际回退);
备用主机365 = 已解析363.address;
备用端口364 = 已解析363.port || 端口数字;
} else {
const 值备用地址362 = await 获取值备用地址(实际地区, 实际地区匹配);
备用主机365 = 值备用地址362 ? 值备用地址362.domain : 主机;
备用端口364 = 值备用地址362 ? 值备用地址362.port : 端口数字;
}
try {
const {
remoteSock: 回退套接字361,
writer: 回退写入器360
} = await 连接值发送(备用主机365, 备用端口364, false);
处理值远程(回退套接字361, 回退写入器360, null);
} catch (回退错误359) {
关闭套接字值(网页套接字382);
}
}
} else {
let 备用主机, 备用端口;
if (实际回退 && 实际回退.trim()) {
const 已解析 = 解析地址值端口(实际回退);
备用主机 = 已解析.address;
备用端口 = 已解析.port || 端口数字;
} else {
const 值备用地址 = await 获取值备用地址(实际地区, 实际地区匹配);
备用主机 = 值备用地址 ? 值备用地址.domain : 主机;
备用端口 = 值备用地址 ? 值备用地址.port : 端口数字;
}
try {
const {
remoteSock: 回退套接字,
writer: 回退写入器
} = await 连接值发送(备用主机, 备用端口, 实际代理已启用);
处理值远程(回退套接字, 回退写入器, null);
} catch (回退错误) {
关闭套接字值(网页套接字382);
}
}
}
try {
const {
remoteSock: 值套接字358,
writer: 值写入器
} = await 连接值发送(主机, 端口数字, 启用代理降级 ? false : 实际代理已启用);
处理值远程(值套接字358, 值写入器, () => {
处理值值当前(值套接字358, 值写入器);
处理重试连接();
});
} catch (错误357) {
await 处理重试连接();
}
}
function 处理值值8数组(块356) {
if (块356 instanceof Uint8Array) return 块356;
if (块356 instanceof ArrayBuffer) return new Uint8Array(块356);
if (ArrayBuffer.isView(块356)) return new Uint8Array(块356.buffer, 块356.byteOffset, 块356.byteLength);
return new Uint8Array(块356);
}
function 拼接值8数组(头部355, 主体354) {
const 头值353 = 处理值值8数组(头部355);
const 乙值352 = 处理值值8数组(主体354);
const 输出351 = new Uint8Array(头值353.byteLength + 乙值352.byteLength);
输出351.set(头值353);
输出351.set(乙值352, 头值353.byteLength);
return 输出351;
}
function 创建块队列(本地值350, 值值349 = 本地值350, 项目列表上限 = Math.max(1, 值值349 >> 8)) {
let 队列 = [];
let 头部348 = 0;
let 值字节347 = 0;
let 值缓冲346 = null;
function 处理本地值345() {
if (头部348 > 32 && 头部348 * 2 >= 队列.length) {
队列 = 队列.slice(头部348);
头部348 = 0;
}
}
function 处理本地值344() {
if (头部348 >= 队列.length) return null;
const 数据343 = 队列[头部348];
队列[头部348++] = undefined;
值字节347 -= 数据343.byteLength;
处理本地值345();
return 数据343;
}
return {
get empty() {
return 头部348 >= 队列.length;
},
clear() {
队列 = [];
头部348 = 0;
值字节347 = 0;
},
sow(数据342) {
const 数量值 = 数据342?.byteLength || 0;
if (!数量值) return true;
if (值字节347 + 数量值 > 值值349 || 队列.length - 头部348 >= 项目列表上限) return false;
队列.push(数据342);
值字节347 += 数量值;
return true;
},
bundle(数据341 = null) {
数据341 ||= 处理本地值344();
if (!数据341 || 头部348 >= 队列.length || 数据341.byteLength >= 本地值350) return [数据341, false];
let 本地值340 = 数据341.byteLength;
let 结束 = 头部348;
while (结束 < 队列.length) {
const 本地值339 = 队列[结束];
const 值值338 = 本地值340 + 本地值339.byteLength;
if (值值338 > 本地值350) break;
本地值340 = 值值338;
结束++;
}
if (结束 === 头部348) return [数据341, false];
const 输出 = 值缓冲346 ||= new Uint8Array(本地值350);
输出.set(数据341);
let 偏移337 = 数据341.byteLength;
while (头部348 < 结束) {
const 本地值336 = 队列[头部348];
队列[头部348++] = undefined;
值字节347 -= 本地值336.byteLength;
输出.set(本地值336, 偏移337);
偏移337 += 本地值336.byteLength;
}
处理本地值345();
return [输出.subarray(0, 本地值340), true];
}
};
}
function 创建值值(网页套接字335) {
const 本地值334 = 传输下载包大小;
const 尾部 = 传输下载尾部;
const 值值333 = Math.max(4096, 尾部 << 3);
let 本地值332 = new Uint8Array(本地值334);
let 值字节 = 0;
let 计时器 = 0;
let 值值331 = false;
let 本地值330 = 0;
let 值键 = 0;
let 值值329 = 0;
function 刷新() {
if (计时器) clearTimeout(计时器);
计时器 = 0;
值值331 = false;
if (!值字节) return;
if (网页套接字335.readyState === 1) 网页套接字335.send(本地值332.subarray(0, 值字节).slice());
本地值332 = new Uint8Array(本地值334);
值字节 = 0;
值值329 = 0;
}
function 处理本地值() {
if (计时器 || 值值331) return;
值值331 = true;
值键 = 本地值330;
queueMicrotask(() => {
值值331 = false;
if (!值字节 || 计时器) return;
if (本地值334 - 值字节 < 尾部) return 刷新();
计时器 = setTimeout(() => {
计时器 = 0;
if (!值字节) return;
if (本地值334 - 值字节 < 尾部) return 刷新();
if (值值329 < 2 && (本地值330 !== 值键 || 值字节 < 值值333)) {
值值329++;
值键 = 本地值330;
return 处理本地值();
}
刷新();
}, Math.max(传输下载延迟, 1));
});
}
return {
send(块328) {
const 数据327 = 处理值值8数组(块328);
let 偏移326 = 0;
const 本地值325 = 数据327.byteLength;
if (!本地值325) return;
while (偏移326 < 本地值325) {
if (!值字节 && 本地值325 - 偏移326 >= 本地值334) {
const 大小324 = Math.min(本地值334, 本地值325 - 偏移326);
if (网页套接字335.readyState === 1) 网页套接字335.send(偏移326 || 大小324 !== 本地值325 ? 数据327.subarray(偏移326, 偏移326 + 大小324) : 数据327);
偏移326 += 大小324;
continue;
}
const 大小323 = Math.min(本地值334 - 值字节, 本地值325 - 偏移326);
本地值332.set(数据327.subarray(偏移326, 偏移326 + 大小323), 值字节);
值字节 += 大小323;
偏移326 += 大小323;
本地值330++;
if (值字节 === 本地值334 || 本地值334 - 值字节 < 尾部) 刷新();else 处理本地值();
}
},
flush: 刷新
};
}
function 处理打开值套接字(地址322, 端口321, 请求值320 = null) {
const 目标 = {
hostname: 地址322,
port: 端口321
};
if (请求值320 && typeof 请求值320.connect === 'function') return 请求值320.connect(目标);
return 连接(目标);
}
async function 处理打开值套接字值(地址319, 端口318, 请求值317 = null) {
try {
const 套接字316 = 处理打开值套接字(地址319, 端口318, 请求值317);
if (套接字316?.opened) await 套接字316.opened;
return 套接字316;
} catch (错误315) {
if (!请求值317) throw 错误315;
const 套接字314 = 连接({
hostname: 地址319,
port: 端口318
});
if (套接字314?.opened) await 套接字314.opened;
return 套接字314;
}
}
async function 连接值套接字(地址313, 端口312, 请求值311 = null, 竞速数量 = 1) {
const 数量 = Math.max(1, 竞速数量 | 0);
if (数量 <= 1) return 处理打开值套接字值(地址313, 端口312, 请求值311);
const 本地值310 = Array.from({
length: 数量
}, () => 处理打开值套接字值(地址313, 端口312, 请求值311));
const 本地值309 = await Promise.any(本地值310);
本地值310.forEach(本地值308 => {
本地值308.then(套接字307 => {
if (套接字307 !== 本地值309) {
try {
套接字307.close();
} catch (忽略值306) {}
}
}, () => {});
});
return 本地值309;
}
function 获取唯一标识字节(令牌305) {
if (唯一标识字节缓存.has(令牌305)) return 唯一标识字节缓存.get(令牌305);
const 十六进制 = String(令牌305 || '').replace(/-/g, '');
if (十六进制.length !== 32) return null;
const 字节304 = new Uint8Array(16);
for (let 索引值303 = 0; 索引值303 < 16; 索引值303++) {
const 值302 = Number.parseInt(十六进制.slice(索引值303 * 2, 索引值303 * 2 + 2), 16);
if (Number.isNaN(值302)) return null;
字节304[索引值303] = 值302;
}
if (唯一标识字节缓存.size > 16) 唯一标识字节缓存.clear();
唯一标识字节缓存.set(令牌305, 字节304);
return 字节304;
}
function 处理值唯一标识(字节301, 偏移300, 令牌299) {
const 标识298 = 获取唯一标识字节(令牌299);
return !!标识298 && 字节301[偏移300] === 标识298[0] && 字节301[偏移300 + 1] === 标识298[1] && 字节301[偏移300 + 2] === 标识298[2] && 字节301[偏移300 + 3] === 标识298[3] && 字节301[偏移300 + 4] === 标识298[4] && 字节301[偏移300 + 5] === 标识298[5] && 字节301[偏移300 + 6] === 标识298[6] && 字节301[偏移300 + 7] === 标识298[7] && 字节301[偏移300 + 8] === 标识298[8] && 字节301[偏移300 + 9] === 标识298[9] && 字节301[偏移300 + 10] === 标识298[10] && 字节301[偏移300 + 11] === 标识298[11] && 字节301[偏移300 + 12] === 标识298[12] && 字节301[偏移300 + 13] === 标识298[13] && 字节301[偏移300 + 14] === 标识298[14] && 字节301[偏移300 + 15] === 标识298[15];
}
function 解析网页套接字值头部(块297, 令牌) {
const 字节296 = 处理值值8数组(块297);
if (字节296.byteLength < 24) return {
hasError: true,
message: 错误_无效数据
};
const 本地值295 = 字节296.subarray(0, 1);
if (!处理值唯一标识(字节296, 1, 令牌)) return {
hasError: true,
message: 错误_无效用户
};
const 值长度294 = 字节296[17];
const 命令索引 = 18 + 值长度294;
if (字节296.byteLength < 命令索引 + 5) return {
hasError: true,
message: 错误_无效数据
};
const 命令293 = 字节296[命令索引];
let 是否用户数据报 = false;
if (命令293 === 1) {} else if (命令293 === 2) {
是否用户数据报 = true;
} else {
return {
hasError: true,
message: 错误_不支持命令
};
}
const 端口索引292 = 19 + 值长度294;
const 端口291 = 字节296[端口索引292] << 8 | 字节296[端口索引292 + 1];
let 地址索引290 = 端口索引292 + 2,
地址长度289 = 0,
地址值索引 = 地址索引290 + 1,
主机名288 = '';
const 地址类型287 = 字节296[地址索引290];
switch (地址类型287) {
case 地址类型_四版:
地址长度289 = 4;
if (字节296.byteLength < 地址值索引 + 地址长度289) return {
hasError: true,
message: 错误_无效数据
};
主机名288 = `${字节296[地址值索引]}.${字节296[地址值索引 + 1]}.${字节296[地址值索引 + 2]}.${字节296[地址值索引 + 3]}`;
break;
case 地址类型_网址:
if (字节296.byteLength < 地址值索引 + 1) return {
hasError: true,
message: 错误_无效数据
};
地址长度289 = 字节296[地址值索引++];
if (字节296.byteLength < 地址值索引 + 地址长度289) return {
hasError: true,
message: 错误_无效数据
};
主机名288 = 共享解码器.decode(字节296.subarray(地址值索引, 地址值索引 + 地址长度289));
break;
case 地址类型_六版:
地址长度289 = 16;
if (字节296.byteLength < 地址值索引 + 地址长度289) return {
hasError: true,
message: 错误_无效数据
};
const 值6286 = [];
const 值6视图 = new DataView(字节296.buffer, 字节296.byteOffset + 地址值索引, 地址长度289);
for (let 索引值285 = 0; 索引值285 < 8; 索引值285++) 值6286.push(值6视图.getUint16(索引值285 * 2).toString(16));
主机名288 = 值6286.join(':');
break;
default:
return {
hasError: true,
message: `${错误_无效地址类型}: ${地址类型287}`
};
}
if (!主机名288) return {
hasError: true,
message: `${错误_空地址}: ${地址类型287}`
};
return {
hasError: false,
addressType: 地址类型287,
port: 端口291,
hostname: 主机名288,
isUDP: 是否用户数据报,
rawIndex: 地址值索引 + 地址长度289,
version: 本地值295
};
}
function 制作值流(套接字284, 值数据头部) {
let 本地值283 = false;
return new ReadableStream({
start(控制器282) {
套接字284.addEventListener('message', 事件 => {
if (!本地值283) 控制器282.enqueue(处理值值8数组(事件.data));
});
套接字284.addEventListener('close', () => {
if (!本地值283) {
关闭套接字值(套接字284);
控制器282.close();
}
});
套接字284.addEventListener('error', 错误281 => 控制器282.error(错误281));
const {
earlyData: 值数据,
error: 错误280
} = 处理基础64值数组(值数据头部);
if (错误280) 控制器282.error(错误280);else if (值数据) 控制器282.enqueue(处理值值8数组(值数据));
},
cancel() {
本地值283 = true;
关闭套接字值(套接字284);
}
});
}
async function 连接值279(远程套接字, 网页套接字278, 头部数据, 重试值) {
let 头部277 = 头部数据,
是否有数据 = false,
本地值276 = false;
// 关键:直连有时握手成功但远端长时间无数据,需要超时触发降级
let 首次字节计时器 = null;
if (重试值) {
首次字节计时器 = setTimeout(() => {
if (!是否有数据 && !本地值276) {
本地值276 = true;
try {
远程套接字.close && 远程套接字.close();
} catch (忽略值275) {}
重试值();
}
}, 首字节超时);
}
const 本地值274 = 创建值值(网页套接字278);
let 读取器273 = null;
let 本地值272 = true;
let 缓冲271 = new ArrayBuffer(传输块大小);
try {
try {
读取器273 = 远程套接字.readable.getReader({
mode: 'byob'
});
} catch (忽略值270) {
本地值272 = false;
读取器273 = 远程套接字.readable.getReader();
}
for (;;) {
const 结果269 = 本地值272 ? await 读取器273.read(new Uint8Array(缓冲271, 0, 传输块大小)) : await 读取器273.read();
if (结果269.done) break;
const 读取值 = 结果269.value;
let 块268 = 处理值值8数组(读取值);
const 值缓冲 = 本地值272 && 读取值?.buffer instanceof ArrayBuffer && 读取值.buffer.byteLength >= 传输块大小 ? 读取值.buffer : new ArrayBuffer(传输块大小);
if (!块268.byteLength) continue;
if (!是否有数据) {
是否有数据 = true;
if (首次字节计时器) {
clearTimeout(首次字节计时器);
首次字节计时器 = null;
}
}
if (网页套接字278.readyState !== 1) throw new Error(错误_网页套接字未打开);
if (头部277) {
块268 = 拼接值8数组(头部277, 块268);
头部277 = null;
}
if (块268.byteLength >= 传输块大小 >> 1) {
本地值274.flush();
网页套接字278.send(块268);
if (本地值272) 缓冲271 = new ArrayBuffer(传输块大小);
} else {
本地值274.send(块268.slice());
if (本地值272) 缓冲271 = 值缓冲;
}
}
本地值274.flush();
} catch (错误267) {
// 已经触发 retry 时不要关闭 WS(retry 会重新挂载新 socket)
if (!本地值276) 关闭套接字值(网页套接字278);
} finally {
try {
本地值274.flush();
} catch (忽略值266) {}
try {
读取器273?.releaseLock();
} catch (忽略值265) {}
}
if (首次字节计时器) {
clearTimeout(首次字节计时器);
首次字节计时器 = null;
}
if (!是否有数据 && !本地值276 && 重试值) 重试值();
}
async function 处理值用户数据报(用户数据报块, 网页套接字, 值头部, 请求值 = null) {
try {
const 值套接字 = await 连接值套接字('8.8.4.4', 53, 请求值, 1);
let 头部 = 值头部;
const 写入器264 = 值套接字.writable.getWriter();
await 写入器264.write(用户数据报块);
写入器264.releaseLock();
await 连接值279(值套接字, 网页套接字, 头部, null);
} catch (错误263) {}
}
async function 处理值代理连接(地址类型, 地址262, 端口261, 代理配置 = 已解析代理5配置) {
const {
username: 本地值260,
password: 密码259,
hostname: 主机名258,
socksPort: 代理端口257
} = 代理配置;
const 套接字256 = 连接({
hostname: 主机名258,
port: 代理端口257
});
const 写入器255 = 套接字256.writable.getWriter();
await 写入器255.write(new Uint8Array(本地值260 ? [5, 2, 0, 2] : [5, 1, 0]));
const 读取器254 = 套接字256.readable.getReader();
let 本地值253 = (await 读取器254.read()).value;
if (本地值253[0] !== 5 || 本地值253[1] === 255) throw new Error(错误_代理无可用方法);
if (本地值253[1] === 2) {
if (!本地值260 || !密码259) throw new Error(错误_代理需要认证);
const 编码器252 = new TextEncoder();
const 认证请求 = new Uint8Array([1, 本地值260.length, ...编码器252.encode(本地值260), 密码259.length, ...编码器252.encode(密码259)]);
await 写入器255.write(认证请求);
本地值253 = (await 读取器254.read()).value;
if (本地值253[0] !== 1 || 本地值253[1] !== 0) throw new Error(错误_代理认证失败);
}
const 编码器251 = new TextEncoder();
let 本地值250;
switch (地址类型) {
case 地址类型_四版:
本地值250 = new Uint8Array([1, ...地址262.split('.').map(Number)]);
break;
case 地址类型_网址:
本地值250 = new Uint8Array([3, 地址262.length, ...编码器251.encode(地址262)]);
break;
case 地址类型_六版:
本地值250 = new Uint8Array([4, ...地址262.split(':').flatMap(横值 => [parseInt(横值.slice(0, 2), 16), parseInt(横值.slice(2), 16)])]);
break;
default:
throw new Error(错误_无效地址类型);
}
await 写入器255.write(new Uint8Array([5, 1, 0, ...本地值250, 端口261 >> 8, 端口261 & 255]));
本地值253 = (await 读取器254.read()).value;
if (本地值253[1] !== 0) throw new Error(错误_代理连接失败);
写入器255.releaseLock();
读取器254.releaseLock();
return 套接字256;
}
function 解析代理配置(地址249) {
let [本地值248, 本地值247] = 地址249.split("@").reverse();
let 本地值246, 密码245, 主机名244, 代理端口;
if (本地值247) {
const 本地值243 = 本地值247.split(":");
if (本地值243.length !== 2) throw new Error(错误_无效代理地址);
[本地值246, 密码245] = 本地值243;
}
const 本地值242 = 本地值248.split(":");
代理端口 = Number(本地值242.pop());
if (isNaN(代理端口)) throw new Error(错误_无效代理地址);
主机名244 = 本地值242.join(":");
if (主机名244.includes(":") && !/^\[.*\]$/.test(主机名244)) throw new Error(错误_无效代理地址);
return {
username: 本地值246,
password: 密码245,
hostname: 主机名244,
socksPort: 代理端口
};
}
async function 处理订阅值(请求241, 用户240 = null) {
if (!用户240) 用户240 = 认证令牌;
const 网址239 = new URL(请求241.url);
// 优先检查Cookie中的语言设置
const 凭据头部 = 请求241.headers.get('Cookie') || '';
let 语言来源凭据 = null;
if (凭据头部) {
const 本地值238 = 凭据头部.split(';').map(丙值237 => 丙值237.trim());
for (const 凭据 of 本地值238) {
if (凭据.startsWith('preferredLanguage=')) {
语言来源凭据 = 凭据.split('=')[1];
break;
}
}
}
let 是否值236 = false;
if (语言来源凭据 === 'fa' || 语言来源凭据 === 'fa-IR') {
是否值236 = true;
} else if (语言来源凭据 === 'zh' || 语言来源凭据 === 'zh-CN') {
是否值236 = false;
} else {
// 如果没有Cookie,使用浏览器语言检测
const 接受语言 = 请求241.headers.get('Accept-Language') || '';
const 浏览器语言 = 接受语言.split(',')[0].split('-')[0].toLowerCase();
是否值236 = 浏览器语言 === 'fa' || 接受语言.includes('fa-IR') || 接受语言.includes('fa');
}
const 语言值 = 是否值236 ? 'fa-IR' : 'zh-CN';
const 本地值235 = {
zh: {
title: 解码64('6K6i6ZiF5Lit5b+D'),
subtitle: '多客户端支持 • 智能优选 • 一键生成',
selectClient: '[ 选择客户端 ]',
systemStatus: '[ 系统状态 ]',
configManagement: '[ 配置管理 ]',
relatedLinks: '[ 相关链接 ]',
checking: '检测中...',
workerRegion: 'Worker地区: ',
detectionMethod: '检测方式: ',
proxyIPStatus: 解码64('UHJveHlJUOeKtuaAgTog'),
currentIP: '当前使用IP: ',
regionMatch: '地区匹配: ',
selectionLogic: '选择逻辑: ',
kvStatusChecking: '检测KV状态中...',
kvEnabled: '✅ KV存储已启用,可以使用配置管理功能',
kvDisabled: '⚠️ KV存储未启用或未配置',
specifyRegion: '指定地区 (wk):',
autoDetect: '自动检测',
saveRegion: '保存地区配置',
protocolSelection: 解码64('5Y2P6K6u6YCJ5oupOg=='),
enableVLESS: 解码64('5ZCv55SoIFZMRVNTIOWNj+iurg=='),
enableTrojan: 解码64('5ZCv55SoIFRyb2phbiDljY/orq4='),
enableXhttp: 解码64('5ZCv55SoIHhodHRwIOWNj+iurg=='),
trojanPassword: 解码64('VHJvamFuIOWvhueggSAo5Y+v6YCJKTo='),
customPath: '自定义路径 (d):',
customIP: 解码64('6Ieq5a6a5LmJUHJveHlJUCAocCk6'),
preferredIPs: '优选IP列表 (yx):',
preferredIPsURL: '优选IP来源URL (yxURL):',
latencyTest: '延迟测试',
latencyTestIP: '测试IP/域名:',
latencyTestIPPlaceholder: '输入IP或域名,多个用逗号分隔',
latencyTestPort: '端口:',
startTest: '开始测试',
stopTest: '停止测试',
testResult: '测试结果:',
addToYx: '添加到优选列表',
addSelectedToYx: '添加选中项到优选列表',
selectAll: '全选',
deselectAll: '取消全选',
testingInProgress: '测试中...',
testComplete: '测试完成',
latencyMs: '延迟',
timeout: '超时',
ipSource: 'IP来源:',
manualInput: '手动输入',
cfRandomIP: 'CF随机IP',
urlFetch: 'URL获取',
randomCount: '生成数量:',
fetchURL: '获取URL:',
fetchURLPlaceholder: '输入优选IP的URL地址',
generateIP: '生成IP',
fetchIP: '获取IP',
socks5Config: 解码64('U09DS1M16YWN572uIChzKTo='),
customHomepage: '自定义首页URL (homepage):',
customHomepagePlaceholder: '例如: https://example.com',
customHomepageHint: '设置自定义URL作为首页伪装。访问根路径 / 时将显示该URL的内容。留空则显示默认终端页面。',
saveConfig: '保存配置',
advancedControl: '高级控制',
subscriptionConverter: 解码64('6K6i6ZiF6L2s5o2i5Zyw5Z2AOg=='),
builtinPreferred: '内置优选类型:',
enablePreferredDomain: '启用优选域名',
enablePreferredIP: '启用优选 IP',
enableNativeAddress: '启用原生地址',
enableGitHubPreferred: '启用自定义优选',
allowAPIManagement: '允许API管理 (ae):',
regionMatching: '地区匹配 (rm):',
downgradeControl: '降级控制 (qj):',
tlsControl: 'TLS控制 (dkby):',
preferredControl: '优选控制 (yxby):',
saveAdvanced: '保存高级配置',
loading: '加载中...',
currentConfig: '📍 当前路径配置',
refreshConfig: '刷新配置',
resetConfig: '重置配置',
subscriptionCopied: 解码64('6K6i6ZiF6ZO+5o6l5bey5aSN5Yi2'),
autoSubscriptionCopied: 解码64('6Ieq5Yqo6K+G5Yir6K6i6ZiF6ZO+5o6l5bey5aSN5Yi277yM5a6i5oi356uv6K6/6Zeu5pe25Lya5qC55o2uVXNlci1BZ2VudOiHquWKqOivhuWIq+W5tui/lOWbnuWvueW6lOagvOW8jw=='),
trojanPasswordPlaceholder: '留空则自动使用 UUID',
trojanPasswordHint: 解码64('6K6+572u6Ieq5a6a5LmJIFRyb2phbiDlr4bnoIHjgILnlZnnqbrliJnkvb/nlKggVVVJROOAguWuouaIt+err+S8muiHquWKqOWvueWvhueggei/m+ihjCBTSEEyMjQg5ZOI5biM44CC'),
protocolHint: 解码64('5Y+v5Lul5ZCM5pe25ZCv55So5aSa5Liq5Y2P6K6u44CC6K6i6ZiF5bCG55Sf5oiQ6YCJ5Lit5Y2P6K6u55qE6IqC54K544CCPGJyPuKAoiBWTEVTUyBXUzog5Z+65LqOIFdlYlNvY2tldCDnmoTmoIflh4bljY/orq48YnI+4oCiIFRyb2phbjog5L2/55SoIFNIQTIyNCDlr4bnoIHorqTor4E8YnI+4oCiIHhodHRwOiDln7rkuo4gSFRUUCBQT1NUIOeahOS8quijheWNj+iuru+8iOmcgOimgee7keWumuiHquWumuS5ieWfn+WQjeW5tuW8gOWQryBnUlBD77yJ'),
enableECH: '启用 ECH (Encrypted Client Hello)',
enableECHHint: 解码64('5ZCv55So5ZCO77yM5q+P5qyh5Yi35paw6K6i6ZiF5pe25Lya6Ieq5Yqo5LuOIERvSCDojrflj5bmnIDmlrDnmoQgRUNIIOmFjee9ruW5tua3u+WKoOWIsOmTvuaOpeS4rQ=='),
customDNS: '自定义 DNS 服务器',
customDNSPlaceholder: '例如: https://223.5.5.5/dns-query',
customDNSHint: '用于ECH配置查询的DNS服务器地址(DoH格式)',
customECHDomain: '自定义 ECH 域名',
customECHDomainPlaceholder: '例如: cloudflare-ech.com',
customECHDomainHint: 'ECH配置中使用的域名,留空则使用默认值',
alpn: 'TLS ALPN',
alpnDefault: '默认(留空,由客户端协商)',
alpnHint: '仅添加到 TLS 节点链接参数;留空则不写 alpn。',
saveProtocol: 解码64('5L+d5a2Y5Y2P6K6u6YWN572u'),
subscriptionConverterPlaceholder: '默认: https://url.v1.mk/sub',
subscriptionConverterHint: 解码64('6K6i6ZiF6L2s5o2i5bey5YaF6YOo5a6e546w77yM5peg6ZyA5aSW6YOoIEFQSeOAguatpOmhueS7heS9nOWFvOWuueS/neeVme+8jOWPr+eVmeepuuOAgg=='),
builtinPreferredHint: 解码64('5o6n5Yi26K6i6ZiF5Lit5YyF5ZCr5ZOq5Lqb5YaF572u5LyY6YCJ6IqC54K544CC6buY6K6k5YWo6YOo5ZCv55So44CC'),
apiEnabledDefault: '默认(关闭API)',
apiEnabledYes: '开启API管理',
apiEnabledHint: '⚠️ 安全提醒:开启后允许通过API动态添加优选IP。建议仅在需要时开启。',
regionMatchingDefault: '默认(启用地区匹配)',
regionMatchingNo: '关闭地区匹配',
regionMatchingHint: '设置为"关闭"时不进行地区智能匹配',
downgradeControlDefault: '默认(不启用降级)',
downgradeControlNo: '启用降级模式',
downgradeControlHint: 解码64('6K6+572u5Li6IuWQr+eUqCLml7bvvJpDRuebtOi/nuWksei0peKGklNPQ0tTNei/nuaOpeKGkmZhbGxiYWNr5Zyw5Z2A'),
tlsControlDefault: '默认(保留所有节点)',
tlsControlYes: '仅TLS节点',
tlsControlHint: '设置为"仅TLS节点"时只生成带TLS的节点,不生成非TLS节点(如80端口)',
preferredControlDefault: '默认(启用优选)',
preferredControlYes: '关闭优选',
preferredControlHint: '设置为"关闭优选"时只使用原生地址,不生成优选IP和域名节点',
regionNames: {
HK: '🇭🇰 香港',
US: '🇺🇸 美国',
SG: '🇸🇬 新加坡',
JP: '🇯🇵 日本',
KR: '🇰🇷 韩国',
DE: '🇩🇪 德国',
SE: '🇸🇪 瑞典',
NL: '🇳🇱 荷兰',
FI: '🇫🇮 芬兰',
GB: '🇬🇧 英国'
},
terminal: '终端 v2.9.8c',
githubProject: 'GitHub 项目',
优选工具: '优选工具',
autoDetectClient: '自动识别',
selectionLogicText: '同地区 → 邻近地区 → 其他地区',
customIPDisabledHint: 解码64('5L2/55So6Ieq5a6a5LmJUHJveHlJUOaXtu+8jOWcsOWMuumAieaLqeW3suemgeeUqA=='),
customIPMode: 解码64('6Ieq5a6a5LmJUHJveHlJUOaooeW8jyAocOWPmOmHj+WQr+eUqCk='),
customIPModeDesc: '自定义IP模式 (已禁用地区匹配)',
usingCustomProxyIP: 解码64('5L2/55So6Ieq5a6a5LmJUHJveHlJUDog'),
customIPConfig: ' (p变量配置)',
customIPModeDisabled: '自定义IP模式,地区选择已禁用',
manualRegion: '手动指定地区',
manualRegionDesc: ' (手动指定)',
proxyIPAvailable: 解码64('MTAvMTAg5Y+v55SoIChQcm94eUlQ5Z+f5ZCN6aKE6K6+5Y+v55SoKQ=='),
smartSelection: '智能就近选择中',
sameRegionIP: '同地区IP可用 (1个)',
cloudflareDetection: 'Cloudflare内置检测',
detectionFailed: '检测失败',
apiTestResult: 'API检测结果: ',
apiTestTime: '检测时间: ',
apiTestFailed: 'API检测失败: ',
unknownError: '未知错误',
apiTestError: 'API测试失败: ',
kvNotConfigured: 'KV存储未配置,无法使用配置管理功能。\\n\\n请在Cloudflare Workers中:\\n1. 创建KV命名空间\\n2. 绑定环境变量 C\\n3. 重新部署代码',
kvNotEnabled: 'KV存储未配置',
kvCheckFailed: 'KV存储检测失败: 响应格式错误',
kvCheckFailedStatus: 'KV存储检测失败 - 状态码: ',
kvCheckFailedError: 'KV存储检测失败 - 错误: '
},
fa: {
title: 'مرکز اشتراک',
subtitle: 'پشتیبانی چند کلاینت • انتخاب هوشمند • تولید یک کلیکی',
selectClient: '[ انتخاب کلاینت ]',
systemStatus: '[ وضعیت سیستم ]',
configManagement: '[ مدیریت تنظیمات ]',
relatedLinks: '[ لینکهای مرتبط ]',
checking: 'در حال بررسی...',
workerRegion: 'منطقه Worker: ',
detectionMethod: 'روش تشخیص: ',
proxyIPStatus: 解码64('2YjYtti524zYqiBQcm94eUlQOiA='),
currentIP: 'IP فعلی: ',
regionMatch: 'تطبیق منطقه: ',
selectionLogic: 'منطق انتخاب: ',
kvStatusChecking: 'در حال بررسی وضعیت KV...',
kvEnabled: '✅ ذخیرهسازی KV فعال است، میتوانید از مدیریت تنظیمات استفاده کنید',
kvDisabled: '⚠️ ذخیرهسازی KV فعال نیست یا پیکربندی نشده است',
specifyRegion: 'تعیین منطقه (wk):',
autoDetect: 'تشخیص خودکار',
saveRegion: 'ذخیره تنظیمات منطقه',
protocolSelection: 'انتخاب پروتکل:',
enableVLESS: 解码64('2YHYudin2YTigIzYs9in2LLbjCDZvtix2YjYqtqp2YQgVkxFU1M='),
enableTrojan: 解码64('2YHYudin2YTigIzYs9in2LLbjCDZvtix2YjYqtqp2YQgVHJvamFu'),
enableXhttp: 'فعالسازی پروتکل xhttp',
enableECH: 'فعالسازی ECH (Encrypted Client Hello)',
enableECHHint: 'پس از فعالسازی، در هر بار تازهسازی اشتراک، پیکربندی ECH بهروز بهطور خودکار از DoH دریافت شده و به لینکها اضافه میشود',
customDNS: 'سرور DNS سفارشی',
customDNSPlaceholder: 'مثال: https://223.5.5.5/dns-query',
customDNSHint: 'آدرس سرور DNS برای جستجوی پیکربندی ECH (فرمت DoH)',
customECHDomain: 'دامنه ECH سفارشی',
customECHDomainPlaceholder: 'مثال: cloudflare-ech.com',
customECHDomainHint: 'دامنه استفاده شده در پیکربندی ECH، خالی بگذارید تا از مقدار پیشفرض استفاده شود',
trojanPassword: 解码64('2LHZhdiyINi52KjZiNixIFRyb2phbiAo2KfYrtiq24zYp9ix24wpOg=='),
customPath: 'مسیر سفارشی (d):',
customIP: 解码64('UHJveHlJUCDYs9mB2KfYsdi024wgKHApOg=='),
preferredIPs: 'لیست IP ترجیحی (yx):',
preferredIPsURL: 'URL منبع IP ترجیحی (yxURL):',
latencyTest: 'تست تاخیر',
latencyTestIP: 'IP/دامنه تست:',
latencyTestIPPlaceholder: 'IP یا دامنه وارد کنید، چند مورد با کاما جدا شوند',
latencyTestPort: 'پورت:',
startTest: 'شروع تست',
stopTest: 'توقف تست',
testResult: 'نتیجه تست:',
addToYx: 'افزودن به لیست ترجیحی',
addSelectedToYx: 'افزودن موارد انتخاب شده',
selectAll: 'انتخاب همه',
deselectAll: 'لغو انتخاب',
testingInProgress: 'در حال تست...',
testComplete: 'تست کامل شد',
latencyMs: 'تاخیر',
timeout: 'زمان تمام شد',
ipSource: 'منبع IP:',
manualInput: 'ورودی دستی',
cfRandomIP: 'IP تصادفی CF',
urlFetch: 'دریافت از URL',
randomCount: 'تعداد تولید:',
fetchURL: 'URL دریافت:',
fetchURLPlaceholder: 'آدرس URL لیست IP را وارد کنید',
generateIP: 'تولید IP',
fetchIP: 'دریافت IP',
socks5Config: 解码64('2KrZhti424zZhdin2KogU09DS1M1IChzKTo='),
customHomepage: 'URL صفحه اصلی سفارشی (homepage):',
customHomepagePlaceholder: 'مثال: https://example.com',
customHomepageHint: 'تنظیم URL سفارشی به عنوان استتار صفحه اصلی. هنگام دسترسی به مسیر اصلی / محتوای این URL نمایش داده میشود. اگر خالی بگذارید صفحه ترمینال پیشفرض نمایش داده میشود.',
saveConfig: 'ذخیره تنظیمات',
advancedControl: 'کنترل پیشرفته',
subscriptionConverter: 'آدرس تبدیل اشتراک:',
builtinPreferred: 'نوع ترجیحی داخلی:',
enablePreferredDomain: 'فعالسازی دامنه ترجیحی',
enablePreferredIP: 'فعالسازی IP ترجیحی',
enableNativeAddress: 'فعالسازی آدرس اصلی',
enableGitHubPreferred: 'فعالسازی ترجیح سفارشی',
allowAPIManagement: 'اجازه مدیریت API (ae):',
regionMatching: 'تطبیق منطقه (rm):',
downgradeControl: 'کنترل کاهش سطح (qj):',
tlsControl: 'کنترل TLS (dkby):',
preferredControl: 'کنترل ترجیحی (yxby):',
saveAdvanced: 'ذخیره تنظیمات پیشرفته',
loading: 'در حال بارگذاری...',
currentConfig: '📍 پیکربندی مسیر فعلی',
refreshConfig: 'تازهسازی تنظیمات',
resetConfig: 'بازنشانی تنظیمات',
subscriptionCopied: 'لینک اشتراک کپی شد',
autoSubscriptionCopied: 'لینک اشتراک تشخیص خودکار کپی شد، کلاینت هنگام دسترسی بر اساس User-Agent به طور خودکار تشخیص داده و قالب مربوطه را برمیگرداند',
trojanPasswordPlaceholder: 'خالی بگذارید تا از UUID استفاده شود',
trojanPasswordHint: 解码64('2LHZhdiyINi52KjZiNixIFRyb2phbiDYs9mB2KfYsdi024wg2LHYpyDYqtmG2LjbjNmFINqp2YbbjNivLiDYp9qv2LEg2K7Yp9mE24wg2Kjar9iw2KfYsduM2K8g2KfYsiBVVUlEINin2LPYqtmB2KfYr9mHINmF24zigIzYtNmI2K8uINqp2YTYp9uM2YbYqiDYqNmHINi32YjYsSDYrtmI2K/aqdin2LEg2LHZhdiyINi52KjZiNixINix2Kcg2KjYpyBTSEEyMjQg2YfYtCDZhduM4oCM2qnZhtivLg=='),
protocolHint: 解码64('2YXbjOKAjNiq2YjYp9mG24zYryDahtmG2K/bjNmGINm+2LHZiNiq2qnZhCDYsdinINmH2YXYstmF2KfZhiDZgdi52KfZhCDaqdmG24zYry4g2KfYtNiq2LHYp9qpINqv2LHZh+KAjNmH2KfbjCDZvtix2YjYqtqp2YTigIzZh9in24wg2KfZhtiq2K7Yp9ioINi02K/ZhyDYsdinINiq2YjZhNuM2K8g2YXbjOKAjNqp2YbYry48YnI+4oCiIFZMRVNTIFdTOiDZvtix2YjYqtqp2YQg2KfYs9iq2KfZhtiv2KfYsdivINmF2KjYqtmG24wg2KjYsSBXZWJTb2NrZXQ8YnI+4oCiIFRyb2phbjog2KfYrdix2KfYsiDZh9mI24zYqiDYqNinINix2YXYsiDYudio2YjYsSBTSEEyMjQ8YnI+4oCiIHhodHRwOiDZvtix2YjYqtqp2YQg2KfYs9iq2KrYp9ixINmF2KjYqtmG24wg2KjYsSBIVFRQIFBPU1QgKNmG24zYp9iyINio2Ycg2KfYqti12KfZhCDYr9in2YXZhtmHINiz2YHYp9ix2LTbjCDZiCDZgdi52KfZhOKAjNiz2KfYstuMIGdSUEMg2K/Yp9ix2K8p'),
alpn: 'TLS ALPN',
alpnDefault: 'پیشفرض (خالی، مذاکره توسط کلاینت)',
alpnHint: 'فقط به لینکهای TLS اضافه میشود؛ اگر خالی باشد alpn نوشته نمیشود.',
saveProtocol: 'ذخیره تنظیمات پروتکل',
subscriptionConverterPlaceholder: 'پیشفرض: https://url.v1.mk/sub',
subscriptionConverterHint: 'تبدیل اشتراک به صورت داخلی پیادهسازی شده است و نیازی به API خارجی ندارد. این فیلد فقط برای سازگاری حفظ شده و میتوان آن را خالی گذاشت.',
builtinPreferredHint: 'کنترل اینکه کدام گرههای ترجیحی داخلی در اشتراک گنجانده شوند. به طور پیشفرض همه فعال هستند.',
apiEnabledDefault: 'پیشفرض (بستن API)',
apiEnabledYes: 'فعالسازی مدیریت API',
apiEnabledHint: '⚠️ هشدار امنیتی: فعالسازی این گزینه اجازه میدهد IP های ترجیحی از طریق API به طور پویا اضافه شوند. توصیه میشود فقط در صورت نیاز فعال کنید.',
regionMatchingDefault: 'پیشفرض (فعالسازی تطبیق منطقه)',
regionMatchingNo: 'بستن تطبیق منطقه',
regionMatchingHint: 'وقتی "بستن" تنظیم شود، تطبیق هوشمند منطقه انجام نمیشود',
downgradeControlDefault: 'پیشفرض (عدم فعالسازی کاهش سطح)',
downgradeControlNo: 'فعالسازی حالت کاهش سطح',
downgradeControlHint: 解码64('2YjZgtiq24wgItmB2LnYp9mEIiDYqtmG2LjbjNmFINi02YjYrzog2KfYqti12KfZhCDZhdiz2KrZgtuM2YUgQ0Yg2YbYp9mF2YjZgdmCIOKGkiDYp9iq2LXYp9mEIFNPQ0tTNSDihpIg2KLYr9ix2LMgZmFsbGJhY2s='),
tlsControlDefault: 'پیشفرض (حفظ همه گرهها)',
tlsControlYes: 'فقط گرههای TLS',
tlsControlHint: 'وقتی "فقط گرههای TLS" تنظیم شود، فقط گرههای با TLS تولید میشوند، گرههای غیر TLS (مانند پورت 80) تولید نمیشوند',
preferredControlDefault: 'پیشفرض (فعالسازی ترجیح)',
preferredControlYes: 'بستن ترجیح',
preferredControlHint: 'وقتی "بستن ترجیح" تنظیم شود، فقط از آدرس اصلی استفاده میشود، گرههای IP و دامنه ترجیحی تولید نمیشوند',
regionNames: {
HK: '🇭🇰 هنگ کنگ',
US: '🇺🇸 آمریکا',
SG: '🇸🇬 سنگاپور',
JP: '🇯🇵 ژاپن',
KR: '🇰🇷 کره جنوبی',
DE: '🇩🇪 آلمان',
SE: '🇸🇪 سوئد',
NL: '🇳🇱 هلند',
FI: '🇫🇮 فنلاند',
GB: '🇬🇧 بریتانیا'
},
terminal: 'ترمینال v2.9.8c',
githubProject: 'پروژه GitHub',
优选工具: 'ابزار ترجیح IP',
autoDetectClient: 'تشخیص خودکار',
selectionLogicText: 'هممنطقه → منطقه مجاور → سایر مناطق',
customIPDisabledHint: 解码64('2YfZhtqv2KfZhSDYp9iz2KrZgdin2K/ZhyDYp9iyIFByb3h5SVAg2LPZgdin2LHYtNuM2Iwg2KfZhtiq2K7Yp9ioINmF2YbYt9mC2Ycg2LrbjNix2YHYudin2YQg2KfYs9iq'),
customIPMode: 解码64('2K3Yp9mE2KogUHJveHlJUCDYs9mB2KfYsdi024wgKNmF2KrYutuM2LEgcCDZgdi52KfZhCDYp9iz2Kop'),
customIPModeDesc: 'حالت IP سفارشی (تطبیق منطقه غیرفعال است)',
usingCustomProxyIP: 解码64('2KfYs9iq2YHYp9iv2Ycg2KfYsiBQcm94eUlQINiz2YHYp9ix2LTbjDog'),
customIPConfig: ' (پیکربندی متغیر p)',
customIPModeDisabled: 'حالت IP سفارشی، انتخاب منطقه غیرفعال است',
manualRegion: 'تعیین منطقه دستی',
manualRegionDesc: ' (تعیین دستی)',
proxyIPAvailable: 解码64('MTAvMTAg2K/YsSDYr9iz2KrYsdizICjYr9in2YXZhtmHINm+24zYtOKAjNmB2LHYtiBQcm94eUlQINiv2LEg2K/Ys9iq2LHYsyDYp9iz2Kop'),
smartSelection: 'انتخاب هوشمند نزدیک در حال انجام است',
sameRegionIP: 'IP هممنطقه در دسترس است (1)',
cloudflareDetection: 'تشخیص داخلی Cloudflare',
detectionFailed: 'تشخیص ناموفق',
apiTestResult: 'نتیجه تشخیص API: ',
apiTestTime: 'زمان تشخیص: ',
apiTestFailed: 'تشخیص API ناموفق: ',
unknownError: 'خطای ناشناخته',
apiTestError: 'تست API ناموفق: ',
kvNotConfigured: 'ذخیرهسازی KV پیکربندی نشده است، نمیتوانید از عملکرد مدیریت تنظیمات استفاده کنید.\\n\\nلطفا در Cloudflare Workers:\\n1. فضای نام KV ایجاد کنید\\n2. متغیر محیطی C را پیوند دهید\\n3. کد را دوباره مستقر کنید',
kvNotEnabled: 'ذخیرهسازی KV پیکربندی نشده است',
kvCheckFailed: 'بررسی ذخیرهسازی KV ناموفق: خطای فرمت پاسخ',
kvCheckFailedStatus: 'بررسی ذخیرهسازی KV ناموفق - کد وضعیت: ',
kvCheckFailedError: 'بررسی ذخیرهسازی KV ناموفق - خطا: '
}
};
const 翻译值 = 本地值235[是否值236 ? 'fa' : 'zh'];
const 值页面 = `
${翻译值.title}
SYS:: ${翻译值.terminal}
NODE:: NIGHT_CITY
LINK:: SECURE / ENC
LANG_
${翻译值.selectClient}
${翻译值.systemStatus}
[ ${翻译值.checking} ]
${翻译值.workerRegion}${翻译值.checking}
${翻译值.detectionMethod}${翻译值.checking}
${翻译值.proxyIPStatus}${翻译值.checking}
${翻译值.currentIP}${翻译值.checking}
ECH状态: ${翻译值.checking}
${翻译值.regionMatch}${翻译值.checking}
${翻译值.selectionLogic}${翻译值.selectionLogicText}
${翻译值.configManagement}
${翻译值.kvStatusChecking}
${翻译值.advancedControl}
${翻译值.loading}
${翻译值.currentConfig}
${翻译值.checking}
`;
return new Response(值页面, {
status: 200,
headers: {
'Content-Type': 'text/html; charset=utf-8'
}
});
}
async function 解析木马头部(缓冲234, 本地值233) {
const 字节 = 处理值值8数组(缓冲234);
const 密码值井号 = 传输路径 || 本地值233;
const 值224密码 = await 处理值224井号(密码值井号);
if (字节.byteLength < 56) {
return {
hasError: true,
message: "invalid " + atob('dHJvamFu') + " data - too short"
};
}
let 值值索引 = 56;
if (字节[56] !== 0x0d || 字节[57] !== 0x0a) {
return {
hasError: true,
message: "invalid " + atob('dHJvamFu') + " header format (missing CR LF)"
};
}
const 密码232 = 共享解码器.decode(字节.subarray(0, 值值索引));
if (密码232 !== 值224密码) {
return {
hasError: true,
message: "invalid " + atob('dHJvamFu') + " password"
};
}
const 代理5数据缓冲 = 字节.subarray(值值索引 + 2);
if (代理5数据缓冲.byteLength < 6) {
return {
hasError: true,
message: atob('aW52YWxpZCBTT0NLUzUgcmVxdWVzdCBkYXRh')
};
}
const 视图231 = new DataView(代理5数据缓冲.buffer, 代理5数据缓冲.byteOffset, 代理5数据缓冲.byteLength);
const 命令230 = 视图231.getUint8(0);
if (命令230 !== 1) {
return {
hasError: true,
message: "unsupported command, only TCP (CONNECT) is allowed"
};
}
const 本地值229 = 视图231.getUint8(1);
let 地址长度 = 0;
let 地址索引228 = 2;
let 地址227 = "";
switch (本地值229) {
case 1:
地址长度 = 4;
地址227 = 代理5数据缓冲.subarray(地址索引228, 地址索引228 + 地址长度).join(".");
break;
case 3:
地址长度 = 代理5数据缓冲[地址索引228];
地址索引228 += 1;
地址227 = 共享解码器.decode(代理5数据缓冲.subarray(地址索引228, 地址索引228 + 地址长度));
break;
case 4:
地址长度 = 16;
const 数据视图 = new DataView(代理5数据缓冲.buffer, 代理5数据缓冲.byteOffset + 地址索引228, 地址长度);
const 值6 = [];
for (let 索引值226 = 0; 索引值226 < 8; 索引值226++) {
值6.push(数据视图.getUint16(索引值226 * 2).toString(16));
}
地址227 = 值6.join(":");
break;
default:
return {
hasError: true,
message: `invalid addressType is ${本地值229}`
};
}
if (!地址227) {
return {
hasError: true,
message: `address is empty, addressType is ${本地值229}`
};
}
const 端口索引225 = 地址索引228 + 地址长度;
const 端口远程 = new DataView(代理5数据缓冲.buffer, 代理5数据缓冲.byteOffset + 端口索引225, 2).getUint16(0);
return {
hasError: false,
addressRemote: 地址227,
addressType: 本地值229,
port: 端口远程,
hostname: 地址227,
rawClientData: 代理5数据缓冲.subarray(端口索引225 + 4)
};
}
async function 处理值224井号(文本224) {
const 编码器 = new TextEncoder();
const 数据223 = 编码器.encode(文本224);
const 本地值222 = [0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2];
let 头部游标 = [0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939, 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4];
const 消息长度 = 数据223.length;
const 值长度221 = 消息长度 * 8;
const 值长度220 = Math.ceil((消息长度 + 9) / 64) * 64;
const 本地值219 = new Uint8Array(值长度220);
本地值219.set(数据223);
本地值219[消息长度] = 0x80;
const 视图 = new DataView(本地值219.buffer);
视图.setUint32(值长度220 - 4, 值长度221, false);
for (let 块218 = 0; 块218 < 值长度220; 块218 += 64) {
const 写入器包装 = new Uint32Array(64);
for (let 索引值217 = 0; 索引值217 < 16; 索引值217++) {
写入器包装[索引值217] = 视图.getUint32(块218 + 索引值217 * 4, false);
}
for (let 索引值216 = 16; 索引值216 < 64; 索引值216++) {
const 值0215 = 处理值值200(写入器包装[索引值216 - 15], 7) ^ 处理值值200(写入器包装[索引值216 - 15], 18) ^ 写入器包装[索引值216 - 15] >>> 3;
const 值1214 = 处理值值200(写入器包装[索引值216 - 2], 17) ^ 处理值值200(写入器包装[索引值216 - 2], 19) ^ 写入器包装[索引值216 - 2] >>> 10;
写入器包装[索引值216] = 写入器包装[索引值216 - 16] + 值0215 + 写入器包装[索引值216 - 7] + 值1214 >>> 0;
}
let [甲值213, 乙值, 丙值212, 丁值211, 事件值210, 表单值, 本地值209, 头值208] = 头部游标;
for (let 索引值207 = 0; 索引值207 < 64; 索引值207++) {
const 值1206 = 处理值值200(事件值210, 6) ^ 处理值值200(事件值210, 11) ^ 处理值值200(事件值210, 25);
const 本地值205 = 事件值210 & 表单值 ^ ~事件值210 & 本地值209;
const 值1 = 头值208 + 值1206 + 本地值205 + 本地值222[索引值207] + 写入器包装[索引值207] >>> 0;
const 值0 = 处理值值200(甲值213, 2) ^ 处理值值200(甲值213, 13) ^ 处理值值200(甲值213, 22);
const 本地值204 = 甲值213 & 乙值 ^ 甲值213 & 丙值212 ^ 乙值 & 丙值212;
const 值2203 = 值0 + 本地值204 >>> 0;
头值208 = 本地值209;
本地值209 = 表单值;
表单值 = 事件值210;
事件值210 = 丁值211 + 值1 >>> 0;
丁值211 = 丙值212;
丙值212 = 乙值;
乙值 = 甲值213;
甲值213 = 值1 + 值2203 >>> 0;
}
头部游标[0] = 头部游标[0] + 甲值213 >>> 0;
头部游标[1] = 头部游标[1] + 乙值 >>> 0;
头部游标[2] = 头部游标[2] + 丙值212 >>> 0;
头部游标[3] = 头部游标[3] + 丁值211 >>> 0;
头部游标[4] = 头部游标[4] + 事件值210 >>> 0;
头部游标[5] = 头部游标[5] + 表单值 >>> 0;
头部游标[6] = 头部游标[6] + 本地值209 >>> 0;
头部游标[7] = 头部游标[7] + 头值208 >>> 0;
}
const 结果202 = [];
for (let 索引值201 = 0; 索引值201 < 7; 索引值201++) {
结果202.push((头部游标[索引值201] >>> 24 & 0xff).toString(16).padStart(2, '0'), (头部游标[索引值201] >>> 16 & 0xff).toString(16).padStart(2, '0'), (头部游标[索引值201] >>> 8 & 0xff).toString(16).padStart(2, '0'), (头部游标[索引值201] & 0xff).toString(16).padStart(2, '0'));
}
return 结果202.join('');
}
function 处理值值200(值199, 本地值198) {
return 值199 >>> 本地值198 | 值199 << 32 - 本地值198;
}
let 值值197 = 0;
const 值超文本缓冲大小 = 128 * 1024;
const 连接超时值 = 5000;
const 值超时值 = 45000;
const 上限值196 = 2;
const 上限值 = 32;
function 处理扩展超文本值195(本地值194) {
return new Promise(结果值193 => setTimeout(结果值193, 本地值194));
}
function 验证唯一标识扩展超文本(标识192, 唯一标识191) {
for (let 索引190 = 0; 索引190 < 16; 索引190++) {
if (标识192[索引190] !== 唯一标识191[索引190]) {
return false;
}
}
return true;
}
class 扩展超文本计数器 {
#total;
constructor() {
this.#total = 0;
}
get() {
return this.#total;
}
add(大小189) {
this.#total += 大小189;
}
}
function 处理值值值(首次, ...本地值188) {
let 长度 = 首次.length;
for (let 甲值187 of 本地值188) {
长度 += 甲值187.length;
}
const 结果值186 = new 首次.constructor(长度);
结果值186.set(首次, 0);
长度 = 首次.length;
for (let 甲值185 of 本地值188) {
结果值186.set(甲值185, 长度);
长度 += 甲值185.length;
}
return 结果值186;
}
function 解析唯一标识扩展超文本(唯一标识184) {
唯一标识184 = 唯一标识184.replaceAll('-', '');
const 结果值183 = [];
for (let 索引182 = 0; 索引182 < 16; 索引182++) {
const 取值181 = parseInt(唯一标识184.substr(索引182 * 2, 2), 16);
结果值183.push(取值181);
}
return 结果值183;
}
function 获取扩展超文本缓冲(大小) {
return new Uint8Array(new ArrayBuffer(大小 || 值超文本缓冲大小));
}
async function 读取扩展超文本头部(本地值180, 唯一标识字符串) {
const 读取器179 = 本地值180.getReader({
mode: 'byob'
});
try {
let 结果值178 = await 读取器179.readAtLeast(1 + 16 + 1, 获取扩展超文本缓冲());
let 本地值177 = 0;
let 索引 = 0;
let 缓存 = 结果值178.value;
本地值177 += 结果值178.value.length;
const 本地值176 = 缓存[0];
const 标识175 = 缓存.slice(1, 1 + 16);
const 唯一标识174 = 解析唯一标识扩展超文本(唯一标识字符串);
if (!验证唯一标识扩展超文本(标识175, 唯一标识174)) {
return `invalid UUID`;
}
const 值长度173 = 缓存[1 + 16];
const 地址值1 = 1 + 16 + 1 + 值长度173 + 1 + 2 + 1;
if (地址值1 + 1 > 本地值177) {
if (结果值178.done) {
return `header too short`;
}
索引 = 地址值1 + 1 - 本地值177;
结果值178 = await 读取器179.readAtLeast(索引, 获取扩展超文本缓冲());
本地值177 += 结果值178.value.length;
缓存 = 处理值值值(缓存, 结果值178.value);
}
const 命令 = 缓存[1 + 16 + 1 + 值长度173];
if (命令 !== 1) {
return `unsupported command: ${命令}`;
}
const 端口172 = (缓存[地址值1 - 1 - 2] << 8) + 缓存[地址值1 - 1 - 1];
const 本地值171 = 缓存[地址值1 - 1];
let 头部长度 = -1;
if (本地值171 === 地址类型_四版) {
头部长度 = 地址值1 + 4;
} else if (本地值171 === 地址类型_六版) {
头部长度 = 地址值1 + 16;
} else if (本地值171 === 地址类型_网址) {
头部长度 = 地址值1 + 1 + 缓存[地址值1];
}
if (头部长度 < 0) {
return 'read address type failed';
}
索引 = 头部长度 - 本地值177;
if (索引 > 0) {
if (结果值178.done) {
return `read address failed`;
}
结果值178 = await 读取器179.readAtLeast(索引, 获取扩展超文本缓冲());
本地值177 += 结果值178.value.length;
缓存 = 处理值值值(缓存, 结果值178.value);
}
let 主机名170 = '';
索引 = 地址值1;
switch (本地值171) {
case 地址类型_四版:
主机名170 = 缓存.slice(索引, 索引 + 4).join('.');
break;
case 地址类型_网址:
主机名170 = new TextDecoder().decode(缓存.slice(索引 + 1, 索引 + 1 + 缓存[索引]));
break;
case 地址类型_六版:
主机名170 = 缓存.slice(索引, 索引 + 16).reduce((字符串值, 值2169, 值2, 甲值) => 值2 % 2 ? 字符串值.concat(((甲值[值2 - 1] << 8) + 值2169).toString(16)) : 字符串值, []).join(':');
break;
}
if (主机名170.length < 1) {
return 'failed to parse hostname';
}
const 数据 = 缓存.slice(头部长度);
return {
hostname: 主机名170,
port: 端口172,
data: 数据,
resp: new Uint8Array([本地值176, 0]),
reader: 读取器179,
done: 结果值178.done
};
} catch (错误168) {
try {
读取器179.releaseLock();
} catch (忽略值167) {}
throw 错误168;
}
}
async function 处理值值远程扩展超文本(计数器166, 写入器165, 本地值164) {
async function 处理值值(丁值) {
if (!丁值 || 丁值.length === 0) {
return;
}
计数器166.add(丁值.length);
try {
await 写入器165.write(丁值);
} catch (错误163) {
throw 错误163;
}
}
try {
await 处理值值(本地值164.data);
let 块数量162 = 0;
while (!本地值164.done) {
const 结果值161 = await 本地值164.reader.read(获取扩展超文本缓冲());
if (结果值161.done) break;
await 处理值值(结果值161.value);
本地值164.done = 结果值161.done;
块数量162++;
if (块数量162 % 10 === 0) {
await 处理扩展超文本值195(0);
}
if (!结果值161.value || 结果值161.value.length === 0) {
await 处理扩展超文本值195(2);
}
}
} catch (错误160) {
throw 错误160;
}
}
function 创建扩展超文本值159(本地值158, 本地值157) {
const 计数器156 = new 扩展超文本计数器();
const 写入器155 = 本地值157.getWriter();
const 本地值154 = (async () => {
try {
await 处理值值远程扩展超文本(计数器156, 写入器155, 本地值158);
} catch (错误153) {
throw 错误153;
} finally {
try {
await 写入器155.close();
} catch (错误152) {}
}
})();
return {
counter: 计数器156,
done: 本地值154,
abort: () => {
try {
写入器155.abort();
} catch (忽略值151) {}
}
};
}
function 创建扩展超文本值(本地值150, 远程值) {
const 计数器 = new 扩展超文本计数器();
let 流;
const 本地值149 = new Promise((本地值148, 本地值147) => {
流 = new TransformStream({
start(控制器146) {
计数器.add(本地值150.length);
控制器146.enqueue(本地值150);
},
transform(块, 控制器145) {
计数器.add(块.length);
控制器145.enqueue(块);
},
cancel(本地值144) {
本地值147(`download cancelled: ${本地值144}`);
}
}, null, new ByteLengthQueuingStrategy({
highWaterMark: 值超文本缓冲大小
}));
let 值值143 = Date.now();
const 值计时器 = setInterval(() => {
if (Date.now() - 值值143 > 值超时值) {
try {
流.writable.abort?.('idle timeout');
} catch (忽略值142) {}
clearInterval(值计时器);
本地值147('idle timeout');
}
}, 5000);
const 读取器 = 远程值.getReader();
const 写入器 = 流.writable.getWriter();
;
(async () => {
try {
let 块数量 = 0;
while (true) {
const 结果值141 = await 读取器.read();
if (结果值141.done) {
break;
}
值值143 = Date.now();
await 写入器.write(结果值141.value);
块数量++;
if (块数量 % 5 === 0) {
await 处理扩展超文本值195(0);
}
}
await 写入器.close();
本地值148();
} catch (错误140) {
本地值147(错误140);
} finally {
try {
读取器.releaseLock();
} catch (忽略值139) {}
try {
写入器.releaseLock();
} catch (忽略值138) {}
clearInterval(值计时器);
}
})();
});
return {
readable: 流.readable,
counter: 计数器,
done: 本地值149,
abort: () => {
try {
流.readable.cancel();
} catch (忽略值137) {}
try {
流.writable.abort();
} catch (忽略值136) {}
}
};
}
async function 连接值远程扩展超文本(本地值135, ...本地值134) {
let 本地值133 = 0;
let 值错误;
const 连接列表 = [本地值135.hostname, ...本地值134.filter(结果值 => 结果值 && 结果值 !== 本地值135.hostname)];
for (const 主机名 of 连接列表) {
if (!主机名) continue;
本地值133 = 0;
while (本地值133 < 上限值196) {
本地值133++;
try {
const 远程 = 连接({
hostname: 主机名,
port: 本地值135.port
});
const 超时承诺 = 处理扩展超文本值195(连接超时值).then(() => {
throw new Error(atob('Y29ubmVjdCB0aW1lb3V0'));
});
await Promise.race([远程.opened, 超时承诺]);
const 本地值132 = 创建扩展超文本值159(本地值135, 远程.writable);
const 本地值131 = 创建扩展超文本值(本地值135.resp, 远程.readable);
return {
downloader: 本地值131,
uploader: 本地值132,
close: () => {
try {
远程.close();
} catch (忽略值130) {}
}
};
} catch (错误129) {
值错误 = 错误129;
if (本地值133 < 上限值196) {
await 处理扩展超文本值195(500 * 本地值133);
}
}
}
}
return null;
}
async function 处理扩展超文本客户端(主体128, 唯一标识) {
if (值值197 >= 上限值) {
return new Response('Too many connections', {
status: 429
});
}
值值197++;
let 本地值127 = false;
const 本地值126 = () => {
if (!本地值127) {
值值197 = Math.max(0, 值值197 - 1);
本地值127 = true;
}
};
try {
const 本地值125 = await 读取扩展超文本头部(主体128, 唯一标识);
if (typeof 本地值125 !== 'object' || !本地值125) {
return null;
}
const 远程连接 = await 连接值远程扩展超文本(本地值125, 回退地址, '13.230.34.30');
if (远程连接 === null) {
return null;
}
const 连接值 = Promise.race([(async () => {
try {
await 远程连接.downloader.done;
} catch (错误124) {}
})(), (async () => {
try {
await 远程连接.uploader.done;
} catch (错误123) {}
})(), 处理扩展超文本值195(值超时值).then(() => {})]).finally(() => {
try {
远程连接.close();
} catch (忽略值122) {}
try {
远程连接.downloader.abort();
} catch (忽略值121) {}
try {
远程连接.uploader.abort();
} catch (忽略值) {}
本地值126();
});
return {
readable: 远程连接.downloader.readable,
closed: 连接值
};
} catch (错误120) {
本地值126();
return null;
}
}
async function 处理扩展超文本值(请求119) {
try {
return await 处理扩展超文本客户端(请求119.body, 认证令牌);
} catch (错误118) {
return null;
}
}
function 处理基础64值数组(值64字符串) {
if (!值64字符串) return {
error: null
};
try {
值64字符串 = 值64字符串.replace(/-/g, '+').replace(/_/g, '/');
return {
earlyData: Uint8Array.from(atob(值64字符串), 丙值117 => 丙值117.charCodeAt(0)).buffer,
error: null
};
} catch (错误116) {
return {
error: 错误116
};
}
}
function 关闭套接字值(套接字) {
try {
if (套接字.readyState === 1 || 套接字.readyState === 2) 套接字.close();
} catch (错误115) {}
}
const 十六进制值 = Array.from({
length: 256
}, (取值, 索引值) => (索引值 + 256).toString(16).slice(1));
function 处理格式值(本地值114, 偏移 = 0) {
const 标识 = (十六进制值[本地值114[偏移]] + 十六进制值[本地值114[偏移 + 1]] + 十六进制值[本地值114[偏移 + 2]] + 十六进制值[本地值114[偏移 + 3]] + "-" + 十六进制值[本地值114[偏移 + 4]] + 十六进制值[本地值114[偏移 + 5]] + "-" + 十六进制值[本地值114[偏移 + 6]] + 十六进制值[本地值114[偏移 + 7]] + "-" + 十六进制值[本地值114[偏移 + 8]] + 十六进制值[本地值114[偏移 + 9]] + "-" + 十六进制值[本地值114[偏移 + 10]] + 十六进制值[本地值114[偏移 + 11]] + 十六进制值[本地值114[偏移 + 12]] + 十六进制值[本地值114[偏移 + 13]] + 十六进制值[本地值114[偏移 + 14]] + 十六进制值[本地值114[偏移 + 15]]).toLowerCase();
if (!是否有效格式(标识)) throw new TypeError(错误_无效标识字符串);
return 标识;
}
async function 获取值解析新地址列表() {
const 网址113 = 优选地址源;
try {
const 网址列表112 = 网址113.includes(',') ? 网址113.split(',').map(网址值111 => 网址值111.trim()).filter(网址值 => 网址值) : [网址113];
const 接口结果列表 = await 获取优选接口(网址列表112, '443', 5000);
if (接口结果列表.length > 0) {
const 结果列表110 = [];
const 正则 = /^(\[[\da-fA-F:]+\]|[\d.]+|[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?)*)(?::(\d+))?(?:#(.+))?$/;
for (const 项目109 of 接口结果列表) {
const 本地值108 = 项目109.match(正则);
if (本地值108) {
结果列表110.push({
ip: 本地值108[1],
port: parseInt(本地值108[2] || '443', 10),
name: 本地值108[3]?.trim() || 本地值108[1]
});
}
}
return 结果列表110;
}
const 响应107 = await fetch(网址113);
if (!响应107.ok) return [];
const 文本106 = await 响应107.text();
const 结果列表105 = [];
const 行列表104 = 文本106.trim().replace(/\r/g, "").split('\n');
const 值正则 = /^([^:]+):(\d+)#(.*)$/;
for (const 行103 of 行列表104) {
const 值行 = 行103.trim();
if (!值行) continue;
const 本地值102 = 值行.match(值正则);
if (本地值102) {
结果列表105.push({
ip: 本地值102[1],
port: parseInt(本地值102[2], 10),
name: 本地值102[3].trim() || 本地值102[1]
});
}
}
return 结果列表105;
} catch (错误101) {
return [];
}
}
function 生成链接列表来源新地址列表(列表100, 用户99, 工作器域名98, 加密客户端问候配置97 = null, 跳过编号96 = false, 别名命名器95 = null) {
const 云墙超文本端口94 = [80, 8080, 8880, 2052, 2082, 2086, 2095];
const 云墙安全超文本端口93 = [443, 2053, 2083, 2087, 2096, 8443];
const 链接列表92 = [];
const 网页套接字路径91 = '/?ed=2048';
const 协议 = atob('dmxlc3M=');
const 制作节点名称90 = 别名命名器95 || 创建值节点命名器(跳过编号96);
for (const 项目89 of 列表100) {
const 端口88 = 项目89.port;
const 安全地址87 = 项目89.ip.includes(':') ? `[${项目89.ip}]` : 项目89.ip;
if (云墙安全超文本端口93.includes(端口88)) {
const 网页套接字节点名称86 = 制作节点名称90(项目89);
let 链接85 = `${协议}://${用户99}@${安全地址87}:${端口88}?encryption=none&security=tls&sni=${工作器域名98}&fp=${启用加密客户端问候 ? 'chrome' : 'randomized'}&type=ws&host=${工作器域名98}&path=${网页套接字路径91}`;
if (自定义应用层协议协商) 链接85 += `&alpn=${encodeURIComponent(自定义应用层协议协商)}`;
// 如果启用了ECH,添加ech参数(ECH需要伪装成Chrome浏览器)
if (启用加密客户端问候) {
const 域名系统值84 = 自定义域名系统 || 'https://223.5.5.5/dns-query';
const 加密客户端问候域名83 = 自定义加密客户端问候域名 || 'cloudflare-ech.com';
链接85 += `&ech=${encodeURIComponent(`${加密客户端问候域名83}+${域名系统值84}`)}`;
}
链接85 += `#${encodeURIComponent(网页套接字节点名称86)}`;
链接列表92.push(链接85);
} else if (云墙超文本端口94.includes(端口88)) {
if (!禁用非传输层安全) {
const 网页套接字节点名称82 = 制作节点名称90(项目89);
const 链接81 = `${协议}://${用户99}@${安全地址87}:${端口88}?encryption=none&security=none&type=ws&host=${工作器域名98}&path=${网页套接字路径91}#${encodeURIComponent(网页套接字节点名称82)}`;
链接列表92.push(链接81);
}
} else {
const 网页套接字节点名称80 = 制作节点名称90(项目89);
let 链接79 = `${协议}://${用户99}@${安全地址87}:${端口88}?encryption=none&security=tls&sni=${工作器域名98}&fp=${启用加密客户端问候 ? 'chrome' : 'randomized'}&type=ws&host=${工作器域名98}&path=${网页套接字路径91}`;
if (自定义应用层协议协商) 链接79 += `&alpn=${encodeURIComponent(自定义应用层协议协商)}`;
// 如果启用了ECH,添加ech参数(ECH需要伪装成Chrome浏览器)
if (启用加密客户端问候) {
const 域名系统值78 = 自定义域名系统 || 'https://223.5.5.5/dns-query';
const 加密客户端问候域名77 = 自定义加密客户端问候域名 || 'cloudflare-ech.com';
链接79 += `&ech=${encodeURIComponent(`${加密客户端问候域名77}+${域名系统值78}`)}`;
}
链接79 += `#${encodeURIComponent(网页套接字节点名称80)}`;
链接列表92.push(链接79);
}
}
return 链接列表92;
}
function 生成扩展超文本链接列表来源源(列表76, 用户75, 工作器域名74, 加密客户端问候配置73 = null, 跳过编号72 = false, 别名命名器71 = null) {
const 链接列表70 = [];
const 节点路径 = 用户75.substring(0, 8);
const 制作节点名称69 = 别名命名器71 || 创建值节点命名器(跳过编号72);
for (const 项目68 of 列表76) {
const 安全地址67 = 项目68.ip.includes(':') ? `[${项目68.ip}]` : 项目68.ip;
const 端口66 = 项目68.port || 443;
const 网页套接字节点名称65 = 制作节点名称69(项目68);
const 参数 = new URLSearchParams({
encryption: 'none',
security: 'tls',
sni: 工作器域名74,
fp: 'chrome',
type: 'xhttp',
host: 工作器域名74,
path: `/${节点路径}`,
mode: 'stream-one'
});
处理值应用层协议协商值(参数);
if (启用加密客户端问候) {
const 域名系统值64 = 自定义域名系统 || 'https://223.5.5.5/dns-query';
const 加密客户端问候域名63 = 自定义加密客户端问候域名 || 'cloudflare-ech.com';
参数.set('ech', `${加密客户端问候域名63}+${域名系统值64}`);
}
链接列表70.push(`${解码64('dmxlc3M6Ly8=')}${用户75}@${安全地址67}:${端口66}?${参数.toString()}#${encodeURIComponent(网页套接字节点名称65)}`);
}
return 链接列表70;
}
async function 生成木马链接列表来源新地址列表(列表, 用户, 工作器域名, 加密客户端问候配置 = null, 跳过编号 = false, 别名命名器 = null) {
const 云墙超文本端口 = [80, 8080, 8880, 2052, 2082, 2086, 2095];
const 云墙安全超文本端口 = [443, 2053, 2083, 2087, 2096, 8443];
const 链接列表 = [];
const 网页套接字路径 = '/?ed=2048';
const 密码 = 传输路径 || 用户;
const 制作节点名称 = 别名命名器 || 创建值节点命名器(跳过编号);
for (const 项目62 of 列表) {
const 端口61 = 项目62.port;
const 安全地址 = 项目62.ip.includes(':') ? `[${项目62.ip}]` : 项目62.ip;
if (云墙安全超文本端口.includes(端口61)) {
const 网页套接字节点名称60 = 制作节点名称(项目62);
let 链接59 = `${atob('dHJvamFuOi8v')}${密码}@${安全地址}:${端口61}?security=tls&sni=${工作器域名}&fp=chrome&type=ws&host=${工作器域名}&path=${网页套接字路径}`;
if (自定义应用层协议协商) 链接59 += `&alpn=${encodeURIComponent(自定义应用层协议协商)}`;
// 如果启用了ECH,添加ech参数(ECH需要伪装成Chrome浏览器)
if (启用加密客户端问候) {
const 域名系统值58 = 自定义域名系统 || 'https://223.5.5.5/dns-query';
const 加密客户端问候域名57 = 自定义加密客户端问候域名 || 'cloudflare-ech.com';
链接59 += `&ech=${encodeURIComponent(`${加密客户端问候域名57}+${域名系统值58}`)}`;
}
链接59 += `#${encodeURIComponent(网页套接字节点名称60)}`;
链接列表.push(链接59);
} else if (云墙超文本端口.includes(端口61)) {
if (!禁用非传输层安全) {
const 网页套接字节点名称56 = 制作节点名称(项目62);
const 链接55 = `${atob('dHJvamFuOi8v')}${密码}@${安全地址}:${端口61}?security=none&type=ws&host=${工作器域名}&path=${网页套接字路径}#${encodeURIComponent(网页套接字节点名称56)}`;
链接列表.push(链接55);
}
} else {
const 网页套接字节点名称 = 制作节点名称(项目62);
let 链接 = `${atob('dHJvamFuOi8v')}${密码}@${安全地址}:${端口61}?security=tls&sni=${工作器域名}&fp=chrome&type=ws&host=${工作器域名}&path=${网页套接字路径}`;
if (自定义应用层协议协商) 链接 += `&alpn=${encodeURIComponent(自定义应用层协议协商)}`;
// 如果启用了ECH,添加ech参数(ECH需要伪装成Chrome浏览器)
if (启用加密客户端问候) {
const 域名系统值 = 自定义域名系统 || 'https://223.5.5.5/dns-query';
const 加密客户端问候域名 = 自定义加密客户端问候域名 || 'cloudflare-ech.com';
链接 += `&ech=${encodeURIComponent(`${加密客户端问候域名}+${域名系统值}`)}`;
}
链接 += `#${encodeURIComponent(网页套接字节点名称)}`;
链接列表.push(链接);
}
}
return 链接列表;
}
async function 处理配置接口(请求54, 环境值 = {}) {
if (请求54.method === 'GET') {
if (!键值存储) {
return new Response(JSON.stringify({
error: 'KV存储未配置',
kvEnabled: false
}), {
status: 503,
headers: {
'Content-Type': 'application/json'
}
});
}
return new Response(JSON.stringify({
...获取有效配置快照(环境值),
kvEnabled: true
}), {
headers: {
'Content-Type': 'application/json'
}
});
} else if (请求54.method === 'POST') {
if (!键值存储) {
return new Response(JSON.stringify({
success: false,
message: 'KV存储未配置,无法保存配置'
}), {
status: 503,
headers: {
'Content-Type': 'application/json'
}
});
}
try {
const 新配置 = await 请求54.json();
for (const [键, 值] of Object.entries(新配置)) {
if (值 === '' || 值 === null || 值 === undefined) {
delete 键值配置[键];
} else {
键值配置[键] = 值;
}
}
await 保存键值配置();
更新配置值();
if (新配置.yx !== undefined) {
更新自定义优选来源值();
}
return new Response(JSON.stringify({
success: true,
message: '配置已保存',
config: 获取有效配置快照(环境值)
}), {
headers: {
'Content-Type': 'application/json'
}
});
} catch (错误53) {
return new Response(JSON.stringify({
success: false,
message: '保存配置失败: ' + 错误53.message
}), {
status: 500,
headers: {
'Content-Type': 'application/json'
}
});
}
}
return new Response(JSON.stringify({
error: 'Method not allowed'
}), {
status: 405,
headers: {
'Content-Type': 'application/json'
}
});
}
async function 处理优选地址列表接口(请求) {
if (!键值存储) {
return new Response(JSON.stringify({
success: false,
error: 'KV存储未配置',
message: '需要配置KV存储才能使用此功能'
}), {
status: 503,
headers: {
'Content-Type': 'application/json'
}
});
}
const 本地值52 = 获取配置值('ae', '') === 'yes';
if (!本地值52) {
return new Response(JSON.stringify({
success: false,
error: 'API功能未启用',
message: '出于安全考虑,优选IP API功能默认关闭。请在配置管理页面开启"允许API管理"选项后使用。'
}), {
status: 403,
headers: {
'Content-Type': 'application/json'
}
});
}
try {
if (请求.method === 'GET') {
const 值值51 = 获取配置值('yx', '');
const 本地值50 = 解析值值数组(值值51);
return new Response(JSON.stringify({
success: true,
count: 本地值50.length,
data: 本地值50
}), {
headers: {
'Content-Type': 'application/json'
}
});
} else if (请求.method === 'POST') {
const 主体49 = await 请求.json();
const 地址列表值添加 = Array.isArray(主体49) ? 主体49 : [主体49];
if (地址列表值添加.length === 0) {
return new Response(JSON.stringify({
success: false,
error: '请求数据为空',
message: '请提供IP数据'
}), {
status: 400,
headers: {
'Content-Type': 'application/json'
}
});
}
const 值值48 = 获取配置值('yx', '');
let 本地值47 = 解析值值数组(值值48);
const 值地址列表46 = [];
const 值地址列表45 = [];
const 错误列表 = [];
for (const 项目44 of 地址列表值添加) {
if (!项目44.ip) {
错误列表.push({
ip: '未知',
reason: 'IP地址是必需的'
});
continue;
}
const 端口43 = 项目44.port || 443;
const 名称 = 项目44.name || `API优选-${项目44.ip}:${端口43}`;
if (!是否有效地址(项目44.ip) && !是否有效域名(项目44.ip)) {
错误列表.push({
ip: 项目44.ip,
reason: '无效的IP或域名格式'
});
continue;
}
const 本地值42 = 本地值47.some(值项目 => 值项目.ip === 项目44.ip && 值项目.port === 端口43);
if (本地值42) {
值地址列表45.push({
ip: 项目44.ip,
port: 端口43,
reason: '已存在'
});
continue;
}
const 新地址 = {
ip: 项目44.ip,
port: 端口43,
name: 名称,
addedAt: new Date().toISOString()
};
本地值47.push(新地址);
值地址列表46.push(新地址);
}
if (值地址列表46.length > 0) {
const 新值值41 = 处理数组值值(本地值47);
await 设置配置值('yx', 新值值41);
更新自定义优选来源值();
}
return new Response(JSON.stringify({
success: 值地址列表46.length > 0,
message: `成功添加 ${值地址列表46.length} 个IP`,
added: 值地址列表46.length,
skipped: 值地址列表45.length,
errors: 错误列表.length,
data: {
addedIPs: 值地址列表46,
skippedIPs: 值地址列表45.length > 0 ? 值地址列表45 : undefined,
errors: 错误列表.length > 0 ? 错误列表 : undefined
}
}), {
headers: {
'Content-Type': 'application/json'
}
});
} else if (请求.method === 'DELETE') {
const 主体 = await 请求.json();
if (主体.all === true) {
const 值值40 = 获取配置值('yx', '');
const 本地值39 = 解析值值数组(值值40);
const 值数量 = 本地值39.length;
await 设置配置值('yx', '');
更新自定义优选来源值();
return new Response(JSON.stringify({
success: true,
message: `已清空所有优选IP,共删除 ${值数量} 个`,
deletedCount: 值数量
}), {
headers: {
'Content-Type': 'application/json'
}
});
}
if (!主体.ip) {
return new Response(JSON.stringify({
success: false,
error: 'IP地址是必需的',
message: '请提供要删除的ip字段,或使用 {"all": true} 清空所有'
}), {
status: 400,
headers: {
'Content-Type': 'application/json'
}
});
}
const 端口38 = 主体.port || 443;
const 值值37 = 获取配置值('yx', '');
let 本地值36 = 解析值值数组(值值37);
const 值长度 = 本地值36.length;
const 值地址列表 = 本地值36.filter(项目35 => !(项目35.ip === 主体.ip && 项目35.port === 端口38));
if (值地址列表.length === 值长度) {
return new Response(JSON.stringify({
success: false,
error: '优选IP不存在',
message: `${主体.ip}:${端口38} 未找到`
}), {
status: 404,
headers: {
'Content-Type': 'application/json'
}
});
}
const 新值值 = 处理数组值值(值地址列表);
await 设置配置值('yx', 新值值);
更新自定义优选来源值();
return new Response(JSON.stringify({
success: true,
message: '优选IP已删除',
deleted: {
ip: 主体.ip,
port: 端口38
}
}), {
headers: {
'Content-Type': 'application/json'
}
});
} else {
return new Response(JSON.stringify({
success: false,
error: '不支持的请求方法',
message: '支持的方法: GET, POST, DELETE'
}), {
status: 405,
headers: {
'Content-Type': 'application/json'
}
});
}
} catch (错误34) {
return new Response(JSON.stringify({
success: false,
error: '处理请求失败',
message: 错误34.message
}), {
status: 500,
headers: {
'Content-Type': 'application/json'
}
});
}
}
function 更新配置值() {
const 有效配置 = 获取有效配置快照();
const 手动地区 = 有效配置.wk;
if (手动地区 && 手动地区.trim()) {
手动工作器地区 = 手动地区.trim().toUpperCase();
当前工作器地区 = 手动工作器地区;
} else {
const 本地值 = 有效配置.p;
if (本地值 && 本地值.trim()) {
当前工作器地区 = 'CUSTOM';
} else {
手动工作器地区 = '';
当前工作器地区 = '';
}
}
启用地区匹配 = !(有效配置.rm && 有效配置.rm.toLowerCase() === 'no');
启用明文 = 有效配置.ev === 'yes';
启用木马 = 有效配置.et === 'yes';
启用扩展传输 = 有效配置.ex === 'yes';
传输路径 = 有效配置.tp || '';
订阅转换接口 = 有效配置.scu || 配置默认值.scu;
启用优选域名 = 有效配置.epd === 'yes';
启用优选地址 = 有效配置.epi === 'yes';
启用仓库优选 = 有效配置.egi === 'yes';
启用原生地址 = 有效配置.ena === 'yes';
启用加密客户端问候 = 有效配置.ech === 'yes';
自定义域名系统 = 有效配置.customDNS || 配置默认值.customDNS;
自定义加密客户端问候域名 = 有效配置.customECHDomain || 配置默认值.customECHDomain;
自定义应用层协议协商 = 规范化应用层协议协商(有效配置.alpn || '');
禁用非传输层安全 = 有效配置.dkby === 'yes' || 启用加密客户端问候;
启用代理降级 = !!(有效配置.qj && 有效配置.qj.toLowerCase() === 'no');
自定义路径 = 有效配置.d || '';
优选地址源 = 有效配置.yxURL || '';
回退地址 = 有效配置.p ? 有效配置.p.trim() : '';
代理5配置 = 有效配置.s || '';
if (代理5配置) {
try {
已解析代理5配置 = 解析代理配置(代理5配置);
是否代理已启用 = true;
} catch (错误31) {
是否代理已启用 = false;
}
} else {
已解析代理5配置 = {};
是否代理已启用 = false;
}
禁用优选 = !!(有效配置.yxby && 有效配置.yxby.toLowerCase() === 'yes');
}
function 更新自定义优选来源值() {
const 值值30 = 获取配置值('yx', '');
if (值值30) {
try {
const 优选列表 = 值值30.split(',').map(项目29 => 项目29.trim()).filter(项目28 => 项目28);
自定义优选地址列表 = [];
自定义优选域名列表 = [];
优选列表.forEach(项目27 => {
let 节点名称26 = '';
let 地址部分25 = 项目27;
if (项目27.includes('#')) {
const 部分列表24 = 项目27.split('#');
地址部分25 = 部分列表24[0].trim();
节点名称26 = 部分列表24[1].trim();
}
const {
address: 地址23,
port: 端口22
} = 解析地址值端口(地址部分25);
if (!节点名称26) {
节点名称26 = '自定义优选-' + 地址23 + (端口22 ? ':' + 端口22 : '');
}
if (是否有效地址(地址23)) {
自定义优选地址列表.push({
ip: 地址23,
port: 端口22,
isp: 节点名称26
});
} else {
自定义优选域名列表.push({
domain: 地址23,
port: 端口22,
name: 节点名称26
});
}
});
} catch (错误) {
自定义优选地址列表 = [];
自定义优选域名列表 = [];
}
} else {
自定义优选地址列表 = [];
自定义优选域名列表 = [];
}
}
function 解析值值数组(值值) {
if (!值值 || !值值.trim()) return [];
const 项目列表 = 值值.split(',').map(项目21 => 项目21.trim()).filter(项目20 => 项目20);
const 结果 = [];
for (const 项目19 of 项目列表) {
let 节点名称 = '';
let 地址部分 = 项目19;
if (项目19.includes('#')) {
const 部分列表 = 项目19.split('#');
地址部分 = 部分列表[0].trim();
节点名称 = 部分列表[1].trim();
}
const {
address: 地址,
port: 端口18
} = 解析地址值端口(地址部分);
if (!节点名称) {
节点名称 = 地址 + (端口18 ? ':' + 端口18 : '');
}
结果.push({
ip: 地址,
port: 端口18 || 443,
name: 节点名称,
addedAt: new Date().toISOString()
});
}
return 结果;
}
function 处理数组值值(数组) {
if (!数组 || 数组.length === 0) return '';
return 数组.map(项目 => {
const 端口17 = 项目.port || 443;
return `${项目.ip}:${端口17}#${项目.name}`;
}).join(',');
}
function 是否有效域名(域名) {
const 域名正则 = /^(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,}$/;
return 域名正则.test(域名);
}
async function 解析文本值数组(内容) {
var 已处理 = 内容.replace(/[ "'\r\n]+/g, ',').replace(/,+/g, ',');
if (已处理.charAt(0) == ',') 已处理 = 已处理.slice(1);
if (已处理.charAt(已处理.length - 1) == ',') 已处理 = 已处理.slice(0, 已处理.length - 1);
return 已处理.split(',');
}
async function 获取优选接口(网址列表, 默认端口 = '443', 超时 = 3000) {
if (!网址列表?.length) return [];
const 结果列表 = new Set();
await Promise.allSettled(网址列表.map(async 网址 => {
try {
const 控制器 = new AbortController();
const 超时标识 = setTimeout(() => 控制器.abort(), 超时);
const 响应 = await fetch(网址, {
signal: 控制器.signal
});
clearTimeout(超时标识);
let 文本 = '';
try {
const 缓冲 = await 响应.arrayBuffer();
const 内容类型 = (响应.headers.get('content-type') || '').toLowerCase();
const 字符集 = 内容类型.match(/charset=([^\s;]+)/i)?.[1]?.toLowerCase() || '';
let 解码器列表 = ['utf-8', 'gb2312'];
if (字符集.includes('gb') || 字符集.includes('gbk') || 字符集.includes('gb2312')) {
解码器列表 = ['gb2312', 'utf-8'];
}
let 解码成功 = false;
for (const 解码器 of 解码器列表) {
try {
const 已解码 = new TextDecoder(解码器).decode(缓冲);
if (已解码 && 已解码.length > 0 && !已解码.includes('\ufffd')) {
文本 = 已解码;
解码成功 = true;
break;
} else if (已解码 && 已解码.length > 0) {
continue;
}
} catch (事件值16) {
continue;
}
}
if (!解码成功) {
文本 = await 响应.text();
}
if (!文本 || 文本.trim().length === 0) {
return;
}
} catch (事件值15) {
return;
}
const 行列表 = 文本.trim().split('\n').map(行值14 => 行值14.trim()).filter(行值 => 行值);
const 是否值 = 行列表.length > 1 && 行列表[0].includes(',');
const 六版地址模式 = /^[^\[\]]*:[^\[\]]*:[^\[\]]/;
if (!是否值) {
行列表.forEach(行13 => {
const 井号索引 = 行13.indexOf('#');
const [主机部分, 备注] = 井号索引 > -1 ? [行13.substring(0, 井号索引), 行13.substring(井号索引)] : [行13, ''];
let 是否有端口 = false;
if (主机部分.startsWith('[')) {
是否有端口 = /\]:(\d+)$/.test(主机部分);
} else {
const 值索引 = 主机部分.lastIndexOf(':');
是否有端口 = 值索引 > -1 && /^\d+$/.test(主机部分.substring(值索引 + 1));
}
const 端口12 = new URL(网址).searchParams.get('port') || 默认端口;
结果列表.add(是否有端口 ? 行13 : `${主机部分}:${端口12}${备注}`);
});
} else {
const 头部列表 = 行列表[0].split(',').map(头值11 => 头值11.trim());
const 数据行列表 = 行列表.slice(1);
if (头部列表.includes('IP地址') && 头部列表.includes('端口') && 头部列表.includes('数据中心')) {
const 地址索引10 = 头部列表.indexOf('IP地址'),
端口索引 = 头部列表.indexOf('端口');
const 备注索引 = 头部列表.indexOf('国家') > -1 ? 头部列表.indexOf('国家') : 头部列表.indexOf('城市') > -1 ? 头部列表.indexOf('城市') : 头部列表.indexOf('数据中心');
const 传输层安全索引 = 头部列表.indexOf('TLS');
数据行列表.forEach(行9 => {
const 列列表8 = 行9.split(',').map(丙值7 => 丙值7.trim());
if (传输层安全索引 !== -1 && 列列表8[传输层安全索引]?.toLowerCase() !== 'true') return;
const 包裹地址6 = 六版地址模式.test(列列表8[地址索引10]) ? `[${列列表8[地址索引10]}]` : 列列表8[地址索引10];
结果列表.add(`${包裹地址6}:${列列表8[端口索引]}#${列列表8[备注索引]}`);
});
} else if (头部列表.some(头值5 => 头值5.includes('IP')) && 头部列表.some(头值4 => 头值4.includes('延迟')) && 头部列表.some(头值3 => 头值3.includes('下载速度'))) {
const 地址索引 = 头部列表.findIndex(头值2 => 头值2.includes('IP'));
const 延迟索引 = 头部列表.findIndex(头值1 => 头值1.includes('延迟'));
const 速度索引 = 头部列表.findIndex(头值 => 头值.includes('下载速度'));
const 端口 = new URL(网址).searchParams.get('port') || 默认端口;
数据行列表.forEach(行 => {
const 列列表 = 行.split(',').map(丙值 => 丙值.trim());
const 包裹地址 = 六版地址模式.test(列列表[地址索引]) ? `[${列列表[地址索引]}]` : 列列表[地址索引];
结果列表.add(`${包裹地址}:${端口}#CF优选 ${列列表[延迟索引]}ms ${列列表[速度索引]}MB/s`);
});
}
}
} catch (事件值) {}
}));
return Array.from(结果列表);
}
|