File size: 3,006 Bytes
e5043e6
 
79902d0
e5043e6
 
 
 
 
4960788
 
 
 
 
e5043e6
 
 
 
 
 
79902d0
 
 
 
 
 
 
 
 
 
 
 
e5043e6
 
79902d0
e5043e6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
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}`);
});