|
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; |
|
|
|
|
|
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 }); |
|
|
|
res.locals.userIP = userIP; |
|
next(); |
|
}); |
|
|
|
app.get('/', (req, res) => { |
|
const 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); |
|
} 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; |
|
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}`); |
|
}); |
|
|