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