import fs from 'fs'; import path from 'path'; import { info, error } from './logger.js'; /** * 创建人类可读的时间戳 * @returns {string} 格式化的时间戳 YYYY-MM-DD_HH-MM-SS */ export function getHumanReadableTimestamp() { const now = new Date(); const year = now.getFullYear(); const month = String(now.getMonth() + 1).padStart(2, '0'); const day = String(now.getDate()).padStart(2, '0'); const hours = String(now.getHours()).padStart(2, '0'); const minutes = String(now.getMinutes()).padStart(2, '0'); const seconds = String(now.getSeconds()).padStart(2, '0'); return `${year}-${month}-${day}_${hours}-${minutes}-${seconds}`; } /** * 确保截图目录存在 * @param {string} dir - 目录路径 */ export function ensureScreenshotDirectory(dir) { if (!fs.existsSync(dir)) { fs.mkdirSync(dir, { recursive: true }); info(`创建截图目录: ${dir}`); } } /** * 检查 Cookie 是否可用(环境变量或文件) * @param {string} cookieFile - Cookie 文件路径 * @param {string} cookiesFromEnv - 环境变量中的cookies * @returns {boolean} Cookie是否可用 */ export function checkCookieAvailability(cookieFile, cookiesFromEnv) { // 优先检查环境变量 if (cookiesFromEnv) { info('发现环境变量COOKIES,将使用环境变量中的cookies'); try { JSON.parse(cookiesFromEnv); return true; } catch (err) { error('环境变量COOKIES格式无效:', err.message); info('将尝试使用cookie文件...'); } } // 检查cookie文件 if (!fs.existsSync(cookieFile)) { error(`Cookie文件不存在: ${cookieFile}`); info('请先运行 npm run login 进行登录,或设置环境变量COOKIES'); return false; } return true; } /** * 检查 Cookie 文件是否存在(保持向后兼容) * @param {string} cookieFile - Cookie 文件路径 * @returns {boolean} 文件是否存在 */ export function checkCookieFile(cookieFile) { if (!fs.existsSync(cookieFile)) { error(`Cookie文件不存在: ${cookieFile}`); info('请先运行 npm run login 进行登录'); return false; } return true; } /** * 读取并解析 Cookie(优先使用环境变量) * @param {string} cookieFile - Cookie 文件路径 * @param {string} cookiesFromEnv - 环境变量中的cookies * @returns {Array} Cookie 数组 */ export function loadCookies(cookieFile, cookiesFromEnv) { try { // 优先使用环境变量 if (cookiesFromEnv) { info('从环境变量COOKIES加载cookies...'); const cookies = JSON.parse(cookiesFromEnv); info(`已从环境变量加载 ${cookies.length} 个cookies`); return cookies; } // 使用文件 if (fs.existsSync(cookieFile)) { info(`从文件加载cookies: ${cookieFile}`); const cookies = JSON.parse(fs.readFileSync(cookieFile, 'utf8')); info(`已从文件加载 ${cookies.length} 个cookies`); return cookies; } return []; } catch (err) { error('读取 Cookie 失败:', err); throw err; } } /** * 保存截图 * @param {Object} page - Playwright 页面对象 * @param {string} screenshotDir - 截图目录 * @param {string} prefix - 文件名前缀 * @returns {string} 截图文件路径 */ export async function saveScreenshot(page, screenshotDir, prefix = 'screenshot') { ensureScreenshotDirectory(screenshotDir); const timestamp = getHumanReadableTimestamp(); const screenshotPath = path.join(screenshotDir, `${prefix}.png`); await page.screenshot({ path: screenshotPath }); info(`截图已保存: ${screenshotPath}`); return screenshotPath; }