diff --git a/scripts/login-qrcode.js b/scripts/login-qrcode.js index d8b8158..82546b0 100644 --- a/scripts/login-qrcode.js +++ b/scripts/login-qrcode.js @@ -19,9 +19,18 @@ const OUT = process.argv[3] || `/tmp/zhaopin-login-qr-${PORT}.png`; (async () => { const b = await chromium.connectOverCDP(`http://127.0.0.1:${PORT}`); let p = b.contexts()[0]?.pages().find(x => /passport\.zhaopin\.com/.test(x.url())); + + // v1.1(2026-10-15):登录态预检——不在登录页且推荐页有卡片 = 已登录,无需发码 if (!p) { + const rec = b.contexts()[0]?.pages().find(x => /rd\d?\.zhaopin\.com/.test(x.url())); + if (rec) { + const logged = await rec.evaluate(() => + !location.href.includes('passport') && document.querySelectorAll('.recommend-item').length > 0 + ).catch(() => false); + if (logged) { console.log('ALREADY_LOGGED_IN'); process.exit(0); } // 特殊退出码0+标记:已登录 + } // 找推荐页tab刷新,触发跳转到登录页 - p = b.contexts()[0]?.pages().find(x => /rd\d?\.zhaopin\.com/.test(x.url())) || b.contexts()[0]?.pages()[0]; + p = rec || b.contexts()[0]?.pages()[0]; if (!p) { console.error('NO_PAGE'); process.exit(1); } await p.reload({ waitUntil: 'domcontentloaded', timeout: 60000 }).catch(() => {}); await new Promise(r => setTimeout(r, 4000)); @@ -37,6 +46,11 @@ const OUT = process.argv[3] || `/tmp/zhaopin-login-qr-${PORT}.png`; } console.log('PAGE:', p.url().slice(0, 90)); + // v1.1:确认真的在登录页(防止误把推荐页/其他页面截图当二维码发出去) + if (!/passport\.zhaopin\.com/.test(p.url())) { + console.error('NOT_LOGIN_PAGE'); process.exit(1); + } + // 等二维码出现(canvas 或 img.qr / 二维码容器,多选择器兜底) const qrSel = [ 'canvas', // 智联登录二维码多为 canvas 绘制 @@ -63,9 +77,10 @@ const OUT = process.argv[3] || `/tmp/zhaopin-login-qr-${PORT}.png`; await el.screenshot({ path: OUT }).catch(async () => { await p.screenshot({ path: OUT }); }); console.log('QR_ELEMENT_SHOT'); } else { - // 兜底:整页截图(登录页通常是全屏二维码布局) - await p.screenshot({ path: OUT }); - console.log('FULLPAGE_SHOT'); + // v1.1(2026-10-15):删掉整页截图兜底——找不到二维码元素就报错, + // 不许把非二维码图片(登录页全屏/推荐页截图)当二维码发出去(用户10-15反馈) + console.error('NO_QR_ELEMENT'); + process.exit(1); } console.log('SAVED:', OUT); process.exit(0); diff --git a/scripts/send-qr.sh b/scripts/send-qr.sh index 5588a0c..3485e6c 100755 --- a/scripts/send-qr.sh +++ b/scripts/send-qr.sh @@ -26,14 +26,20 @@ for ACCT in $ACCTS; do *) echo "未知账号: $ACCT(只支持 hr1/hr2/both)"; exit 1;; esac QR=/tmp/zhaopin-login-qr-$ACCT-request.png - echo "[$ACCT] 抓取二维码(刷新登录页拿新码)..." - if node "$SCRIPTS/login-qrcode.js" $PORT $QR 2>&1 | grep -q SAVED && [ -s "$QR" ]; then + echo "[$ACCT] 检查登录态并抓取二维码..." + QROUT=$(node "$SCRIPTS/login-qrcode.js" $PORT $QR 2>&1) + if echo "$QROUT" | grep -q ALREADY_LOGGED_IN; then + # v1.1(2026-10-15):已登录无需发码——群里明确反馈(不要静默) + printf "✅ %s(%s)当前已是登录状态,无需扫码。如仍无法筛选请 @机器人 说明情况" "$ACCT" "$LABEL" > /tmp/qr-req-$ACCT.txt + $HERMES send -t "feishu:$DEST" -f /tmp/qr-req-$ACCT.txt >/dev/null 2>&1 + echo "[$ACCT] ✅ 已是登录状态,已反馈(未发二维码)" + elif echo "$QROUT" | grep -q SAVED && [ -s "$QR" ] && echo "$QROUT" | grep -q QR_ELEMENT_SHOT; then printf "🚨 当前%s(%s)账号登录二维码(实时抓取):\n扫码可重新登录" "$ACCT" "$LABEL" > /tmp/qr-req-$ACCT.txt echo "MEDIA:$QR" >> /tmp/qr-req-$ACCT.txt $HERMES send -t "feishu:$DEST" -f /tmp/qr-req-$ACCT.txt >/dev/null 2>&1 \ && echo "[$ACCT] ✅ 已发送二维码 → $([ "$DEST" = "$GROUP" ] && echo 群 || echo 私聊)" \ || echo "[$ACCT] ❌ 发送失败" else - echo "[$ACCT] ❌ 二维码抓取失败(CDP不通或页面异常)" + echo "[$ACCT] ❌ 二维码抓取失败(未找到真实二维码元素或CDP不通),未发送任何图片" fi done