/** * 单任务调试入口 * * 示例: * TASK=dailyTrending DEBUG_TASK=true DEBUG_KEEP_OPEN=true node debugTask.js * TASK=updateProject DEBUG_TASK=true DEBUG_KEEP_OPEN=true DEBUG_DRY_RUN=true node debugTask.js */ if (!process.env.DEBUG) { process.env.DEBUG = 'true'; } if (!process.env.DEBUG_TASK) { process.env.DEBUG_TASK = 'true'; } const config = require('./config'); const logger = require('./utils/logger'); const { launchBrowser, createContext } = require('./utils/browser'); const { ensureLogin } = require('./utils/login'); const { safeGoto } = require('./utils/page'); const updateProject = require('./tasks/updateProject'); const dailyShare = require('./tasks/dailyShare'); const dailyCheckIn = require('./tasks/dailyCheckIn'); const dailyTrending = require('./tasks/dailyTrending'); const dailyStar = require('./tasks/dailyStar'); const taskMap = { updateProject: { name: '更新项目', handler: updateProject, }, dailyTrending: { name: '查看热门', handler: dailyTrending, }, trending: { name: '查看热门', handler: dailyTrending, }, dailyShare: { name: '每日分享', handler: dailyShare, }, dailyCheckIn: { name: '每日签到', handler: dailyCheckIn, }, dailyStar: { name: '每日Star', handler: dailyStar, }, }; function printUsage() { logger.info('用法: TASK= node debugTask.js'); logger.info('可用任务:'); Object.keys(taskMap).forEach((key) => logger.info(` ${key}`)); logger.info('常用参数: DEBUG_KEEP_OPEN=true DEBUG_PAUSE_EACH_STEP=true DEBUG_DRY_RUN=true'); } async function main() { const taskKey = process.env.TASK; const task = taskMap[taskKey]; if (!task) { printUsage(); throw new Error(`未知或未指定 TASK: ${taskKey || '(empty)'}`); } let browser = null; let context = null; let page = null; try { logger.divider(); logger.info(`===== 单任务调试: ${task.name} (${taskKey}) =====`); browser = await launchBrowser(); const created = await createContext(browser); context = created.context; page = await context.newPage(); logger.divider(); logger.info('===== 登录验证 ====='); await ensureLogin(page, context); logger.divider(); logger.info('===== 打开积分中心 ====='); await safeGoto(page, config.urls.points, { label: '积分中心', timeout: config.navigationTimeout, waitFor: [ '.g-user-avatar', 'text=密码登录', '.novice-task-item-box', ], }); logger.divider(); logger.info(`===== 执行单任务: ${task.name} =====`); await task.handler(page, { debugTask: true, keepOpen: process.env.DEBUG_KEEP_OPEN === 'true', pauseEachStep: process.env.DEBUG_PAUSE_EACH_STEP === 'true', dryRun: process.env.DEBUG_DRY_RUN === 'true', }); logger.divider(); logger.info(`✅ 单任务调试完成: ${task.name}`); } catch (err) { logger.divider(); logger.error(`❌ 单任务调试失败: ${err.message}`); logger.error(err.stack || err.message); process.exitCode = 1; } finally { logger.divider(); logger.info('===== 关闭浏览器 ====='); if (browser) { await browser.close().catch((err) => { logger.warn(`关闭浏览器失败: ${err.message}`); }); } } } main();