diff --git a/scripts/daily-runner.js b/scripts/daily-runner.js index b9b37b8..ee03a9b 100644 --- a/scripts/daily-runner.js +++ b/scripts/daily-runner.js @@ -270,6 +270,40 @@ async function verifyBlockedPage() { log('隧道已恢复'); } + // v1.4:启动时主动登录态检查——跑第一批之前先看页面,失效/被顶立即发二维码+进监听 + // (否则第一批要空跑1-2分钟在页面上撞见登录页才告警) + let abortDay = false; // 启动阶段没等来扫码 → 今日收工 + { + const pw = require('playwright-core'); + try { + const b = await pw.chromium.connectOverCDP(`http://127.0.0.1:${PORT}`); + const p = b.contexts()[0]?.pages().find(x => /zhaopin\.com/.test(x.url())); + if (p) { + const st = await p.evaluate(() => ({ + login: location.href.includes('passport'), + kicked: !!document.querySelector('.km-modal.km-modal--message-box') && + /账号已在其他设备或浏览器登录/.test(document.body?.innerText || ''), + ok: !location.href.includes('passport') && + document.querySelectorAll('.recommend-item').length > 0, + })).catch(() => null); + if (st?.login || st?.kicked) { + log(`启动登录态检查:${st.kicked ? '被顶号' : '登录失效'},直接走告警+扫码监听`); + if (st.kicked) await notifyKickedOut(null); + else { notifyLoginExpired(); writeState('login_expired', null); } + const relogged = await waitForRelogin(); + if (relogged) { writeState('running', null); log('扫码登录成功,正式开始筛选'); } + else { log('启动阶段未等来扫码,今日收工'); abortDay = true; } + } else if (st?.ok) { + log('启动登录态检查:✅ 正常'); + } else { + log('启动登录态检查:页面状态未知(可能加载中),继续按正常流程跑'); + } + } + try { await b.close(); } catch (_) {} + } catch (e) { log(`启动登录态检查异常(忽略,按正常流程跑): ${String(e).slice(0, 80)}`); } + } + if (abortDay) { log('runner 结束'); process.exit(0); } + let lastChatLeft = null, zeroStreak = 0; let needRelogin = false; // v1.2:登录类异常(登录失效/被顶号)→ 告警后进监听等扫码,扫完自动复工