File size: 6,331 Bytes
dc70e52
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f541a27
dc70e52
 
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
// 加载环境变量
require('dotenv').config();

// 环境检查
const envChecker = require('./utils/envChecker');
console.log('启动前检查环境配置...');
envChecker.enforceEnvCheck();

const express = require('express');
const morgan = require('morgan');
const path = require('path');
const cron = require('node-cron');
const app = express();

const config = require('./config/config');
const routes = require('./routes');
const keyManager = require('./utils/keyManager');
const cookieRefresher = require('./utils/cookieRefresher');
const authMiddleware = require('./middleware/auth');

// 初始化API Keys
console.log('初始化API Keys...');
keyManager.initializeApiKeys();

// 输出最终的API Keys配置
console.log('最终API Keys配置:', JSON.stringify(keyManager.getAllApiKeys().reduce((obj, key) => {
  obj[key] = keyManager.getAllCookiesForApiKey(key);
  return obj;
}, {}), null, 2));

// 添加CORS支持
app.use((req, res, next) => {
    res.header('Access-Control-Allow-Origin', '*');
    res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept, Authorization');
    res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
    
    if (req.method === 'OPTIONS') {
        return res.status(200).end();
    }
    
    next();
});

app.use(express.json({ limit: '50mb' }));
app.use(express.urlencoded({ extended: true, limit: '50mb' }));

app.use(morgan(process.env.MORGAN_FORMAT ?? 'tiny'));

// 添加静态文件支持
app.use(express.static(path.join(__dirname, 'public')));

// 添加根路由,重定向到登录页面
app.get('/', (req, res) => {
    res.redirect('/login.html');
});

// 添加认证中间件
app.use(authMiddleware);

app.use("/", routes)

// 设置定时任务,自动刷新 Cookie
if (config.refresh.enabled) {
    const cronSchedule = config.refresh.cron;
    const minCookieCount = config.refresh.minCookieCount;
    
    console.log(`启用自动刷新 Cookie,定时规则: ${cronSchedule},最小 Cookie 数量: ${minCookieCount}`);
    
    cron.schedule(cronSchedule, async () => {
        console.log('===== 自动刷新 Cookie 开始 =====');
        console.log(`最小 Cookie 数量: ${minCookieCount}`);
        
        try {
            // 获取所有 API Key
            const apiKeys = keyManager.getAllApiKeys();
            
            if (apiKeys.length === 0) {
                console.log('警告: 系统中没有找到任何 API Key');
                
                // 检查环境变量中是否有 API Keys
                const envApiKeys = Object.keys(config.apiKeys);
                if (envApiKeys.length > 0) {
                    console.log(`检测到环境变量中有 ${envApiKeys.length} 个 API Key,但尚未加载到系统中`);
                    console.log('正在重新初始化 API Keys...');
                    
                    // 重新获取 API Keys
                    const refreshedApiKeys = keyManager.getAllApiKeys();
                    if (refreshedApiKeys.length > 0) {
                        console.log(`成功加载 ${refreshedApiKeys.length} 个 API Key,继续刷新流程`);
                        // 继续执行后续刷新逻辑
                    } else {
                        console.log('初始化后仍未找到 API Key,请检查配置');
                        console.log('===== 自动刷新 Cookie 结束 =====');
                        return;
                    }
                } else {
                    console.log('环境变量中也没有配置 API Key,请先添加 API Key');
                    console.log('===== 自动刷新 Cookie 结束 =====');
                    return;
                }
            }
            
            // 重新获取最新的 API Keys(可能已经通过上面的初始化更新了)
            const updatedApiKeys = keyManager.getAllApiKeys();
            console.log(`系统中共有 ${updatedApiKeys.length} 个 API Key`);
            
            // 按 Cookie 数量排序,优先处理 Cookie 数量少的 API Key
            const sortedKeys = updatedApiKeys.sort((a, b) => {
                const aCount = keyManager.getAllCookiesForApiKey(a).length;
                const bCount = keyManager.getAllCookiesForApiKey(b).length;
                return aCount - bCount; // 升序排列,Cookie 数量少的排在前面
            });
            
            // 检查每个 API Key 是否需要刷新
            let refreshedCount = 0;
            let needRefreshCount = 0;
            
            for (const apiKey of sortedKeys) {
                const cookies = keyManager.getAllCookiesForApiKey(apiKey);
                console.log(`API Key: ${apiKey}, Cookie 数量: ${cookies.length}`);
                
                if (cookies.length < minCookieCount) {
                    needRefreshCount++;
                    console.log(`API Key ${apiKey} 的 Cookie 数量不足,需要刷新`);
                    
                    // 执行刷新
                    console.log(`开始自动刷新 Cookie,目标 API Key: ${apiKey},最小 Cookie 数量: ${minCookieCount}`);
                    const result = await cookieRefresher.autoRefreshCookies(apiKey, minCookieCount);
                    
                    if (result.success) {
                        refreshedCount++;
                        console.log(`刷新结果: ${result.message}`);
                    } else {
                        console.error(`刷新失败: ${result.message}`);
                    }
                } else {
                    console.log(`API Key ${apiKey} 的 Cookie 数量足够,不需要刷新`);
                }
            }
            
            console.log('===== 自动刷新 Cookie 完成 =====');
            console.log(`共有 ${needRefreshCount} 个 API Key 需要刷新,成功刷新 ${refreshedCount} 个`);
        } catch (error) {
            console.error('自动刷新 Cookie 任务执行失败:', error);
            console.log('===== 自动刷新 Cookie 异常结束 =====');
        }
    });
} else {
    console.log('未启用自动刷新 Cookie,如需启用请设置环境变量 ENABLE_AUTO_REFRESH=true');
}

app.listen(config.port,'0.0.0.0',()=> {
    console.log(`The server listens port: ${config.port}`);
});