ソースを参照

feat: 增强 OAuth 认证流程,添加超时错误处理和重试机制(5次)

QLHazyCoder 4 ヶ月 前
コミット
e774ab43fc
2 ファイル変更31 行追加2 行削除
  1. 24 2
      background.js
  2. 7 0
      content/vps-panel.js

+ 24 - 2
background.js

@@ -648,6 +648,11 @@ function isRestartCurrentAttemptError(error) {
   return /当前邮箱已存在,需要重新开始新一轮/.test(message);
   return /当前邮箱已存在,需要重新开始新一轮/.test(message);
 }
 }
 
 
+function isStep9OAuthTimeoutError(error) {
+  const message = String(typeof error === 'string' ? error : error?.message || '');
+  return /STEP9_OAUTH_TIMEOUT::|认证失败:\s*Timeout waiting for OAuth callback/i.test(message);
+}
+
 function isStepDoneStatus(status) {
 function isStepDoneStatus(status) {
   return status === 'completed' || status === 'manual_completed' || status === 'skipped';
   return status === 'completed' || status === 'manual_completed' || status === 'skipped';
 }
 }
@@ -1289,6 +1294,8 @@ async function ensureAutoEmailReady(targetRun, totalRuns, attemptRuns) {
 
 
 async function runAutoSequenceFromStep(startStep, context = {}) {
 async function runAutoSequenceFromStep(startStep, context = {}) {
   const { targetRun, totalRuns, attemptRuns, continued = false } = context;
   const { targetRun, totalRuns, attemptRuns, continued = false } = context;
+  const maxStep9RestartAttempts = 5;
+  let step9RestartAttempts = 0;
 
 
   if (continued) {
   if (continued) {
     await addLog(`=== 目标 ${targetRun}/${totalRuns} 轮:继续当前进度,从步骤 ${startStep} 开始(第 ${attemptRuns} 次尝试)===`, 'info');
     await addLog(`=== 目标 ${targetRun}/${totalRuns} 轮:继续当前进度,从步骤 ${startStep} 开始(第 ${attemptRuns} 次尝试)===`, 'info');
@@ -1321,8 +1328,23 @@ async function runAutoSequenceFromStep(startStep, context = {}) {
     await chrome.tabs.update(signupTabId, { active: true });
     await chrome.tabs.update(signupTabId, { active: true });
   }
   }
 
 
-  for (let step = Math.max(startStep, 4); step <= 9; step++) {
-    await executeStepAndWait(step, AUTO_STEP_DELAYS[step]);
+  let step = Math.max(startStep, 4);
+  while (step <= 9) {
+    try {
+      await executeStepAndWait(step, AUTO_STEP_DELAYS[step]);
+      step += 1;
+    } catch (err) {
+      if (step === 9 && isStep9OAuthTimeoutError(err) && step9RestartAttempts < maxStep9RestartAttempts) {
+        step9RestartAttempts += 1;
+        await addLog(
+          `步骤 9:检测到 OAuth callback 超时,正在回到步骤 6 重新开始授权流程(${step9RestartAttempts}/${maxStep9RestartAttempts})...`,
+          'warn'
+        );
+        step = 6;
+        continue;
+      }
+      throw err;
+    }
   }
   }
 }
 }
 
 

+ 7 - 0
content/vps-panel.js

@@ -98,6 +98,10 @@ function getStatusBadgeText() {
   return statusEl ? (statusEl.textContent || '').replace(/\s+/g, ' ').trim() : '';
   return statusEl ? (statusEl.textContent || '').replace(/\s+/g, ' ').trim() : '';
 }
 }
 
 
+function isOAuthCallbackTimeoutFailure(statusText) {
+  return /认证失败:\s*Timeout waiting for OAuth callback/i.test(statusText || '');
+}
+
 async function waitForExactSuccessBadge(timeout = 30000) {
 async function waitForExactSuccessBadge(timeout = 30000) {
   const start = Date.now();
   const start = Date.now();
 
 
@@ -111,6 +115,9 @@ async function waitForExactSuccessBadge(timeout = 30000) {
   }
   }
 
 
   const finalText = getStatusBadgeText();
   const finalText = getStatusBadgeText();
+  if (isOAuthCallbackTimeoutFailure(finalText)) {
+    throw new Error(`STEP9_OAUTH_TIMEOUT::${finalText}`);
+  }
   throw new Error(finalText
   throw new Error(finalText
     ? `CPA 面板状态不是“认证成功!”,当前为“${finalText}”。`
     ? `CPA 面板状态不是“认证成功!”,当前为“${finalText}”。`
     : 'CPA 面板长时间未出现“认证成功!”状态徽标。');
     : 'CPA 面板长时间未出现“认证成功!”状态徽标。');