From 3de2fd2c6fef1e54056bba3c6deef23bf6c1f1d5 Mon Sep 17 00:00:00 2001 From: QLHazyCoder <2825305047@qq.com> Date: Sun, 12 Apr 2026 02:52:33 +0800 Subject: [PATCH] =?UTF-8?q?feat(step8):=20=E5=A2=9E=E5=BC=BA=E6=AD=A5?= =?UTF-8?q?=E9=AA=A4=208=20=E7=9A=84=E9=A1=B5=E9=9D=A2=E5=87=86=E5=A4=87?= =?UTF-8?q?=E5=92=8C=E6=81=A2=E5=A4=8D=E9=80=BB=E8=BE=91=EF=BC=8C=E7=A1=AE?= =?UTF-8?q?=E4=BF=9D=E8=AE=A4=E8=AF=81=E9=A1=B5=E5=86=85=E5=AE=B9=E8=84=9A?= =?UTF-8?q?=E6=9C=AC=E7=9A=84=E7=A8=B3=E5=AE=9A=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- background.js | 51 +++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 47 insertions(+), 4 deletions(-) diff --git a/background.js b/background.js index 012d897..3bec528 100644 --- a/background.js +++ b/background.js @@ -2607,6 +2607,7 @@ let step8PendingReject = null; const STEP8_CLICK_EFFECT_TIMEOUT_MS = 3500; const STEP8_CLICK_RETRY_DELAY_MS = 500; const STEP8_READY_WAIT_TIMEOUT_MS = 30000; +const STEP8_SIGNUP_PAGE_INJECT_FILES = ['content/utils.js', 'content/signup-page.js']; const STEP8_STRATEGIES = [ { mode: 'content', strategy: 'requestSubmit', label: 'form.requestSubmit' }, { mode: 'debugger', label: 'debugger click' }, @@ -2643,6 +2644,16 @@ function throwIfStep8SettledOrStopped(isSettled = false) { } } +async function ensureStep8SignupPageReady(tabId, options = {}) { + await ensureContentScriptReadyOnTab('signup-page', tabId, { + inject: STEP8_SIGNUP_PAGE_INJECT_FILES, + injectSource: 'signup-page', + timeoutMs: options.timeoutMs ?? 15000, + retryDelayMs: options.retryDelayMs ?? 600, + logMessage: options.logMessage || '', + }); +} + async function getStep8PageState(tabId, responseTimeoutMs = 1500) { try { const result = await sendTabMessageWithTimeout(tabId, 'signup-page', { @@ -2664,6 +2675,7 @@ async function getStep8PageState(tabId, responseTimeoutMs = 1500) { async function waitForStep8Ready(tabId, timeoutMs = STEP8_READY_WAIT_TIMEOUT_MS) { const start = Date.now(); + let recovered = false; while (Date.now() - start < timeoutMs) { throwIfStopped(); @@ -2674,13 +2686,26 @@ async function waitForStep8Ready(tabId, timeoutMs = STEP8_READY_WAIT_TIMEOUT_MS) if (pageState?.consentReady) { return pageState; } + if (pageState === null && !recovered) { + recovered = true; + await ensureStep8SignupPageReady(tabId, { + timeoutMs: Math.min(10000, timeoutMs), + logMessage: '步骤 8:认证页内容脚本已失联,正在等待页面重新就绪...', + }); + continue; + } + recovered = false; await sleepWithStop(250); } throw new Error('步骤 8:长时间未进入 OAuth 同意页,无法定位“继续”按钮。'); } -async function prepareStep8DebuggerClick() { +async function prepareStep8DebuggerClick(tabId) { + await ensureStep8SignupPageReady(tabId, { + timeoutMs: 15000, + logMessage: '步骤 8:认证页内容脚本已失联,正在恢复后继续定位按钮...', + }); const result = await sendToContentScriptResilient('signup-page', { type: 'STEP8_FIND_AND_CLICK', source: 'background', @@ -2698,7 +2723,11 @@ async function prepareStep8DebuggerClick() { return result; } -async function triggerStep8ContentStrategy(strategy) { +async function triggerStep8ContentStrategy(tabId, strategy) { + await ensureStep8SignupPageReady(tabId, { + timeoutMs: 15000, + logMessage: '步骤 8:认证页内容脚本已失联,正在恢复后继续点击“继续”按钮...', + }); const result = await sendToContentScriptResilient('signup-page', { type: 'STEP8_TRIGGER_CONTINUE', source: 'background', @@ -2722,6 +2751,7 @@ async function triggerStep8ContentStrategy(strategy) { async function waitForStep8ClickEffect(tabId, baselineUrl, timeoutMs = STEP8_CLICK_EFFECT_TIMEOUT_MS) { const start = Date.now(); + let recovered = false; while (Date.now() - start < timeoutMs) { throwIfStopped(); @@ -2740,8 +2770,17 @@ async function waitForStep8ClickEffect(tabId, baselineUrl, timeoutMs = STEP8_CLI throw new Error('步骤 8:点击“继续”后页面跳到了手机号页面,当前流程无法继续自动授权。'); } if (pageState === null) { + if (!recovered) { + recovered = true; + await ensureStep8SignupPageReady(tabId, { + timeoutMs: Math.max(3000, Math.min(8000, timeoutMs)), + logMessage: '步骤 8:点击后认证页正在重载,正在等待内容脚本重新就绪...', + }).catch(() => null); + continue; + } return { progressed: true, reason: 'page_reloading' }; } + recovered = false; if (pageState && !pageState.consentPage) { return { progressed: true, reason: 'left_consent_page', url: pageState.url }; } @@ -2846,6 +2885,10 @@ async function executeStep8(state) { chrome.webNavigation.onBeforeNavigate.addListener(webNavListener); chrome.webNavigation.onCommitted.addListener(webNavCommittedListener); chrome.tabs.onUpdated.addListener(step8TabUpdatedListener); + await ensureStep8SignupPageReady(signupTabId, { + timeoutMs: 15000, + logMessage: '步骤 8:认证页内容脚本尚未就绪,正在等待页面恢复...', + }); let attempt = 0; while (!resolved) { @@ -2863,11 +2906,11 @@ async function executeStep8(state) { await addLog(`步骤 8:第 ${round} 次尝试点击“继续”(${strategy.label})...`); if (strategy.mode === 'debugger') { - const clickTarget = await prepareStep8DebuggerClick(); + const clickTarget = await prepareStep8DebuggerClick(signupTabId); throwIfStep8SettledOrStopped(resolved); await clickWithDebugger(signupTabId, clickTarget?.rect); } else { - await triggerStep8ContentStrategy(strategy.strategy); + await triggerStep8ContentStrategy(signupTabId, strategy.strategy); } if (resolved) {