From d0dbe9c67669f81328d6484998ad5fe9cfc5339c Mon Sep 17 00:00:00 2001 From: hermes Date: Thu, 27 Aug 2026 03:16:54 +0000 Subject: [PATCH] =?UTF-8?q?=E8=A2=AB=E9=A1=B6=E5=8F=B7=E5=91=8A=E8=AD=A6?= =?UTF-8?q?=E5=8D=87=E7=BA=A7:=20=E8=87=AA=E5=8A=A8=E5=85=B3=E9=97=AD?= =?UTF-8?q?=E8=A2=AB=E9=A1=B6=E5=BC=B9=E7=AA=97=E2=86=92=E5=88=B7=E6=96=B0?= =?UTF-8?q?=E2=86=92=E7=99=BB=E5=BD=95=E9=A1=B5=E6=8A=93=E4=BA=8C=E7=BB=B4?= =?UTF-8?q?=E7=A0=81=E5=8F=91=E7=BE=A4(=E4=B8=8E=E7=99=BB=E5=BD=95?= =?UTF-8?q?=E5=A4=B1=E6=95=88=E5=90=8C=E6=A0=B7=E5=BC=8F,=20=E5=90=AB'?= =?UTF-8?q?=E4=BB=8A=E6=97=A5=E4=B8=8D=E9=9C=80=E8=A6=81=E5=8F=AF=E5=BF=BD?= =?UTF-8?q?=E7=95=A5'=E8=AF=B4=E6=98=8E)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/daily-runner.js | 39 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 36 insertions(+), 3 deletions(-) diff --git a/scripts/daily-runner.js b/scripts/daily-runner.js index 3a3f110..0b84c99 100644 --- a/scripts/daily-runner.js +++ b/scripts/daily-runner.js @@ -74,6 +74,40 @@ function notifyLoginExpired() { send(GROUP, `🚨 当前${label}账号登录已失效,今日筛选中止,请在任务机重新登录智联`); } +// 被顶号告警:先关闭被顶弹窗/刷新页面 → 导航到登录页抓二维码 → 发群(文字+二维码+说明) +async function notifyKickedOut(chatLeft) { + const label = `${ACCT}(${ACCT === 'hr1' ? 'Chrome·合塑账号' : 'Edge·派卡账号'})`; + const text = `🚨 ${label}被其他人登录了(账号在其他设备/浏览器登录,当前已退出),任务停止。如非本人操作请注意账号安全。扫码可重新登录:\n如今天不需要协助筛选简历,可忽略该二维码`; + const qrPath = `/tmp/zhaopin-login-qr-${ACCT}.png`; + try { + // 前置:关闭可能还挂着的被顶弹窗并刷新,让页面回到登录态 + const pw = require('playwright-core'); + 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) { + await p.evaluate(() => { + // 点掉被顶弹窗的"重新登录"按钮(会跳登录页);找不到就关弹窗 + const btn = document.querySelector('.km-modal.km-modal--message-box .km-button--primary'); + if (btn) btn.click(); + else document.querySelector('.km-modal__close, .new-shortcut-resume__close')?.click(); + }).catch(() => {}); + await new Promise(r => setTimeout(r, 3000)); + } + } catch (e) { log(`前置弹窗处理失败(忽略): ${String(e).slice(0, 80)}`); } + try { + execSync(`node ${SCRIPTS}/login-qrcode.js ${PORT} ${qrPath}`, + { cwd: SCRIPTS, timeout: 90000, stdio: ['pipe', 'pipe', 'pipe'] }); + if (fs.existsSync(qrPath) && fs.statSync(qrPath).size > 1000) { + sendGroupImage(text, qrPath); + writeState('kicked_out', chatLeft); + return; + } + log('二维码截图异常,降级为纯文字'); + } catch (e) { log(`二维码获取失败: ${String(e).slice(0, 100)},降级为纯文字`); } + send(GROUP, `🚨 ${label}被其他人登录了(账号在其他设备/浏览器登录,当前已退出),任务停止。如非本人操作请注意账号安全`); + writeState('kicked_out', chatLeft); +} + function writeState(status, chatLeft) { fs.writeFileSync(path.join(STATE_DIR, `state-${ACCT}.json`), JSON.stringify({ date: today(), status, chatLeft: chatLeft ?? null, endedAt: new Date().toISOString() })); @@ -164,10 +198,9 @@ function statusText(s) { const { code, out } = await runBatch(); - // 被顶号(账号在其他设备登录)→ 群告警,立即结束(2026-08-27) + // 被顶号(账号在其他设备登录)→ 群告警+二维码(会话已被踢,重新登录同样需要扫码),立即结束(2026-08-27) if (/账号被顶/.test(out)) { - send(GROUP, `🚨 ${ACCT}(${ACCT === 'hr1' ? 'Chrome·合塑账号' : 'Edge·派卡账号'})被其他人登录了(账号在其他设备/浏览器登录,当前已退出),任务停止。如非本人操作请注意账号安全`); - maybeSendReport('kicked_out', lastChatLeft); + await notifyKickedOut(lastChatLeft); break; } // 登录失效 → 群告警(带登录二维码),结束