From 1629f3ed3dc4c6bcf882a43f125d335c7a8150f5 Mon Sep 17 00:00:00 2001 From: QLHazyCoder <2825305047@qq.com> Date: Sun, 12 Apr 2026 12:57:25 +0800 Subject: [PATCH] =?UTF-8?q?feat(step8):=20=E5=A2=9E=E5=8A=A0=E6=AD=A5?= =?UTF-8?q?=E9=AA=A4=208=20=E7=9A=84=E8=AE=A4=E8=AF=81=E9=A1=B5=E5=88=B7?= =?UTF-8?q?=E6=96=B0=E9=80=BB=E8=BE=91=EF=BC=8C=E4=BC=98=E5=8C=96=E9=87=8D?= =?UTF-8?q?=E8=AF=95=E6=9C=BA=E5=88=B6=E5=92=8C=E6=9C=80=E5=A4=A7=E5=B0=9D?= =?UTF-8?q?=E8=AF=95=E8=BD=AE=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- background.js | 67 ++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 55 insertions(+), 12 deletions(-) diff --git a/background.js b/background.js index 56761fe..1adc19e 100644 --- a/background.js +++ b/background.js @@ -2904,9 +2904,10 @@ let webNavListener = null; let webNavCommittedListener = null; let step8TabUpdatedListener = null; let step8PendingReject = null; -const STEP8_CLICK_EFFECT_TIMEOUT_MS = 3500; +const STEP8_CLICK_EFFECT_TIMEOUT_MS = 10000; const STEP8_CLICK_RETRY_DELAY_MS = 500; const STEP8_READY_WAIT_TIMEOUT_MS = 30000; +const STEP8_MAX_ROUNDS = 5; const STEP8_SIGNUP_PAGE_INJECT_FILES = ['content/utils.js', 'content/signup-page.js']; const STEP8_STRATEGIES = [ { mode: 'content', strategy: 'requestSubmit', label: 'form.requestSubmit' }, @@ -3049,6 +3050,48 @@ async function triggerStep8ContentStrategy(tabId, strategy) { return result; } +async function reloadStep8ConsentPage(tabId, timeoutMs = 30000) { + if (!Number.isInteger(tabId)) { + throw new Error('步骤 8:缺少有效的认证页标签页,无法刷新后重试。'); + } + + await chrome.tabs.update(tabId, { active: true }).catch(() => { }); + + await new Promise((resolve, reject) => { + let settled = false; + const timer = setTimeout(() => { + if (settled) return; + settled = true; + chrome.tabs.onUpdated.removeListener(listener); + reject(new Error('步骤 8:刷新认证页后等待页面完成加载超时。')); + }, timeoutMs); + + const listener = (updatedTabId, changeInfo) => { + if (updatedTabId !== tabId) return; + if (changeInfo.status !== 'complete') return; + if (settled) return; + settled = true; + clearTimeout(timer); + chrome.tabs.onUpdated.removeListener(listener); + resolve(); + }; + + chrome.tabs.onUpdated.addListener(listener); + chrome.tabs.reload(tabId, { bypassCache: false }).catch((err) => { + if (settled) return; + settled = true; + clearTimeout(timer); + chrome.tabs.onUpdated.removeListener(listener); + reject(err); + }); + }); + + await ensureStep8SignupPageReady(tabId, { + timeoutMs: Math.min(15000, timeoutMs), + logMessage: '步骤 8:认证页刷新后内容脚本尚未就绪,正在等待页面恢复...', + }); +} + async function waitForStep8ClickEffect(tabId, baselineUrl, timeoutMs = STEP8_CLICK_EFFECT_TIMEOUT_MS) { const start = Date.now(); let recovered = false; @@ -3078,12 +3121,10 @@ async function waitForStep8ClickEffect(tabId, baselineUrl, timeoutMs = STEP8_CLI }).catch(() => null); continue; } - return { progressed: true, reason: 'page_reloading' }; + await sleepWithStop(200); + continue; } recovered = false; - if (pageState && !pageState.consentPage) { - return { progressed: true, reason: 'left_consent_page', url: pageState.url }; - } await sleepWithStop(200); } @@ -3190,8 +3231,7 @@ async function executeStep8(state) { logMessage: '步骤 8:认证页内容脚本尚未就绪,正在等待页面恢复...', }); - let attempt = 0; - while (!resolved) { + for (let round = 1; round <= STEP8_MAX_ROUNDS && !resolved; round++) { throwIfStep8SettledOrStopped(resolved); const pageState = await waitForStep8Ready(signupTabId); if (!pageState?.consentReady) { @@ -3199,11 +3239,9 @@ async function executeStep8(state) { continue; } - const strategy = STEP8_STRATEGIES[attempt % STEP8_STRATEGIES.length]; - const round = attempt + 1; - attempt += 1; + const strategy = STEP8_STRATEGIES[Math.min(round - 1, STEP8_STRATEGIES.length - 1)]; - await addLog(`步骤 8:第 ${round} 次尝试点击“继续”(${strategy.label})...`); + await addLog(`步骤 8:第 ${round}/${STEP8_MAX_ROUNDS} 轮尝试点击“继续”(${strategy.label})...`); if (strategy.mode === 'debugger') { const clickTarget = await prepareStep8DebuggerClick(signupTabId); @@ -3227,7 +3265,12 @@ async function executeStep8(state) { break; } - await addLog(`步骤 8:${strategy.label} 本次未触发页面离开同意页,准备继续重试。`, 'warn'); + if (round >= STEP8_MAX_ROUNDS) { + throw new Error(`步骤 8:连续 ${STEP8_MAX_ROUNDS} 轮点击“继续”后页面仍无反应。`); + } + + await addLog(`步骤 8:${strategy.label} 本轮点击后页面无反应,正在刷新认证页后重试(下一轮 ${round + 1}/${STEP8_MAX_ROUNDS})...`, 'warn'); + await reloadStep8ConsentPage(signupTabId); await sleepWithStop(STEP8_CLICK_RETRY_DELAY_MS); } } catch (err) {