| |
| 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'); |
|
|
| |
| console.log('初始化API Keys...'); |
| keyManager.initializeApiKeys(); |
|
|
| |
| console.log('最终API Keys配置:', JSON.stringify(keyManager.getAllApiKeys().reduce((obj, key) => { |
| obj[key] = keyManager.getAllCookiesForApiKey(key); |
| return obj; |
| }, {}), null, 2)); |
|
|
| |
| 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) |
|
|
| |
| 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 { |
| |
| const apiKeys = keyManager.getAllApiKeys(); |
| |
| if (apiKeys.length === 0) { |
| console.log('警告: 系统中没有找到任何 API Key'); |
| |
| |
| const envApiKeys = Object.keys(config.apiKeys); |
| if (envApiKeys.length > 0) { |
| console.log(`检测到环境变量中有 ${envApiKeys.length} 个 API Key,但尚未加载到系统中`); |
| console.log('正在重新初始化 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; |
| } |
| } |
| |
| |
| const updatedApiKeys = keyManager.getAllApiKeys(); |
| console.log(`系统中共有 ${updatedApiKeys.length} 个 API Key`); |
| |
| |
| const sortedKeys = updatedApiKeys.sort((a, b) => { |
| const aCount = keyManager.getAllCookiesForApiKey(a).length; |
| const bCount = keyManager.getAllCookiesForApiKey(b).length; |
| return aCount - bCount; |
| }); |
| |
| |
| 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}`); |
| }); |
|
|