From eb5041ea60be50375e109e93977d8521b1f5cc18 Mon Sep 17 00:00:00 2001 From: yml Date: Sun, 12 Apr 2026 14:53:28 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=BE=AE=E4=BF=A1=E4=BA=8C?= =?UTF-8?q?=E7=BB=B4=E7=A0=81=E5=B1=95=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/services/session/session-qq.js | 40 ++++++++++++++++--- .../src/services/session/session-wx.js | 9 ++--- docker-compose.dev.yml | 2 +- docker-compose.yml | 2 +- 4 files changed, 39 insertions(+), 14 deletions(-) diff --git a/apps/backend/src/services/session/session-qq.js b/apps/backend/src/services/session/session-qq.js index 06a80ade..6079656e 100644 --- a/apps/backend/src/services/session/session-qq.js +++ b/apps/backend/src/services/session/session-qq.js @@ -94,12 +94,40 @@ export async function extractQqQrState(page) { } try { - const qrVisible = await frame - .locator('#qrlogin_img') - .first() - .isVisible() - .catch(() => false) - const bodyText = String(await frame.locator('body').textContent()).replace(/\s+/g, ' ').trim() + const { qrVisible, bodyText } = await frame + .evaluate(() => { + const isVisible = (element) => { + if (!(element instanceof HTMLElement)) { + return false + } + + const style = window.getComputedStyle(element) + const rect = element.getBoundingClientRect() + return ( + style.display !== 'none' && + style.visibility !== 'hidden' && + style.opacity !== '0' && + rect.width > 0 && + rect.height > 0 + ) + } + + const qrImage = document.querySelector('#qrlogin_img') + const bodyText = String(document.body?.textContent || '').replace(/\s+/g, ' ').trim() + + return { + qrVisible: + qrImage instanceof HTMLImageElement && + isVisible(qrImage) && + Number(qrImage.naturalWidth || 0) > 0 && + Number(qrImage.naturalHeight || 0) > 0, + bodyText, + } + }) + .catch(() => ({ + qrVisible: false, + bodyText: '', + })) return { visible: true, diff --git a/apps/backend/src/services/session/session-wx.js b/apps/backend/src/services/session/session-wx.js index 5a681b3d..d4e7437e 100644 --- a/apps/backend/src/services/session/session-wx.js +++ b/apps/backend/src/services/session/session-wx.js @@ -120,12 +120,9 @@ export async function extractWxQrState(page) { } try { - const qrVisible = await frame - .locator('.js_qrcode_img') - .first() - .isVisible() - .catch(() => false) - const bodyText = String(await frame.locator('body').textContent()).replace(/\s+/g, ' ').trim() + const viewState = await inspectWxLoginView(frame) + const qrVisible = viewState.qrVisible + const bodyText = viewState.bodyText return { visible: true, diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml index 8f487aed..c88f781e 100644 --- a/docker-compose.dev.yml +++ b/docker-compose.dev.yml @@ -40,7 +40,7 @@ services: DATABASE_MAX_CONNECTIONS: ${DATABASE_MAX_CONNECTIONS:-10} OCR_PROJECT_ROOT: /app/subservices/ocr-worker CLAIM_BASE_URL: ${CLAIM_BASE_URL:-http://localhost/#/claim} - TENCENT_REDEEM_PROOF_MODE: ${TENCENT_REDEEM_PROOF_MODE:-basic} + TENCENT_REDEEM_PROOF_MODE: ${TENCENT_REDEEM_PROOF_MODE:-full} TENCENT_BROWSER_HEADLESS: ${TENCENT_BROWSER_HEADLESS:-true} TENCENT_BROWSER_PREWARM: ${TENCENT_BROWSER_PREWARM:-true} TENCENT_BROWSER_KEEP_ALIVE: ${TENCENT_BROWSER_KEEP_ALIVE:-true} diff --git a/docker-compose.yml b/docker-compose.yml index 0cb13786..a65785b5 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -33,7 +33,7 @@ services: DATABASE_MAX_CONNECTIONS: ${DATABASE_MAX_CONNECTIONS:-20} OCR_PROJECT_ROOT: /app/subservices/ocr-worker CLAIM_BASE_URL: ${CLAIM_BASE_URL:-http://localhost/#/claim} - TENCENT_REDEEM_PROOF_MODE: ${TENCENT_REDEEM_PROOF_MODE:-basic} + TENCENT_REDEEM_PROOF_MODE: ${TENCENT_REDEEM_PROOF_MODE:-full} TENCENT_BROWSER_HEADLESS: ${TENCENT_BROWSER_HEADLESS:-true} TENCENT_BROWSER_PREWARM: ${TENCENT_BROWSER_PREWARM:-true} TENCENT_BROWSER_KEEP_ALIVE: ${TENCENT_BROWSER_KEEP_ALIVE:-true}