Merge branch 'dev' of https://github.com/QLHazyCoder/codex-oauth-automation-extension into dev
This commit is contained in:
@@ -119,6 +119,7 @@ const AUTO_STEP_DELAY_MIN_ALLOWED_SECONDS = 0;
|
|||||||
const AUTO_STEP_DELAY_MAX_ALLOWED_SECONDS = 600;
|
const AUTO_STEP_DELAY_MAX_ALLOWED_SECONDS = 600;
|
||||||
const LEGACY_AUTO_STEP_DELAY_KEYS = ['autoStepRandomDelayMinSeconds', 'autoStepRandomDelayMaxSeconds'];
|
const LEGACY_AUTO_STEP_DELAY_KEYS = ['autoStepRandomDelayMinSeconds', 'autoStepRandomDelayMaxSeconds'];
|
||||||
const DEFAULT_LOCAL_CPA_STEP9_MODE = 'submit';
|
const DEFAULT_LOCAL_CPA_STEP9_MODE = 'submit';
|
||||||
|
const DEFAULT_CPA_CALLBACK_MODE = 'step8';
|
||||||
const MAIL_2925_MODE_PROVIDE = 'provide';
|
const MAIL_2925_MODE_PROVIDE = 'provide';
|
||||||
const MAIL_2925_MODE_RECEIVE = 'receive';
|
const MAIL_2925_MODE_RECEIVE = 'receive';
|
||||||
const DEFAULT_MAIL_2925_MODE = MAIL_2925_MODE_PROVIDE;
|
const DEFAULT_MAIL_2925_MODE = MAIL_2925_MODE_PROVIDE;
|
||||||
@@ -170,6 +171,7 @@ const PERSISTED_SETTING_DEFAULTS = {
|
|||||||
vpsUrl: '',
|
vpsUrl: '',
|
||||||
vpsPassword: '',
|
vpsPassword: '',
|
||||||
localCpaStep9Mode: DEFAULT_LOCAL_CPA_STEP9_MODE,
|
localCpaStep9Mode: DEFAULT_LOCAL_CPA_STEP9_MODE,
|
||||||
|
cpaCallbackMode: DEFAULT_CPA_CALLBACK_MODE,
|
||||||
sub2apiUrl: DEFAULT_SUB2API_URL,
|
sub2apiUrl: DEFAULT_SUB2API_URL,
|
||||||
sub2apiEmail: '',
|
sub2apiEmail: '',
|
||||||
sub2apiPassword: '',
|
sub2apiPassword: '',
|
||||||
@@ -556,6 +558,12 @@ function normalizeLocalCpaStep9Mode(value = '') {
|
|||||||
: DEFAULT_LOCAL_CPA_STEP9_MODE;
|
: DEFAULT_LOCAL_CPA_STEP9_MODE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function normalizeCpaCallbackMode(value = '') {
|
||||||
|
return String(value || '').trim().toLowerCase() === 'step6'
|
||||||
|
? 'step6'
|
||||||
|
: DEFAULT_CPA_CALLBACK_MODE;
|
||||||
|
}
|
||||||
|
|
||||||
function normalizeCloudflareDomain(rawValue = '') {
|
function normalizeCloudflareDomain(rawValue = '') {
|
||||||
let value = String(rawValue || '').trim().toLowerCase();
|
let value = String(rawValue || '').trim().toLowerCase();
|
||||||
if (!value) return '';
|
if (!value) return '';
|
||||||
@@ -652,6 +660,8 @@ function normalizePersistentSettingValue(key, value) {
|
|||||||
return String(value || '');
|
return String(value || '');
|
||||||
case 'localCpaStep9Mode':
|
case 'localCpaStep9Mode':
|
||||||
return normalizeLocalCpaStep9Mode(value);
|
return normalizeLocalCpaStep9Mode(value);
|
||||||
|
case 'cpaCallbackMode':
|
||||||
|
return normalizeCpaCallbackMode(value);
|
||||||
case 'sub2apiUrl':
|
case 'sub2apiUrl':
|
||||||
return String(value || '').trim();
|
return String(value || '').trim();
|
||||||
case 'sub2apiEmail':
|
case 'sub2apiEmail':
|
||||||
@@ -3181,6 +3191,11 @@ function shouldBypassStep9ForLocalCpa(state) {
|
|||||||
&& isLocalCpaUrl(state?.vpsUrl);
|
&& isLocalCpaUrl(state?.vpsUrl);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function shouldSkipLoginVerificationForCpaCallback(state) {
|
||||||
|
return getPanelMode(state) === 'cpa'
|
||||||
|
&& normalizeCpaCallbackMode(state?.cpaCallbackMode) === 'step6';
|
||||||
|
}
|
||||||
|
|
||||||
function matchesSourceUrlFamily(source, candidateUrl, referenceUrl) {
|
function matchesSourceUrlFamily(source, candidateUrl, referenceUrl) {
|
||||||
const candidate = parseUrlSafely(candidateUrl);
|
const candidate = parseUrlSafely(candidateUrl);
|
||||||
if (!candidate) return false;
|
if (!candidate) return false;
|
||||||
@@ -5772,6 +5787,11 @@ async function runAutoSequenceFromStep(startStep, context = {}) {
|
|||||||
while (step <= 9) {
|
while (step <= 9) {
|
||||||
try {
|
try {
|
||||||
await executeStepAndWait(step, AUTO_STEP_DELAYS[step]);
|
await executeStepAndWait(step, AUTO_STEP_DELAYS[step]);
|
||||||
|
const latestState = await getState();
|
||||||
|
if (step === 6 && shouldSkipLoginVerificationForCpaCallback(latestState)) {
|
||||||
|
step = 8;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
step += 1;
|
step += 1;
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
const latestState = await getState();
|
const latestState = await getState();
|
||||||
@@ -7255,7 +7275,25 @@ async function ensureStep7VerificationPageReady() {
|
|||||||
throw new Error(`当前未进入登录验证码页面,请先重新完成步骤 6。当前状态:${stateLabel}.${urlPart}`.trim());
|
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) {
|
async function executeStep6(state) {
|
||||||
|
if (shouldSkipLoginVerificationForCpaCallback(state)) {
|
||||||
|
await skipLoginVerificationStepsForCpaCallback();
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (!state.email) {
|
if (!state.email) {
|
||||||
throw new Error('缺少邮箱地址,请先完成步骤 3。');
|
throw new Error('缺少邮箱地址,请先完成步骤 3。');
|
||||||
}
|
}
|
||||||
@@ -7384,6 +7422,16 @@ async function rerunStep6ForStep7Recovery() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async function executeStep7(state) {
|
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 currentState = state;
|
||||||
let mailPollingAttempt = 1;
|
let mailPollingAttempt = 1;
|
||||||
let lastMailPollingError = null;
|
let lastMailPollingError = null;
|
||||||
|
|||||||
@@ -123,6 +123,13 @@
|
|||||||
<button type="button" class="choice-btn" data-local-cpa-step9-mode="bypass">跳过第9步</button>
|
<button type="button" class="choice-btn" data-local-cpa-step9-mode="bypass">跳过第9步</button>
|
||||||
</div>
|
</div>
|
||||||
</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;">
|
<div class="data-row" id="row-sub2api-url" style="display:none;">
|
||||||
<span class="data-label">SUB2API</span>
|
<span class="data-label">SUB2API</span>
|
||||||
<input type="text" id="input-sub2api-url" class="data-input"
|
<input type="text" id="input-sub2api-url" class="data-input"
|
||||||
|
|||||||
@@ -56,6 +56,8 @@ const rowVpsPassword = document.getElementById('row-vps-password');
|
|||||||
const inputVpsPassword = document.getElementById('input-vps-password');
|
const inputVpsPassword = document.getElementById('input-vps-password');
|
||||||
const rowLocalCpaStep9Mode = document.getElementById('row-local-cpa-step9-mode');
|
const rowLocalCpaStep9Mode = document.getElementById('row-local-cpa-step9-mode');
|
||||||
const localCpaStep9ModeButtons = Array.from(document.querySelectorAll('[data-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 rowSub2ApiUrl = document.getElementById('row-sub2api-url');
|
||||||
const inputSub2ApiUrl = document.getElementById('input-sub2api-url');
|
const inputSub2ApiUrl = document.getElementById('input-sub2api-url');
|
||||||
const rowSub2ApiEmail = document.getElementById('row-sub2api-email');
|
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_MIN_SECONDS = 0;
|
||||||
const AUTO_STEP_DELAY_MAX_SECONDS = 600;
|
const AUTO_STEP_DELAY_MAX_SECONDS = 600;
|
||||||
const DEFAULT_LOCAL_CPA_STEP9_MODE = 'submit';
|
const DEFAULT_LOCAL_CPA_STEP9_MODE = 'submit';
|
||||||
|
const DEFAULT_CPA_CALLBACK_MODE = 'step8';
|
||||||
const MAIL_2925_MODE_PROVIDE = 'provide';
|
const MAIL_2925_MODE_PROVIDE = 'provide';
|
||||||
const MAIL_2925_MODE_RECEIVE = 'receive';
|
const MAIL_2925_MODE_RECEIVE = 'receive';
|
||||||
const DEFAULT_MAIL_2925_MODE = MAIL_2925_MODE_PROVIDE;
|
const DEFAULT_MAIL_2925_MODE = MAIL_2925_MODE_PROVIDE;
|
||||||
@@ -1121,6 +1124,7 @@ function collectSettingsPayload() {
|
|||||||
vpsUrl: inputVpsUrl.value.trim(),
|
vpsUrl: inputVpsUrl.value.trim(),
|
||||||
vpsPassword: inputVpsPassword.value,
|
vpsPassword: inputVpsPassword.value,
|
||||||
localCpaStep9Mode: getSelectedLocalCpaStep9Mode(),
|
localCpaStep9Mode: getSelectedLocalCpaStep9Mode(),
|
||||||
|
cpaCallbackMode: getSelectedCpaCallbackMode(),
|
||||||
sub2apiUrl: inputSub2ApiUrl.value.trim(),
|
sub2apiUrl: inputSub2ApiUrl.value.trim(),
|
||||||
sub2apiEmail: inputSub2ApiEmail.value.trim(),
|
sub2apiEmail: inputSub2ApiEmail.value.trim(),
|
||||||
sub2apiPassword: inputSub2ApiPassword.value,
|
sub2apiPassword: inputSub2ApiPassword.value,
|
||||||
@@ -1162,6 +1166,12 @@ function normalizeLocalCpaStep9Mode(value = '') {
|
|||||||
: DEFAULT_LOCAL_CPA_STEP9_MODE;
|
: DEFAULT_LOCAL_CPA_STEP9_MODE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function normalizeCpaCallbackMode(value = '') {
|
||||||
|
return String(value || '').trim().toLowerCase() === 'step6'
|
||||||
|
? 'step6'
|
||||||
|
: DEFAULT_CPA_CALLBACK_MODE;
|
||||||
|
}
|
||||||
|
|
||||||
function normalizeMail2925Mode(value = '') {
|
function normalizeMail2925Mode(value = '') {
|
||||||
return String(value || '').trim().toLowerCase() === MAIL_2925_MODE_RECEIVE
|
return String(value || '').trim().toLowerCase() === MAIL_2925_MODE_RECEIVE
|
||||||
? 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() {
|
function getSelectedMail2925Mode() {
|
||||||
const activeButton = mail2925ModeButtons.find((button) => button.classList.contains('is-active'));
|
const activeButton = mail2925ModeButtons.find((button) => button.classList.contains('is-active'));
|
||||||
return normalizeMail2925Mode(activeButton?.dataset.mail2925Mode);
|
return normalizeMail2925Mode(activeButton?.dataset.mail2925Mode);
|
||||||
@@ -1437,6 +1461,7 @@ function applySettingsState(state) {
|
|||||||
inputVpsUrl.value = state?.vpsUrl || '';
|
inputVpsUrl.value = state?.vpsUrl || '';
|
||||||
inputVpsPassword.value = state?.vpsPassword || '';
|
inputVpsPassword.value = state?.vpsPassword || '';
|
||||||
setLocalCpaStep9Mode(state?.localCpaStep9Mode);
|
setLocalCpaStep9Mode(state?.localCpaStep9Mode);
|
||||||
|
setCpaCallbackMode(state?.cpaCallbackMode);
|
||||||
selectPanelMode.value = state?.panelMode || 'cpa';
|
selectPanelMode.value = state?.panelMode || 'cpa';
|
||||||
inputSub2ApiUrl.value = state?.sub2apiUrl || '';
|
inputSub2ApiUrl.value = state?.sub2apiUrl || '';
|
||||||
inputSub2ApiEmail.value = state?.sub2apiEmail || '';
|
inputSub2ApiEmail.value = state?.sub2apiEmail || '';
|
||||||
@@ -2766,6 +2791,7 @@ function updatePanelModeUI() {
|
|||||||
rowVpsUrl.style.display = useSub2Api ? 'none' : '';
|
rowVpsUrl.style.display = useSub2Api ? 'none' : '';
|
||||||
rowVpsPassword.style.display = useSub2Api ? 'none' : '';
|
rowVpsPassword.style.display = useSub2Api ? 'none' : '';
|
||||||
rowLocalCpaStep9Mode.style.display = useSub2Api ? 'none' : '';
|
rowLocalCpaStep9Mode.style.display = useSub2Api ? 'none' : '';
|
||||||
|
rowCpaCallbackMode.style.display = useSub2Api ? 'none' : '';
|
||||||
rowSub2ApiUrl.style.display = useSub2Api ? '' : 'none';
|
rowSub2ApiUrl.style.display = useSub2Api ? '' : 'none';
|
||||||
rowSub2ApiEmail.style.display = useSub2Api ? '' : 'none';
|
rowSub2ApiEmail.style.display = useSub2Api ? '' : 'none';
|
||||||
rowSub2ApiPassword.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) => {
|
hotmailServiceModeButtons.forEach((button) => {
|
||||||
button.addEventListener('click', () => {
|
button.addEventListener('click', () => {
|
||||||
if (button.disabled) {
|
if (button.disabled) {
|
||||||
@@ -4805,6 +4843,9 @@ chrome.runtime.onMessage.addListener((message, _sender, sendResponse) => {
|
|||||||
if (message.payload.localCpaStep9Mode !== undefined) {
|
if (message.payload.localCpaStep9Mode !== undefined) {
|
||||||
setLocalCpaStep9Mode(message.payload.localCpaStep9Mode);
|
setLocalCpaStep9Mode(message.payload.localCpaStep9Mode);
|
||||||
}
|
}
|
||||||
|
if (message.payload.cpaCallbackMode !== undefined) {
|
||||||
|
setCpaCallbackMode(message.payload.cpaCallbackMode);
|
||||||
|
}
|
||||||
if (message.payload.oauthUrl !== undefined) {
|
if (message.payload.oauthUrl !== undefined) {
|
||||||
displayOauthUrl.textContent = message.payload.oauthUrl || '等待中...';
|
displayOauthUrl.textContent = message.payload.oauthUrl || '等待中...';
|
||||||
displayOauthUrl.classList.toggle('has-value', Boolean(message.payload.oauthUrl));
|
displayOauthUrl.classList.toggle('has-value', Boolean(message.payload.oauthUrl));
|
||||||
@@ -4968,6 +5009,7 @@ initHotmailListExpandedState();
|
|||||||
updateSaveButtonState();
|
updateSaveButtonState();
|
||||||
updateConfigMenuControls();
|
updateConfigMenuControls();
|
||||||
setLocalCpaStep9Mode(DEFAULT_LOCAL_CPA_STEP9_MODE);
|
setLocalCpaStep9Mode(DEFAULT_LOCAL_CPA_STEP9_MODE);
|
||||||
|
setCpaCallbackMode(DEFAULT_CPA_CALLBACK_MODE);
|
||||||
setMail2925Mode(DEFAULT_MAIL_2925_MODE);
|
setMail2925Mode(DEFAULT_MAIL_2925_MODE);
|
||||||
initializeReleaseInfo().catch((err) => {
|
initializeReleaseInfo().catch((err) => {
|
||||||
console.error('Failed to initialize release info:', err);
|
console.error('Failed to initialize release info:', err);
|
||||||
|
|||||||
Reference in New Issue
Block a user