Ver código fonte

Merge branch 'dev' of https://github.com/QLHazyCoder/codex-oauth-automation-extension into dev

QLHazyCoder 4 meses atrás
pai
commit
0b3333f860
3 arquivos alterados com 97 adições e 0 exclusões
  1. 48 0
      background.js
  2. 7 0
      sidepanel/sidepanel.html
  3. 42 0
      sidepanel/sidepanel.js

+ 48 - 0
background.js

@@ -119,6 +119,7 @@ const AUTO_STEP_DELAY_MIN_ALLOWED_SECONDS = 0;
 const AUTO_STEP_DELAY_MAX_ALLOWED_SECONDS = 600;
 const LEGACY_AUTO_STEP_DELAY_KEYS = ['autoStepRandomDelayMinSeconds', 'autoStepRandomDelayMaxSeconds'];
 const DEFAULT_LOCAL_CPA_STEP9_MODE = 'submit';
+const DEFAULT_CPA_CALLBACK_MODE = 'step8';
 const MAIL_2925_MODE_PROVIDE = 'provide';
 const MAIL_2925_MODE_RECEIVE = 'receive';
 const DEFAULT_MAIL_2925_MODE = MAIL_2925_MODE_PROVIDE;
@@ -170,6 +171,7 @@ const PERSISTED_SETTING_DEFAULTS = {
   vpsUrl: '',
   vpsPassword: '',
   localCpaStep9Mode: DEFAULT_LOCAL_CPA_STEP9_MODE,
+  cpaCallbackMode: DEFAULT_CPA_CALLBACK_MODE,
   sub2apiUrl: DEFAULT_SUB2API_URL,
   sub2apiEmail: '',
   sub2apiPassword: '',
@@ -556,6 +558,12 @@ function normalizeLocalCpaStep9Mode(value = '') {
     : DEFAULT_LOCAL_CPA_STEP9_MODE;
 }
 
+function normalizeCpaCallbackMode(value = '') {
+  return String(value || '').trim().toLowerCase() === 'step6'
+    ? 'step6'
+    : DEFAULT_CPA_CALLBACK_MODE;
+}
+
 function normalizeCloudflareDomain(rawValue = '') {
   let value = String(rawValue || '').trim().toLowerCase();
   if (!value) return '';
@@ -652,6 +660,8 @@ function normalizePersistentSettingValue(key, value) {
       return String(value || '');
     case 'localCpaStep9Mode':
       return normalizeLocalCpaStep9Mode(value);
+    case 'cpaCallbackMode':
+      return normalizeCpaCallbackMode(value);
     case 'sub2apiUrl':
       return String(value || '').trim();
     case 'sub2apiEmail':
@@ -3181,6 +3191,11 @@ function shouldBypassStep9ForLocalCpa(state) {
     && isLocalCpaUrl(state?.vpsUrl);
 }
 
+function shouldSkipLoginVerificationForCpaCallback(state) {
+  return getPanelMode(state) === 'cpa'
+    && normalizeCpaCallbackMode(state?.cpaCallbackMode) === 'step6';
+}
+
 function matchesSourceUrlFamily(source, candidateUrl, referenceUrl) {
   const candidate = parseUrlSafely(candidateUrl);
   if (!candidate) return false;
@@ -5772,6 +5787,11 @@ async function runAutoSequenceFromStep(startStep, context = {}) {
   while (step <= 9) {
     try {
       await executeStepAndWait(step, AUTO_STEP_DELAYS[step]);
+      const latestState = await getState();
+      if (step === 6 && shouldSkipLoginVerificationForCpaCallback(latestState)) {
+        step = 8;
+        continue;
+      }
       step += 1;
     } catch (err) {
       const latestState = await getState();
@@ -7255,7 +7275,25 @@ async function ensureStep7VerificationPageReady() {
   throw new Error(`当前未进入登录验证码页面,请先重新完成步骤 6。当前状态:${stateLabel}.${urlPart}`.trim());
 }
 
+async function skipLoginVerificationStepsForCpaCallback() {
+  await setState({
+    lastLoginCode: null,
+    loginVerificationRequestedAt: null,
+  });
+  await setStepStatus(6, 'skipped');
+  await addLog('步骤 6:当前已选择“第六步回调”,直接跳过步骤 6、7。', 'warn');
+  const latestState = await getState();
+  if (!isStepDoneStatus(latestState.stepStatuses?.[7])) {
+    await setStepStatus(7, 'skipped');
+    await addLog('步骤 7:当前已选择“第六步回调”,本轮无需获取登录验证码。', 'warn');
+  }
+}
+
 async function executeStep6(state) {
+  if (shouldSkipLoginVerificationForCpaCallback(state)) {
+    await skipLoginVerificationStepsForCpaCallback();
+    return;
+  }
   if (!state.email) {
     throw new Error('缺少邮箱地址,请先完成步骤 3。');
   }
@@ -7384,6 +7422,16 @@ async function rerunStep6ForStep7Recovery() {
 }
 
 async function executeStep7(state) {
+  if (shouldSkipLoginVerificationForCpaCallback(state)) {
+    await setState({
+      lastLoginCode: null,
+      loginVerificationRequestedAt: null,
+    });
+    await setStepStatus(7, 'skipped');
+    await addLog('步骤 7:当前已选择“第六步回调”,本轮无需获取登录验证码。', 'warn');
+    return;
+  }
+
   let currentState = state;
   let mailPollingAttempt = 1;
   let lastMailPollingError = null;

+ 7 - 0
sidepanel/sidepanel.html

@@ -123,6 +123,13 @@
           <button type="button" class="choice-btn" data-local-cpa-step9-mode="bypass">跳过第9步</button>
         </div>
       </div>
+      <div class="data-row" id="row-cpa-callback-mode">
+        <span class="data-label">CPA回调</span>
+        <div id="cpa-callback-mode-group" class="choice-group" role="group" aria-label="CPA 回调阶段">
+          <button type="button" class="choice-btn" data-cpa-callback-mode="step6">第六步回调</button>
+          <button type="button" class="choice-btn" data-cpa-callback-mode="step8">第八步回调</button>
+        </div>
+      </div>
       <div class="data-row" id="row-sub2api-url" style="display:none;">
         <span class="data-label">SUB2API</span>
         <input type="text" id="input-sub2api-url" class="data-input"

+ 42 - 0
sidepanel/sidepanel.js

@@ -56,6 +56,8 @@ const rowVpsPassword = document.getElementById('row-vps-password');
 const inputVpsPassword = document.getElementById('input-vps-password');
 const rowLocalCpaStep9Mode = document.getElementById('row-local-cpa-step9-mode');
 const localCpaStep9ModeButtons = Array.from(document.querySelectorAll('[data-local-cpa-step9-mode]'));
+const rowCpaCallbackMode = document.getElementById('row-cpa-callback-mode');
+const cpaCallbackModeButtons = Array.from(document.querySelectorAll('[data-cpa-callback-mode]'));
 const rowSub2ApiUrl = document.getElementById('row-sub2api-url');
 const inputSub2ApiUrl = document.getElementById('input-sub2api-url');
 const rowSub2ApiEmail = document.getElementById('row-sub2api-email');
@@ -190,6 +192,7 @@ const AUTO_RUN_MAX_RETRIES_PER_ROUND = 3;
 const AUTO_STEP_DELAY_MIN_SECONDS = 0;
 const AUTO_STEP_DELAY_MAX_SECONDS = 600;
 const DEFAULT_LOCAL_CPA_STEP9_MODE = 'submit';
+const DEFAULT_CPA_CALLBACK_MODE = 'step8';
 const MAIL_2925_MODE_PROVIDE = 'provide';
 const MAIL_2925_MODE_RECEIVE = 'receive';
 const DEFAULT_MAIL_2925_MODE = MAIL_2925_MODE_PROVIDE;
@@ -1121,6 +1124,7 @@ function collectSettingsPayload() {
     vpsUrl: inputVpsUrl.value.trim(),
     vpsPassword: inputVpsPassword.value,
     localCpaStep9Mode: getSelectedLocalCpaStep9Mode(),
+    cpaCallbackMode: getSelectedCpaCallbackMode(),
     sub2apiUrl: inputSub2ApiUrl.value.trim(),
     sub2apiEmail: inputSub2ApiEmail.value.trim(),
     sub2apiPassword: inputSub2ApiPassword.value,
@@ -1162,6 +1166,12 @@ function normalizeLocalCpaStep9Mode(value = '') {
     : DEFAULT_LOCAL_CPA_STEP9_MODE;
 }
 
+function normalizeCpaCallbackMode(value = '') {
+  return String(value || '').trim().toLowerCase() === 'step6'
+    ? 'step6'
+    : DEFAULT_CPA_CALLBACK_MODE;
+}
+
 function normalizeMail2925Mode(value = '') {
   return String(value || '').trim().toLowerCase() === MAIL_2925_MODE_RECEIVE
     ? MAIL_2925_MODE_RECEIVE
@@ -1191,6 +1201,20 @@ function setLocalCpaStep9Mode(mode) {
   });
 }
 
+function getSelectedCpaCallbackMode() {
+  const activeButton = cpaCallbackModeButtons.find((button) => button.classList.contains('is-active'));
+  return normalizeCpaCallbackMode(activeButton?.dataset.cpaCallbackMode);
+}
+
+function setCpaCallbackMode(mode) {
+  const resolvedMode = normalizeCpaCallbackMode(mode);
+  cpaCallbackModeButtons.forEach((button) => {
+    const active = button.dataset.cpaCallbackMode === resolvedMode;
+    button.classList.toggle('is-active', active);
+    button.setAttribute('aria-pressed', String(active));
+  });
+}
+
 function getSelectedMail2925Mode() {
   const activeButton = mail2925ModeButtons.find((button) => button.classList.contains('is-active'));
   return normalizeMail2925Mode(activeButton?.dataset.mail2925Mode);
@@ -1437,6 +1461,7 @@ function applySettingsState(state) {
   inputVpsUrl.value = state?.vpsUrl || '';
   inputVpsPassword.value = state?.vpsPassword || '';
   setLocalCpaStep9Mode(state?.localCpaStep9Mode);
+  setCpaCallbackMode(state?.cpaCallbackMode);
   selectPanelMode.value = state?.panelMode || 'cpa';
   inputSub2ApiUrl.value = state?.sub2apiUrl || '';
   inputSub2ApiEmail.value = state?.sub2apiEmail || '';
@@ -2766,6 +2791,7 @@ function updatePanelModeUI() {
   rowVpsUrl.style.display = useSub2Api ? 'none' : '';
   rowVpsPassword.style.display = useSub2Api ? 'none' : '';
   rowLocalCpaStep9Mode.style.display = useSub2Api ? 'none' : '';
+  rowCpaCallbackMode.style.display = useSub2Api ? 'none' : '';
   rowSub2ApiUrl.style.display = useSub2Api ? '' : 'none';
   rowSub2ApiEmail.style.display = useSub2Api ? '' : 'none';
   rowSub2ApiPassword.style.display = useSub2Api ? '' : 'none';
@@ -4033,6 +4059,18 @@ localCpaStep9ModeButtons.forEach((button) => {
   });
 });
 
+cpaCallbackModeButtons.forEach((button) => {
+  button.addEventListener('click', () => {
+    const nextMode = button.dataset.cpaCallbackMode;
+    if (getSelectedCpaCallbackMode() === normalizeCpaCallbackMode(nextMode)) {
+      return;
+    }
+    setCpaCallbackMode(nextMode);
+    markSettingsDirty(true);
+    saveSettings({ silent: true }).catch(() => { });
+  });
+});
+
 hotmailServiceModeButtons.forEach((button) => {
   button.addEventListener('click', () => {
     if (button.disabled) {
@@ -4805,6 +4843,9 @@ chrome.runtime.onMessage.addListener((message, _sender, sendResponse) => {
       if (message.payload.localCpaStep9Mode !== undefined) {
         setLocalCpaStep9Mode(message.payload.localCpaStep9Mode);
       }
+      if (message.payload.cpaCallbackMode !== undefined) {
+        setCpaCallbackMode(message.payload.cpaCallbackMode);
+      }
       if (message.payload.oauthUrl !== undefined) {
         displayOauthUrl.textContent = message.payload.oauthUrl || '等待中...';
         displayOauthUrl.classList.toggle('has-value', Boolean(message.payload.oauthUrl));
@@ -4968,6 +5009,7 @@ initHotmailListExpandedState();
 updateSaveButtonState();
 updateConfigMenuControls();
 setLocalCpaStep9Mode(DEFAULT_LOCAL_CPA_STEP9_MODE);
+setCpaCallbackMode(DEFAULT_CPA_CALLBACK_MODE);
 setMail2925Mode(DEFAULT_MAIL_2925_MODE);
 initializeReleaseInfo().catch((err) => {
   console.error('Failed to initialize release info:', err);