|
|
|
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}`); |
|
}); |
|
|