Merge upstream/master and resolve PR conflicts
This commit is contained in:
+73
-2
@@ -41,6 +41,10 @@ const AUTO_RUN_DELAY_MIN_MINUTES = 1;
|
||||
const AUTO_RUN_DELAY_MAX_MINUTES = 1440;
|
||||
const AUTO_RUN_RETRY_DELAY_MS = 3000;
|
||||
const AUTO_RUN_MAX_RETRIES_PER_ROUND = 3;
|
||||
const AUTO_STEP_RANDOM_DELAY_MIN_ALLOWED_SECONDS = 0;
|
||||
const AUTO_STEP_RANDOM_DELAY_MAX_ALLOWED_SECONDS = 600;
|
||||
const AUTO_STEP_RANDOM_DELAY_DEFAULT_MIN_SECONDS = 12;
|
||||
const AUTO_STEP_RANDOM_DELAY_DEFAULT_MAX_SECONDS = 18;
|
||||
const DEFAULT_LOCAL_CPA_STEP9_MODE = 'submit';
|
||||
|
||||
initializeSessionStorageAccess();
|
||||
@@ -62,6 +66,8 @@ const PERSISTED_SETTING_DEFAULTS = {
|
||||
autoRunSkipFailures: true, // 保留旧字段兼容;自动运行遇错时默认重试当前轮。
|
||||
autoRunDelayEnabled: false, // 自动运行是否启用启动前倒计时。
|
||||
autoRunDelayMinutes: 30, // 自动运行倒计时分钟数。
|
||||
autoStepRandomDelayMinSeconds: AUTO_STEP_RANDOM_DELAY_DEFAULT_MIN_SECONDS, // 自动运行每一步执行前的最小随机等待秒数。
|
||||
autoStepRandomDelayMaxSeconds: AUTO_STEP_RANDOM_DELAY_DEFAULT_MAX_SECONDS, // 自动运行每一步执行前的最大随机等待秒数。
|
||||
mailProvider: '163', // 验证码邮箱来源(163 / 163-vip / qq / inbucket)。
|
||||
emailGenerator: 'duck', // 注册邮箱生成方式:duck / cloudflare。
|
||||
inbucketHost: '', // 仅当 mailProvider 为 inbucket 时填写 Inbucket 地址,其他情况保持为空。
|
||||
@@ -69,7 +75,6 @@ const PERSISTED_SETTING_DEFAULTS = {
|
||||
cloudflareDomain: '', // 仅当 emailGenerator=cloudflare 时填写自定义域名。
|
||||
cloudflareDomains: [], // Cloudflare 可选域名列表。
|
||||
hotmailAccounts: [],
|
||||
autoRunDelayEnabled: false,
|
||||
};
|
||||
|
||||
const PERSISTED_SETTING_KEYS = Object.keys(PERSISTED_SETTING_DEFAULTS);
|
||||
@@ -122,6 +127,32 @@ function normalizeAutoRunDelayMinutes(value) {
|
||||
);
|
||||
}
|
||||
|
||||
function normalizeAutoStepRandomDelaySeconds(value, fallback = AUTO_STEP_RANDOM_DELAY_DEFAULT_MIN_SECONDS) {
|
||||
const numeric = Number(value);
|
||||
if (!Number.isFinite(numeric)) {
|
||||
return fallback;
|
||||
}
|
||||
return Math.min(
|
||||
AUTO_STEP_RANDOM_DELAY_MAX_ALLOWED_SECONDS,
|
||||
Math.max(AUTO_STEP_RANDOM_DELAY_MIN_ALLOWED_SECONDS, Math.floor(numeric))
|
||||
);
|
||||
}
|
||||
|
||||
function normalizeAutoStepRandomDelayRange(settings = {}) {
|
||||
const minSeconds = normalizeAutoStepRandomDelaySeconds(
|
||||
settings.autoStepRandomDelayMinSeconds,
|
||||
PERSISTED_SETTING_DEFAULTS.autoStepRandomDelayMinSeconds
|
||||
);
|
||||
const maxSeconds = Math.max(
|
||||
minSeconds,
|
||||
normalizeAutoStepRandomDelaySeconds(
|
||||
settings.autoStepRandomDelayMaxSeconds,
|
||||
PERSISTED_SETTING_DEFAULTS.autoStepRandomDelayMaxSeconds
|
||||
)
|
||||
);
|
||||
return { minSeconds, maxSeconds };
|
||||
}
|
||||
|
||||
function normalizeRunCount(value) {
|
||||
const numeric = Number(value);
|
||||
if (!Number.isFinite(numeric)) {
|
||||
@@ -219,6 +250,16 @@ function normalizePersistentSettingValue(key, value) {
|
||||
return Boolean(value);
|
||||
case 'autoRunDelayMinutes':
|
||||
return normalizeAutoRunDelayMinutes(value);
|
||||
case 'autoStepRandomDelayMinSeconds':
|
||||
return normalizeAutoStepRandomDelaySeconds(
|
||||
value,
|
||||
PERSISTED_SETTING_DEFAULTS.autoStepRandomDelayMinSeconds
|
||||
);
|
||||
case 'autoStepRandomDelayMaxSeconds':
|
||||
return normalizeAutoStepRandomDelaySeconds(
|
||||
value,
|
||||
PERSISTED_SETTING_DEFAULTS.autoStepRandomDelayMaxSeconds
|
||||
);
|
||||
case 'mailProvider':
|
||||
return normalizeMailProvider(value);
|
||||
case 'emailGenerator':
|
||||
@@ -267,6 +308,15 @@ function buildPersistentSettingsPayload(input = {}, options = {}) {
|
||||
payload.cloudflareDomains = domains;
|
||||
}
|
||||
|
||||
if (payload.autoStepRandomDelayMinSeconds !== undefined || payload.autoStepRandomDelayMaxSeconds !== undefined) {
|
||||
const normalizedDelayRange = normalizeAutoStepRandomDelayRange({
|
||||
autoStepRandomDelayMinSeconds: payload.autoStepRandomDelayMinSeconds,
|
||||
autoStepRandomDelayMaxSeconds: payload.autoStepRandomDelayMaxSeconds,
|
||||
});
|
||||
payload.autoStepRandomDelayMinSeconds = normalizedDelayRange.minSeconds;
|
||||
payload.autoStepRandomDelayMaxSeconds = normalizedDelayRange.maxSeconds;
|
||||
}
|
||||
|
||||
return payload;
|
||||
}
|
||||
|
||||
@@ -2425,6 +2475,12 @@ async function humanStepDelay(min = HUMAN_STEP_DELAY_MIN, max = HUMAN_STEP_DELAY
|
||||
await sleepWithStop(duration);
|
||||
}
|
||||
|
||||
function getAutoStepRandomDelayMs(min, max) {
|
||||
const normalizedMin = Math.max(0, Math.floor(Number(min) || 0));
|
||||
const normalizedMax = Math.max(normalizedMin, Math.floor(Number(max) || normalizedMin));
|
||||
return Math.floor(Math.random() * (normalizedMax - normalizedMin + 1)) + normalizedMin;
|
||||
}
|
||||
|
||||
async function clickWithDebugger(tabId, rect) {
|
||||
throwIfStopped();
|
||||
if (!tabId) {
|
||||
@@ -3031,6 +3087,19 @@ async function executeStep(step) {
|
||||
async function executeStepAndWait(step, delayAfter = 2000) {
|
||||
throwIfStopped();
|
||||
|
||||
const delaySettings = normalizeAutoStepRandomDelayRange(await getState());
|
||||
const randomDelayMs = getAutoStepRandomDelayMs(
|
||||
delaySettings.minSeconds * 1000,
|
||||
delaySettings.maxSeconds * 1000
|
||||
);
|
||||
if (randomDelayMs > 0) {
|
||||
await addLog(
|
||||
`自动运行:步骤 ${step} 执行前随机等待 ${delaySettings.minSeconds}-${delaySettings.maxSeconds} 秒,本次约 ${Math.round(randomDelayMs / 1000)} 秒,避免节奏过快。`,
|
||||
'info'
|
||||
);
|
||||
await sleepWithStop(randomDelayMs);
|
||||
}
|
||||
|
||||
if (AUTO_RUN_BACKGROUND_COMPLETED_STEPS.has(step)) {
|
||||
await addLog(`自动运行:步骤 ${step} 由后台流程负责收尾,执行函数返回后将直接进入下一步。`, 'info');
|
||||
await executeStep(step);
|
||||
@@ -3457,6 +3526,8 @@ async function autoRunLoop(totalRuns, options = {}) {
|
||||
autoRunSkipFailures: prevState.autoRunSkipFailures,
|
||||
autoRunDelayEnabled: prevState.autoRunDelayEnabled,
|
||||
autoRunDelayMinutes: prevState.autoRunDelayMinutes,
|
||||
autoStepRandomDelayMinSeconds: prevState.autoStepRandomDelayMinSeconds,
|
||||
autoStepRandomDelayMaxSeconds: prevState.autoStepRandomDelayMaxSeconds,
|
||||
mailProvider: prevState.mailProvider,
|
||||
emailGenerator: prevState.emailGenerator,
|
||||
inbucketHost: prevState.inbucketHost,
|
||||
@@ -4360,7 +4431,7 @@ let webNavListener = null;
|
||||
let webNavCommittedListener = null;
|
||||
let step8TabUpdatedListener = null;
|
||||
let step8PendingReject = null;
|
||||
const STEP8_CLICK_EFFECT_TIMEOUT_MS = 10000;
|
||||
const STEP8_CLICK_EFFECT_TIMEOUT_MS = 15000;
|
||||
const STEP8_CLICK_RETRY_DELAY_MS = 500;
|
||||
const STEP8_READY_WAIT_TIMEOUT_MS = 30000;
|
||||
const STEP8_MAX_ROUNDS = 5;
|
||||
|
||||
Reference in New Issue
Block a user