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

122 lines
4.9 KiB
JavaScript
Raw 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_translated.js', 'utf8');
// ======================== 步骤1: 添加x27cn加密函数 ========================
const x27cnFunctions = `
const X27CN_KEY='x27cn2026';
function x27cnEnc(t,k=X27CN_KEY){if(!t)return'';const kb=new TextEncoder().encode(k),tb=new TextEncoder().encode(t),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响应 ========================
// 使用更精确的多行匹配
code = code.replace(
/return new Response\(JSON\.stringify\(\{\s*status:\s*'online',\s*version:\s*'1\.8\.7',\s*colo:\s*colo,\s*host:\s*url\.hostname,\s*uuid:\s*userID,\s*vless:\s*vlessLink,\s*two_proxy:\s*twoProxy\s*\|\|\s*null\s*\},\s*null,\s*2\),\s*\{\s*headers:\s*\{\s*'Content-Type':\s*'application\/json',\s*'Access-Control-Allow-Origin':\s*'\*'\s*\}\s*\}\);/g,
`return new Response(JSON.stringify({
s: 'ok',
v: '1.8.7',
c: colo,
h: url.hostname,
enc: true,
d: x27cnEnc(JSON.stringify({u: userID, l: vlessLink, t: twoProxy || null}))
}, null, 2), {
headers: { 'Content-Type': 'application/json', 'Access-Control-Allow-Origin': '*' }
});`
);
// ======================== 步骤3: 检查是否成功 ========================
if (code.includes('enc: true')) {
console.log('Root response encrypted successfully!');
} else {
console.log('WARNING: Root response not encrypted, trying alternative method...');
// 备用方法:按行替换
const lines = code.split('\n');
let inRootResponse = false;
let braceCount = 0;
let startLine = -1;
for (let i = 0; i < lines.length; i++) {
if (lines[i].includes("status: 'online'")) {
// 往前找到 return new Response
for (let j = i - 1; j >= 0 && j > i - 5; j--) {
if (lines[j].includes('return new Response(JSON.stringify({')) {
startLine = j;
inRootResponse = true;
braceCount = 1;
break;
}
}
}
if (inRootResponse && startLine !== -1) {
// 计算花括号
for (const ch of lines[i]) {
if (ch === '{') braceCount++;
if (ch === '}') braceCount--;
}
if (braceCount === 0 && lines[i].includes('});')) {
// 找到结束位置,替换整个响应块
const newResponse = ` return new Response(JSON.stringify({
s: 'ok',
v: '1.8.7',
c: colo,
h: url.hostname,
enc: true,
d: x27cnEnc(JSON.stringify({u: userID, l: vlessLink, t: twoProxy || null}))
}, null, 2), {
headers: { 'Content-Type': 'application/json', 'Access-Control-Allow-Origin': '*' }
});`;
// 删除原有行
lines.splice(startLine, i - startLine + 1, newResponse);
console.log('Replaced using alternative method!');
break;
}
}
}
code = lines.join('\n');
}
// ======================== 步骤4: 加密api/uuid和api/config中的uuid ========================
// 替换 configResponse.uuid = userID;
code = code.replace(
/configResponse\.uuid\s*=\s*userID;/g,
`configResponse.d = x27cnEnc(userID);`
);
// ======================== 步骤5: 修改LINK生成config中的vless链接 ========================
code = code.replace(
/config_JSON\.LINK\s*=\s*`\$\{config_JSON\.protocolType\}/g,
`config_JSON.LINK = x27cnEnc(\`\${config_JSON.protocolType}`
);
// 添加结尾括号
code = code.replace(
/\$\{config_JSON\.skipCertVerify\s*\?\s*"&insecure=1&allowInsecure=1"\s*:\s*""\}#\$\{encodeURIComponent\(config_JSON\.subGenerator\.SUBNAME\)\}`;/g,
`\${config_JSON.skipCertVerify ? "&insecure=1&allowInsecure=1" : ""}#\${encodeURIComponent(config_JSON.subGenerator.SUBNAME)}\`);`
);
// ======================== 步骤6: 保存 ========================
fs.writeFileSync('workers_encrypted.js', code, 'utf8');
console.log('Saved to workers_encrypted.js');
// 验证
if (code.includes('x27cnEnc')) {
console.log('✓ x27cnEnc function present');
}
if (code.includes('enc: true')) {
console.log('✓ Root response encrypted');
} else {
console.log('✗ Root response NOT encrypted - manual check needed');
}