二维码发送三重保护(v1.1): ①登录态预检(已登录→群里反馈'无需扫码'不再发码) ②强制确认在passport登录页才截图 ③删除整页截图兜底(只认真实二维码元素, 找不到就报错不发图)——修复早上发出简历界面截图的问题

This commit is contained in:
hermes
2026-10-19 02:07:45 +00:00
parent 2ca0be3841
commit 54eb74bd6c
2 changed files with 28 additions and 7 deletions
+19 -4
View File
@@ -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);
+9 -3
View File
@@ -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