nsl / app.js
hanxuan's picture
添加开关,隐藏IP
79902d0 verified
const express = require('express');
const axios = require('axios');
const SHOW_FULL_IP = false;
const app = express();
const port = 7860;
const sites = [
{ name: 'X1', url: 'https://QSignX-X1.hf.space?key=X' },
{ name: 'X2', url: 'https://QSignX-X2.hf.space?key=X' },
{ name: 'X3', url: 'https://QSignX-X3.hf.space?key=X' },
{ name: 'X4', url: 'https://QSignX-X4.hf.space?key=X' },
{ name: 'X5', url: 'https://QSignX-X5.hf.space?key=X' }
];
const timeout = 30000; // 访问超时
// 使用中间件,接收所有请求
app.use((req, res, next) => {
let userIP = req.headers['x-forwarded-for'] || req.socket.remoteAddress || null;
// 如果 SHOW_FULL_IP 为 false,则隐藏部分 IP 地址
if (!SHOW_FULL_IP) {
const parts = userIP.split('.');
if (parts.length === 4) {
parts[2] = 'xxx';
parts[3] = 'xxx';
}
userIP = parts.join('.');
}
const currentDate = new Date().toLocaleString('zh-CN', { hour12: false });
//console.log(`[${currentDate}] 收到来自 IP ${userIP} 的请求`);
res.locals.userIP = userIP;
next();
});
app.get('/', (req, res) => {
const userIP = res.locals.userIP; // 从 res.locals 中获取 userIP
const currentDate = new Date().toLocaleString('zh-CN', { hour12: false });
// 并发请求
const requests = sites.map(site =>
axios.get(site.url, { timeout })
.then(response => ({ name: site.name, status: response.status, url: site.url }))
.catch(error => {
if (error.code === 'ECONNABORTED') {
return { name: site.name, error: '请求超时', url: site.url };
} else {
return { name: site.name, error: error.message, url: site.url };
}
})
);
Promise.all(requests)
.then(results => {
const availableSites = results.filter(result => result.status === 200);
if (availableSites.length > 0) {
// 从可用地址中随机选择一个
const randomIndex = Math.floor(Math.random() * availableSites.length);
const randomSite = availableSites[randomIndex];
console.log(`[${currentDate}] ${userIP}${randomSite.url}`);
res.redirect(302, randomSite.url); // 使用 302 作为临时重定向状态码
} else {
console.log(`[${currentDate}] ${userIP} 没有可用的地址`);
res.json({ message: '少女为主人痛哭...' });
}
})
.catch(err => {
console.error(`[${currentDate}] ${userIP} 请求时出错: ${err.message}`);
res.status(500).json({ error: `发生错误: ${err.message}` });
});
});
app.use((req, res) => {
const userIP = res.locals.userIP; // 从 res.locals 中获取 userIP
const requestedRoute = req.originalUrl;
const currentDate = new Date().toLocaleString('zh-CN', { hour12: false });
console.log(`[${currentDate}] ${userIP} 错误路由 ${requestedRoute}`);
res.status(404).json({ error: '少女做不到...' });
});
app.listen(port, '0.0.0.0', () => {
console.log(`少女为您祈福 0.0.0.0:${port}`);
});