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}