128 lines
3.3 KiB
JavaScript
128 lines
3.3 KiB
JavaScript
/**
|
|
* 单任务调试入口
|
|
*
|
|
* 示例:
|
|
* 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=<taskName> 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();
|