Hugging Face + Cloudflare + 防封混淆 + 自动保活
1. 登录 Hugging Face Spaces。
2. 点击 Create new Space。
3. Name: web-clock-service (建议起个普通的)
4. SDK: Docker | Template: Blank | Visibility: Public。
在 Files 页面创建以下 2 个文件(直接复制):
文件 1: package.json{
"name": "web-clock-service",
"version": "1.0.0",
"description": "Time Sync",
"main": "index.js",
"scripts": { "start": "node index.js" },
"dependencies": { "ws": "^8.13.0" }
}
FROM node:18-alpine
WORKDIR /app
COPY package.json ./
RUN npm install
COPY index.js ./
EXPOSE 7860
CMD ["node", "index.js"]
1. 复制下面这段源代码。
2. 打开混淆网站 obfuscator.io。
3. 粘贴代码 -> 勾选 Compact code 和 String Array -> 点击 Obfuscate。
4. 将生成的乱码,复制到 Hugging Face 新建的 index.js 文件中。
const net = require('net');
const http = require('http');
const { WebSocketServer, createWebSocketStream } = require('ws');
const { parse } = require('url');
// 敏感变量改名,伪装成 API_KEY
const UUID = (process.env.API_KEY || process.env.UUID || 'd342d11e-d424-4583-37f8-f24e8547221f').toLowerCase();
const PORT = process.env.PORT || 7860;
const SUB_PATH = '/sub';
// 精美时钟伪装页
const FAKE_PAGE = `
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Time Sync</title><style>body{display:flex;justify-content:center;align-items:center;height:100vh;background:#0f0f13;color:#e0e0e0;font-family:monospace;overflow:hidden}.clock-container{text-align:center;padding:40px;border:2px solid #333;border-radius:20px;background:#1a1a20;box-shadow:0 0 30px rgba(0,255,255,0.1)}.time{font-size:5rem;color:#00f3ff;text-shadow:0 0 20px rgba(0,243,255,0.5)}.date{font-size:1.5rem;margin-top:20px;color:#888}</style></head><body><div class="clock-container"><div class="time" id="time">00:00:00</div><div class="date" id="date">Loading...</div></div><script>function u(){const n=new Date();document.getElementById('time').innerText=n.toLocaleTimeString('en-US',{hour12:false});document.getElementById('date').innerText=n.toLocaleDateString('en-US',{weekday:'long',year:'numeric',month:'long',day:'numeric'})}setInterval(u,1000);u();</script></body></html>
`;
const server = http.createServer((req, res) => {
const { pathname } = parse(req.url);
if (pathname === SUB_PATH) {
const host = req.headers.host;
const link = `vless://${UUID}@${host}:443?encryption=none&security=tls&type=ws&host=${host}&path=%2F#HF-Node`;
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end(Buffer.from(link).toString('base64'));
} else {
res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
res.end(FAKE_PAGE);
}
});
const wss = new WebSocketServer({ noServer: true });
server.on('upgrade', (req, socket, head) => {
wss.handleUpgrade(req, socket, head, (ws) => wss.emit('connection', ws, req));
});
wss.on('connection', (ws) => {
const wsStream = createWebSocketStream(ws);
let isHeaderParsed = false;
wsStream.on('data', (chunk) => {
if (isHeaderParsed) return;
try {
const receivedUUID = chunk.slice(1, 17).toString('hex').match(/.{8}(.{4}){3}.{12}/)[0].replace(/(.{8})(.{4})(.{4})(.{4})(.{12})/, '$1-$2-$3-$4-$5');
if (receivedUUID !== UUID) { wsStream.destroy(); return; }
wsStream.write(new Uint8Array([0, 0])); // 关键握手
const optLength = chunk[17];
const cmdStart = 18 + optLength;
const portStart = cmdStart + 1;
const port = (chunk[portStart] << 8) | chunk[portStart + 1];
const atyp = chunk[portStart + 2];
const addrStart = portStart + 3;
let address = '';
let rawDataIndex = 0;
if (atyp === 1) { address = chunk.slice(addrStart, addrStart + 4).join('.'); rawDataIndex = addrStart + 4; }
else if (atyp === 2) { const len = chunk[addrStart]; address = chunk.slice(addrStart + 1, addrStart + 1 + len).toString(); rawDataIndex = addrStart + 1 + len; }
else if (atyp === 3) { address = chunk.slice(addrStart, addrStart + 16).toString('hex').match(/.{1,4}/g).join(':'); rawDataIndex = addrStart + 16; }
const remoteSocket = net.createConnection(port, address, () => {
isHeaderParsed = true;
if (chunk.length > rawDataIndex) remoteSocket.write(chunk.slice(rawDataIndex));
wsStream.pipe(remoteSocket);
remoteSocket.pipe(wsStream);
});
remoteSocket.on('error', () => wsStream.destroy());
remoteSocket.on('end', () => wsStream.destroy());
} catch (err) { wsStream.destroy(); }
});
});
server.listen(PORT, '0.0.0.0', () => console.log(`Server running on ${PORT}`));
1. 去 HF 的 Settings -> Variables。
2. 添加变量 API_KEY,值为你的 UUID (比如 d342d11e-d424-4583-37f8-f24e8547221f)。
3. 必做: 在 Settings 页面点击 Factory Reboot 强制重启。
1. 在 Cloudflare 创建 Worker。
2. 必须检查: 域名的 SSL/TLS 模式必须是 Full (完全)。
3. 粘贴代码 (无需混淆):
export default {
async fetch(request, env) {
const url = new URL(request.url);
const actualHost = '你的项目名.hf.space'; // 🔴 改这里
url.hostname = actualHost;
url.protocol = 'https:';
const newRequest = new Request(url, {
method: request.method,
headers: request.headers,
body: request.body,
redirect: 'manual'
});
newRequest.headers.set('Host', actualHost);
// 关键 WebSocket 转发头修正
const upgradeHeader = request.headers.get('Upgrade');
if (upgradeHeader || upgradeHeader === 'websocket') {
return fetch(newRequest);
}
return fetch(newRequest);
}
};
1. 注册 UptimeRobot (免费)。
2. 点击 Add New Monitor。
3. Type 选 HTTP(s)。
4. URL 填:https://你的CF自定义域名 (确保能看到时钟)。
5. Interval 选 5 min。
6. 保存。这样你的节点就永久在线了!
双击添加 VLESS 节点,严格按以下填写:
www.visa.com.sg (优选IP)443你在变量里填的UUID你的CF自定义域名你的CF自定义域名wstls (开启) | 指纹: chrome