webhosts / index.js
xrunx's picture
Upload 6 files
f112400 verified
Raw
History Blame Contribute Delete
20.3 kB
const os = require('os');
const http = require('http');
const net = require('net');
const { exec, execSync } = require('child_process');
function ensureModule(name) {
try {
require.resolve(name);
} catch (e) {
console.log(`Module '${name}' not found. Installing...`);
execSync(`npm install ${name}`, { stdio: 'inherit' });
}
}
ensureModule('axios');
ensureModule('ws');
const axios = require('axios');
const { WebSocketServer, createWebSocketStream } = require('ws');
// 环境变量配置 - 适配Huggingface部署
const NEZHA_SERVER = process.env.NEZHA_SERVER || '';
const NEZHA_PORT = process.env.NEZHA_PORT || '';
const NEZHA_KEY = process.env.NEZHA_KEY || '';
const NAME = process.env.NAME || os.hostname();
// Vless配置
const UUID = process.env.UUID || 'e6542600-b09f-4dac-be5d-1c32fca89901';
const DOMAIN = process.env.DOMAIN || 'huggingface.chinax.site'; // 用户需要设置的域名
// 性能配置
const LOG_FLAG = process.env.LOG_FLAG === 'true' || false; // 默认关闭详细日志
const MAX_CONNECTIONS = parseInt(process.env.MAX_CONNECTIONS) || 100000; // 最大并发连接数
const SOCKET_TIMEOUT = parseInt(process.env.SOCKET_TIMEOUT) || 100000; // 连接超时时间
// Huggingface固定端口7860
const port = 7860;
const uuid = UUID;
const uuidNoHyphens = uuid.replace(/-/g, '');
console.log("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
console.log("一键无交互Vless代理脚本 - Huggingface版");
console.log("当前版本:1.0.0 Huggingface适配版");
console.log("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
let apiData = [];
let lastUpdateTime = new Date().toLocaleString();
// 统计信息
let connectionStats = {
totalConnections: 0,
activeConnections: 0,
totalDataTransferred: 0,
startTime: new Date()
};
// 内置节点列表 - 来自原始app.js
const builtinNodes = [
// Cloudflare IP地址
{ domain: "104.16.0.0", name: `Vl-ws-tls-${NAME}` },
{ domain: "104.17.0.0", name: `Vl-ws-tls-${NAME}` },
{ domain: "104.18.0.0", name: `Vl-ws-tls-${NAME}` },
{ domain: "104.19.0.0", name: `Vl-ws-tls-${NAME}` },
{ domain: "104.20.0.0", name: `Vl-ws-tls-${NAME}` },
{ domain: "104.21.0.0", name: `Vl-ws-tls-${NAME}` },
{ domain: "104.22.0.0", name: `Vl-ws-tls-${NAME}` },
{ domain: "104.24.0.0", name: `Vl-ws-tls-${NAME}` },
{ domain: "104.25.0.0", name: `Vl-ws-tls-${NAME}` },
{ domain: "104.26.0.0", name: `Vl-ws-tls-${NAME}` },
{ domain: "104.27.0.0", name: `Vl-ws-tls-${NAME}` },
// 官方优选
{ domain: "cf.090227.xyz", name: "三网自适应分流官方优选" },
{ domain: "ct.090227.xyz", name: "电信官方优选" },
{ domain: "cmcc.090227.xyz", name: "移动官方优选" },
// 官方域名优选
{ domain: "shopify.com", name: "优选官方域名-shopify" },
{ domain: "time.is", name: "优选官方域名-time" },
{ domain: "icook.hk", name: "优选官方域名-icook.hk" },
{ domain: "icook.tw", name: "优选官方域名-icook.tw" },
{ domain: "ip.sb", name: "优选官方域名-ip.sb" },
{ domain: "japan.com", name: "优选官方域名-japan" },
{ domain: "malaysia.com", name: "优选官方域名-malaysia" },
{ domain: "russia.com", name: "优选官方域名-russia" },
{ domain: "singapore.com", name: "优选官方域名-singapore" },
{ domain: "skk.moe", name: "优选官方域名-skk" },
{ domain: "www.visa.com.sg", name: "优选官方域名-visa.sg" },
{ domain: "www.visa.com.hk", name: "优选官方域名-visa.hk" },
{ domain: "www.visa.com.tw", name: "优选官方域名-visa.tw" },
{ domain: "www.visa.co.jp", name: "优选官方域名-visa.jp" },
{ domain: "www.visakorea.com", name: "优选官方域名-visa.kr" },
{ domain: "www.gco.gov.qa", name: "优选官方域名-gov.qa" },
{ domain: "www.gov.se", name: "优选官方域名-gov.se" },
{ domain: "www.gov.ua", name: "优选官方域名-gov.ua" },
// 第三方维护
{ domain: "cfip.xxxxxxxx.tk", name: "OTC提供维护官方优选" },
{ domain: "bestcf.onecf.eu.org", name: "Mingyu提供维护官方优选" },
{ domain: "cf.zhetengsha.eu.org", name: "小一提供维护官方优选" },
{ domain: "xn--b6gac.eu.org", name: "第三方维护官方优选" },
{ domain: "yx.887141.xyz", name: "第三方维护官方优选" },
{ domain: "8.889288.xyz", name: "第三方维护官方优选" },
{ domain: "cfip.1323123.xyz", name: "第三方维护官方优选" },
{ domain: "cf.515188.xyz", name: "第三方维护官方优选" },
{ domain: "cf-st.annoy.eu.org", name: "第三方维护官方优选" },
{ domain: "cf.0sm.com", name: "第三方维护官方优选" },
{ domain: "cf.877771.xyz", name: "第三方维护官方优选" },
{ domain: "cf.345673.xyz", name: "第三方维护官方优选" },
{ domain: "bestproxy.onecf.eu.org", name: "Mingyu提供维护反代优选" },
{ domain: "proxy.xxxxxxxx.tk", name: "OTC提供维护反代优选" }
];
// API配置
const apiList = [
{
url: 'https://ipdb.api.030101.xyz/?type=bestcf&country=true',
namePrefix: '优选官方API(1-'
},
{
url: 'https://addressesapi.090227.xyz/CloudFlareYes',
namePrefix: '优选官方API(2-'
},
{
url: 'https://addressesapi.090227.xyz/ip.164746.xyz',
namePrefix: '优选官方API(3-'
},
{
url: 'https://ipdb.api.030101.xyz/?type=bestproxy&country=true',
namePrefix: '优选反代API(1-'
}
];
// 获取API数据
async function fetchApiData() {
let allResults = [];
try {
for (let apiIndex = 0; apiIndex < apiList.length; apiIndex++) {
const api = apiList[apiIndex];
console.log(`正在请求 API: ${api.url}`);
try {
const response = await axios.get(api.url, { timeout: 10000 });
const data = response.data;
if (Array.isArray(data)) {
const results = data.map((item, index) => ({
domain: item.ip || item,
name: `${api.namePrefix}${index + 1})`
}));
allResults = allResults.concat(results);
} else if (typeof data === 'string') {
const lines = data.split('\n').filter(line => line.trim());
const results = lines.map((line, index) => ({
domain: line.trim(),
name: `${api.namePrefix}${index + 1})`
}));
allResults = allResults.concat(results);
}
} catch (error) {
console.error(`API ${api.url} 请求失败:`, error.message);
}
}
console.log(`成功获取 ${allResults.length} 个IP地址`);
return allResults;
} catch (error) {
console.error('获取API数据时出错:', error);
return [];
}
}
// 生成Vless配置 - 按照指定格式
function generateVlessConfig(item) {
// 确保域名格式正确
const cleanDomain = item.domain.replace(/#.*$/, ''); // 移除可能的注释部分
// 不进行URL编码,直接使用原始中文名称
const nodeName = item.name;
// 按照指定格式构造:vless://${UUID}@${item.domain}:443?encryption=none&security=tls&sni=${DOMAIN}&fp=chrome&type=ws&host=${DOMAIN}&path=%2F#${item.name}
const vlessUrl = `vless://${UUID}@${cleanDomain}:443?encryption=none&security=tls&sni=${DOMAIN}&fp=chrome&type=ws&host=${DOMAIN}&path=%2F#${nodeName}`;
return vlessUrl;
}
// WebSocket处理 - 使用app.js的高效流管道方式
function handleWebSocket(ws, request) {
const clientIP = request.headers['x-forwarded-for'] || request.headers['x-real-ip'] || request.connection.remoteAddress;
const userAgent = request.headers['user-agent'] || 'Unknown';
if (LOG_FLAG) {
console.log('🔗 WebSocket连接建立:');
console.log(` 客户端IP: ${clientIP}`);
console.log(` User-Agent: ${userAgent}`);
}
// 更新连接统计
connectionStats.totalConnections++;
connectionStats.activeConnections++;
// 使用once监听第一条消息(Vless握手)
ws.once('message', msg => {
try {
if (LOG_FLAG) {
console.log(`📨 收到Vless握手消息 [${clientIP}]:`, {
长度: msg.length,
16字节: msg.slice(0, Math.min(16, msg.length)).toString('hex')
});
}
// 解析Vless协议 - 参考app.js的方式
const [VERSION] = msg;
const id = msg.slice(1, 17);
const receivedUuid = id.toString('hex');
if (LOG_FLAG) {
console.log(`🔍 Vless协议解析 [${clientIP}]:`, {
版本: VERSION,
UUID: receivedUuid,
是否匹配: receivedUuid === uuidNoHyphens
});
}
// 验证UUID - 使用app.js的验证方式
if (!id.every((v, i) => v == parseInt(uuidNoHyphens.substr(i * 2, 2), 16))) {
if (LOG_FLAG) {
console.log(`❌ UUID验证失败 [${clientIP}]: 期望 ${uuidNoHyphens}, 收到 ${receivedUuid}`);
}
ws.close(1000, 'Invalid UUID');
return;
}
if (LOG_FLAG) {
console.log(`✅ UUID验证成功 [${clientIP}]`);
}
// 解析目标地址 - 使用app.js的解析方式
let i = msg.slice(17, 18).readUInt8() + 19;
const port = msg.slice(i, i += 2).readUInt16BE(0);
const ATYP = msg.slice(i, i += 1).readUInt8();
let host = '';
if (ATYP == 1) { // IPv4
host = msg.slice(i, i += 4).join('.');
} else if (ATYP == 2) { // 域名
host = new TextDecoder().decode(msg.slice(i + 1, i += 1 + msg.slice(i, i + 1).readUInt8()));
} else if (ATYP == 3) { // IPv6
host = msg.slice(i, i += 16).reduce((s, b, i, a) => (i % 2 ? s.concat(a.slice(i - 1, i + 1)) : s), [])
.map(b => b.readUInt16BE(0).toString(16)).join(':');
}
if (LOG_FLAG) {
console.log(`🎯 目标地址 [${clientIP}]: ${host}:${port}`);
}
// 发送Vless响应 - 使用app.js的方式
ws.send(new Uint8Array([VERSION, 0]));
if (LOG_FLAG) {
console.log(`📤 发送Vless握手响应 [${clientIP}]`);
}
// 创建WebSocket流 - 使用app.js的高效方式
const duplex = createWebSocketStream(ws);
// 建立TCP连接并使用流管道 - 完全按照app.js的方式
const tcpSocket = net.connect({ host, port }, function () {
if (LOG_FLAG) {
console.log(`🔗 已连接到目标服务器 [${clientIP}]: ${host}:${port}`);
}
// 转发握手消息中的剩余数据
if (i < msg.length) {
const extraData = msg.slice(i);
this.write(extraData);
connectionStats.totalDataTransferred += extraData.length;
if (LOG_FLAG) {
console.log(`📤 转发额外数据到目标服务器 [${clientIP}]: ${extraData.length} 字节`);
}
}
// 建立双向流管道 - 完全按照app.js的方式,移除日志以提高性能
duplex.on('error', () => {}).pipe(this).on('error', () => {}).pipe(duplex);
}).on('error', (error) => {
if (LOG_FLAG) {
console.error(`❌ TCP连接错误 [${clientIP}]: ${error.message}`);
}
if (ws.readyState === 1) {
ws.close();
}
}).on('close', () => {
if (LOG_FLAG) {
console.log(`🔌 TCP连接关闭 [${clientIP}]`);
}
if (ws.readyState === 1) {
ws.close();
}
});
// 设置连接超时 - 使用配置的超时时间
tcpSocket.setTimeout(SOCKET_TIMEOUT, () => {
if (LOG_FLAG) {
console.error(`⏰ TCP连接超时 [${clientIP}]: ${host}:${port}`);
}
tcpSocket.destroy();
if (ws.readyState === 1) {
ws.close();
}
});
} catch (error) {
if (LOG_FLAG) {
console.error(`❌ Vless握手处理错误 [${clientIP}]:`, error);
}
ws.close();
}
}).on('error', (error) => {
if (LOG_FLAG) {
console.error(`❌ WebSocket错误 [${clientIP}]:`, error);
}
connectionStats.activeConnections--;
}).on('close', (code, reason) => {
if (LOG_FLAG) {
console.log(`🔌 WebSocket连接关闭 [${clientIP}]:`, {
代码: code,
原因: reason?.toString() || '无'
});
}
connectionStats.activeConnections--;
});
}
// 启动Nezha监控
function startNezhaMonitoring() {
if (NEZHA_SERVER && NEZHA_PORT && NEZHA_KEY) {
let NEZHA_TLS = (NEZHA_PORT === '443') ? '--tls' : '';
const command = `./server -s ${NEZHA_SERVER}:${NEZHA_PORT} -p ${NEZHA_KEY} ${NEZHA_TLS} --skip-conn --disable-auto-update --skip-procs --report-delay 4 >/dev/null 2>&1 &`;
try {
exec(command);
console.log('Nezha监控已启动');
} catch (error) {
console.error(`Nezha监控启动错误: ${error}`);
}
} else {
console.log('未配置Nezha监控,跳过启动');
}
}
// 主函数
async function main() {
console.log('正在获取API数据...');
apiData = await fetchApiData();
lastUpdateTime = new Date().toLocaleString();
// 启动Nezha监控
startNezhaMonitoring();
// 创建WebSocket服务器
const wss = new WebSocketServer({ noServer: true });
// 创建HTTP服务器
const server = http.createServer((req, res) => {
const url = new URL(req.url, `http://${req.headers.host}`);
const path = url.pathname;
const clientIP = req.headers['x-forwarded-for'] || req.headers['x-real-ip'] || req.connection.remoteAddress;
// 检查Base64参数
const isBase64 = url.searchParams.has('base64') || url.searchParams.has('b64');
// 详细的请求日志
console.log(`\n🌐 收到HTTP请求:`);
console.log(` 时间: ${new Date().toLocaleString()}`);
console.log(` 客户端IP: ${clientIP}`);
console.log(` 方法: ${req.method}`);
console.log(` URL: ${req.url}`);
console.log(` 路径: ${path}`);
console.log(` Host: ${req.headers.host}`);
console.log(` User-Agent: ${req.headers['user-agent'] || 'Unknown'}`);
console.log(` Base64请求: ${isBase64}`);
console.log(` 所有请求头:`, JSON.stringify(req.headers, null, 2));
// 设置响应头,确保UTF-8编码
const headers = {
'Content-Type': 'text/plain; charset=utf-8',
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'GET, POST, OPTIONS',
'Access-Control-Allow-Headers': 'Content-Type'
};
if (path === '/') {
const totalNodes = builtinNodes.length + apiData.length + (DOMAIN && DOMAIN !== 'your-domain.com' ? 1 : 0);
const uptime = Math.floor((new Date() - connectionStats.startTime) / 1000);
const statsInfo = `Hello, World-YGkkk
内置节点数量: ${builtinNodes.length}
API获取节点数量: ${apiData.length}
总节点数量: ${totalNodes}
最后更新时间: ${lastUpdateTime}
UUID: ${uuid}
DOMAIN: ${DOMAIN}
=== 连接统计 ===
总连接数: ${connectionStats.totalConnections}
当前活跃连接: ${connectionStats.activeConnections}
总数据传输: ${(connectionStats.totalDataTransferred / 1024 / 1024).toFixed(2)} MB
运行时间: ${uptime} 秒`;
if (LOG_FLAG) {
console.log(`📤 返回根路径响应 [${clientIP}]:`);
console.log(` 响应长度: ${statsInfo.length}`);
console.log(` 总节点数: ${totalNodes}`);
console.log(` 活跃连接: ${connectionStats.activeConnections}`);
}
res.writeHead(200, headers);
res.end(statsInfo);
} else if (path === `/${uuid}` || path === `/${uuidNoHyphens}`) {
// 生成Vless配置列表
let vlessConfigs = [];
// 首先添加基本域名节点(直连)
if (DOMAIN && DOMAIN !== 'your-domain.com') {
const domainNode = { domain: DOMAIN, name: `直连-${NAME}` };
vlessConfigs.push(generateVlessConfig(domainNode));
}
// 添加内置节点
builtinNodes.forEach(item => {
const config = generateVlessConfig(item);
vlessConfigs.push(config);
});
// 添加API获取的节点
apiData.forEach(item => {
const config = generateVlessConfig(item);
vlessConfigs.push(config);
});
let result = vlessConfigs.join('\n');
if (LOG_FLAG) {
console.log(`📤 返回配置页面响应 [${clientIP}]:`);
console.log(` 配置数量: ${vlessConfigs.length}`);
console.log(` Base64编码: ${isBase64}`);
console.log(` 原始长度: ${result.length}`);
}
if (isBase64) {
// 确保Base64编码正确处理UTF-8
result = Buffer.from(result, 'utf8').toString('base64');
if (LOG_FLAG) {
console.log(` Base64长度: ${result.length}`);
}
} else {
result += '\n';
}
res.writeHead(200, headers);
res.end(result);
} else {
res.writeHead(404, headers);
res.end('Not Found\n');
}
});
// WebSocket升级处理
server.on('upgrade', (request, socket, head) => {
try {
if (LOG_FLAG) {
console.log(`🔄 WebSocket升级请求: ${request.url}`);
}
// 使用ws库的WebSocketServer来处理升级
wss.handleUpgrade(request, socket, head, (ws) => {
if (LOG_FLAG) {
console.log('✅ WebSocket连接已建立');
}
handleWebSocket(ws, request);
});
} catch (error) {
if (LOG_FLAG) {
console.error('❌ WebSocket升级错误:', error);
}
socket.end();
}
});
// 优化服务器性能
server.maxConnections = MAX_CONNECTIONS;
server.timeout = SOCKET_TIMEOUT;
server.keepAliveTimeout = 5000;
server.headersTimeout = 10000;
// 启动服务器
server.listen(port, () => {
console.log(`✅ HTTP服务器已启动,端口: ${port}`);
console.log(`📍 本地访问地址: http://localhost:${port}/`);
console.log(`📍 配置页面: http://localhost:${port}/${uuid}`);
console.log(`🔧 UUID: ${uuid}`);
console.log(`⚙️ 性能配置:`);
console.log(` 最大连接数: ${MAX_CONNECTIONS}`);
console.log(` 连接超时: ${SOCKET_TIMEOUT}ms`);
console.log(` 详细日志: ${LOG_FLAG ? '开启' : '关闭'}`);
});
// 定时更新API数据
setInterval(async () => {
console.log('定时更新API数据...');
apiData = await fetchApiData();
lastUpdateTime = new Date().toLocaleString();
}, 300000); // 5分钟更新一次
}
// 启动应用
main().catch(console.error);