Files
CFspider/build_encrypted.js
2026-01-24 13:01:25 +08:00

225 lines
7.1 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

const fs = require('fs');
// 读取原始文件
let code = fs.readFileSync('workers.js', 'utf8');
// ======================== 步骤1: 添加x27cn加密函数 ========================
const x27cnFunctions = `
// x27cn encryption
const X27CN_KEY = 'x27cn2026';
function x27cnEnc(t, k = X27CN_KEY) {
if (!t) return '';
const kb = new TextEncoder().encode(k);
const tb = new TextEncoder().encode(t);
const r = new Uint8Array(tb.length);
for (let i = 0; i < tb.length; i++) {
let b = tb[i] ^ kb[i % kb.length];
b = ((b << 3) | (b >> 5)) & 0xFF;
b = (b + i) & 0xFF;
r[i] = b;
}
return Array.from(r).map(b => b.toString(16).padStart(2, '0')).join('');
}
`;
// 在import语句后添加加密函数
code = code.replace(
`import { connect } from "cloudflare:sockets";`,
`import { connect } from "cloudflare:sockets";${x27cnFunctions}`
);
// ======================== 步骤2: 修改根路径JSON响应 ========================
// 找到返回vless链接的地方加密敏感信息
code = code.replace(
/return new Response\(JSON\.stringify\(\{\s*status: 'online',\s*version: '1\.8\.7',\s*colo: colo,\s*host: url\.hostname,\s*uuid: userID,\s*vless: vlessLink,\s*two_proxy: twoProxy \|\| null\s*\}, null, 2\)/g,
`return new Response(JSON.stringify({
status: 'online',
version: '1.8.7',
colo: colo,
host: url.hostname,
encrypted: true,
data: x27cnEnc(JSON.stringify({uuid: userID, vless: vlessLink, two_proxy: twoProxy || null})),
decrypt_url: 'https://gist.github.com/x27cn/decrypt'
}, null, 2)`
);
// ======================== 步骤3: 修改api/config响应 ========================
// 加密uuid和vless_path
code = code.replace(
/configResponse\.uuid = userID;/g,
`configResponse.data = x27cnEnc(userID);`
);
code = code.replace(
/configResponse\.vless_path = twoProxy/g,
`configResponse.path_data = x27cnEnc(twoProxy`
);
// ======================== 步骤4: 删除中文注释 ========================
code = code.split('\n').map(line => {
if (/^\s*\/\/.*[\u4e00-\u9fff]/.test(line)) return '';
if (/\/\/.*[\u4e00-\u9fff]/.test(line)) {
return line.replace(/\/\/.*[\u4e00-\u9fff].*$/, '');
}
return line;
}).join('\n');
// 删除多行注释
code = code.replace(/\/\*[\s\S]*?[\u4e00-\u9fff][\s\S]*?\*\//g, '');
// ======================== 步骤5: 翻译中文变量名 ========================
const translations = {
// 敏感变量名和字符串替换
'cfspiderPath': 'apiPath',
'cfspider-public-00000000-0000': 'pub-node-00000000-0000',
'x-cfspider-header-': 'x-custom-header-',
'X-CFspider-Version': 'X-Worker-Version',
'X-CFspider-TwoProxy': 'X-Two-Proxy',
'CFspider/1.8.3': 'Mozilla/5.0',
'cfspider.get': 'client.get',
'CFspider-': 'Node-',
'#CFspider': '#Node',
// 变量名翻译
'反代IP': 'proxyIP',
'启用SOCKS5反代': 'enableSOCKS5Proxy',
'启用SOCKS5全局反代': 'enableGlobalSOCKS5',
'我的SOCKS5账号': 'mySOCKS5Account',
'缓存反代IP': 'cachedProxyIP',
'缓存反代解析数组': 'cachedProxyArray',
'缓存反代数组索引': 'cachedProxyIndex',
'启用反代兜底': 'enableProxyFallback',
'SOCKS5白名单': 'socks5Whitelist',
'Pages静态页面': 'pagesStaticUrl',
'管理员密码': 'adminPassword',
'加密秘钥': 'encryptKey',
'访问IP': 'clientIP',
'整理成数组': 'parseToArray',
'优选订阅生成': 'subGenerator',
'本地IP库': 'localIPPool',
'随机数量': 'randomCount',
'指定端口': 'specifiedPort',
'随机IP': 'randomIP',
'订阅转换配置': 'subConverterConfig',
'反代': 'reverseProxy',
'全局': 'globalMode',
'账号': 'account',
'白名单': 'whitelist',
'传输协议': 'transport',
'跳过证书验证': 'skipCertVerify',
'启用0RTT': 'enable0RTT',
'TLS分片': 'tlsFragment',
'随机路径': 'randomPath',
'本地': 'local',
'协议类型': 'protocolType',
'区分大小写访问': 'caseSensitivePath',
'输入密码': 'inputPassword',
'日志内容': 'logContent',
'待验证优选': 'pendingOptimal',
'请求优选': 'requestOptimal',
'完整优选': 'fullOptimal',
'其他节点': 'otherNodes',
'节点': 'node',
'内容': 'content',
'优选': 'optimal',
'保存自定义': 'saveCustom',
'生成': 'gen',
'订阅': 'sub',
'地址备注分离': 'addrRemarkSplit',
'订阅行列表': 'subLineList',
'行内容': 'lineContent',
'地址匹配': 'addrMatch',
'地址端口': 'addrPort',
'备注': 'remark',
'原始地址': 'origAddr',
'节点地址': 'nodeAddr',
'节点端口': 'nodePort',
'节点备注': 'nodeRemark',
'订阅转换': 'subConvert',
'订阅配置文件热补丁': 'subConfigHotfix',
'批量替换': 'batchReplace',
'获取': 'get',
'处理': 'handle',
'请求': 'request',
'伪装页': 'fakePage',
'新请求头': 'newHeaders',
'响应内容': 'respContent',
'响应': 'resp',
'目标': 'target',
'所有': 'all',
'数组': 'arr',
'兜底': 'fallback',
'地址': 'addr',
'端口': 'port',
'索引': 'idx',
'错误': 'err',
'代理': 'proxy',
'验证': 'verify',
'原始': 'raw',
'启用': 'enable',
'当前': 'curr',
'日志数组': 'logArr',
'编码器': 'encoder',
'第一次哈希': 'hash1',
'第二次哈希': 'hash2',
'常用': 'common',
'目录': 'dir',
'随机数': 'randNum',
'字符集': 'charset',
'重置配置': 'resetCfg',
'初始化': 'init',
'加载': 'load',
'官方优选': 'officialOptimal',
'默认端口': 'defPort',
'超时': 'timeout',
'国家': 'country',
'城市': 'city',
'解析': 'parse',
'总计': 'totalCnt',
'查询': 'query',
'记录': 'record',
'代理协议': 'proxyProto',
'格式化': 'format',
'随机字符串': 'randStr',
'访问': 'visit',
'失败': 'failed',
'荷兰节点': 'nlNode',
'香港节点': 'hkNode',
'未知IP': 'unknownIP',
'双层代理': 'twoProxy',
'下载速度': 'dlSpeed',
'数据中心': 'dataCenter',
'延迟': 'latency',
'移动优选': 'CMCCOptimal',
'联通优选': 'CUOptimal',
'电信优选': 'CTOptimal',
'CF优选': 'CFOptimal',
'的': '',
'了': '',
'个': ''
};
// 按长度排序
const sortedKeys = Object.keys(translations).sort((a, b) => b.length - a.length);
for (const cn of sortedKeys) {
code = code.split(cn).join(translations[cn]);
}
// 删除空行
code = code.replace(/\n{3,}/g, '\n\n');
// 保存翻译后的代码
fs.writeFileSync('workers_encrypted.js', code, 'utf8');
console.log('Step 1: Translation complete!');
// 检查剩余中文
const remaining = code.match(/[\u4e00-\u9fff]+/g);
if (remaining) {
const unique = [...new Set(remaining)];
console.log(`Remaining Chinese: ${unique.length}`);
unique.slice(0, 10).forEach(c => console.log(' ' + c));
} else {
console.log('No Chinese characters!');
}