添加交流群,修改界面样式,增加步间间隔功能
This commit is contained in:
+31
-4
@@ -496,10 +496,10 @@ header {
|
||||
box-shadow: 0 0 0 1px var(--blue-glow);
|
||||
}
|
||||
|
||||
#btn-fetch-email,
|
||||
#btn-save-settings {
|
||||
padding-inline: 10px;
|
||||
.data-inline-btn {
|
||||
flex-shrink: 0;
|
||||
min-width: 56px;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.hotmail-card {
|
||||
@@ -724,10 +724,37 @@ header {
|
||||
.auto-delay-inline {
|
||||
justify-content: space-between;
|
||||
gap: 12px;
|
||||
flex-wrap: nowrap;
|
||||
}
|
||||
|
||||
.auto-delay-side {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 12px;
|
||||
flex: 0 1 auto;
|
||||
min-width: 0;
|
||||
}
|
||||
|
||||
.auto-delay-side-right {
|
||||
margin-left: auto;
|
||||
justify-content: flex-end;
|
||||
}
|
||||
|
||||
.auto-delay-check {
|
||||
flex: 0 1 auto;
|
||||
flex: 0 0 auto;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.auto-delay-check span {
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.auto-delay-caption {
|
||||
font-size: 12px;
|
||||
font-weight: 600;
|
||||
color: var(--text-muted);
|
||||
flex: 0 0 auto;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.auto-delay-controls {
|
||||
|
||||
+46
-45
@@ -90,7 +90,8 @@
|
||||
<div class="data-row" id="row-vps-password">
|
||||
<span class="data-label">管理密钥</span>
|
||||
<div class="input-with-icon">
|
||||
<input type="password" id="input-vps-password" class="data-input data-input-with-icon" placeholder="请输入 CPA 管理密钥" />
|
||||
<input type="password" id="input-vps-password" class="data-input data-input-with-icon"
|
||||
placeholder="请输入 CPA 管理密钥" />
|
||||
<button id="btn-toggle-vps-password" class="input-icon-btn" type="button" aria-label="显示管理密钥"
|
||||
title="显示管理密钥"></button>
|
||||
</div>
|
||||
@@ -104,7 +105,8 @@
|
||||
</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" placeholder="https://sub2api.hisence.fun/admin/accounts" />
|
||||
<input type="text" id="input-sub2api-url" class="data-input"
|
||||
placeholder="https://sub2api.hisence.fun/admin/accounts" />
|
||||
</div>
|
||||
<div class="data-row" id="row-sub2api-email" style="display:none;">
|
||||
<span class="data-label">账号</span>
|
||||
@@ -119,12 +121,11 @@
|
||||
<input type="text" id="input-sub2api-group" class="data-input" placeholder="默认 codex" />
|
||||
</div>
|
||||
<div class="data-row">
|
||||
<span class="data-label">codex密码</span>
|
||||
<span class="data-label">账户密码</span>
|
||||
<div class="input-with-icon">
|
||||
<input type="password" id="input-password" class="data-input data-input-with-icon"
|
||||
placeholder="codex密码,留空则自动生成" />
|
||||
<button id="btn-toggle-password" class="input-icon-btn" type="button" aria-label="显示密码"
|
||||
title="显示密码"></button>
|
||||
placeholder="codex密码,留空则自动生成" />
|
||||
<button id="btn-toggle-password" class="input-icon-btn" type="button" aria-label="显示密码" title="显示密码"></button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="data-row">
|
||||
@@ -133,11 +134,11 @@
|
||||
<select id="select-mail-provider" class="data-select">
|
||||
<option value="hotmail-api">Hotmail(微软 Graph)</option>
|
||||
<option value="163">163 邮箱 (mail.163.com)</option>
|
||||
<option value="163-vip">163 VIP 邮箱 (webmail.vip.163.com)</option>
|
||||
<option value="163-vip">163 VIP 邮箱 (vip.163.com)</option>
|
||||
<option value="qq">QQ 邮箱 (wx.mail.qq.com)</option>
|
||||
<option value="inbucket">Inbucket(自定义主机)</option>
|
||||
</select>
|
||||
<button id="btn-mail-login" class="btn btn-outline btn-sm" type="button" disabled>登录</button>
|
||||
<button id="btn-mail-login" class="btn btn-outline btn-sm data-inline-btn" type="button" disabled>登录</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="data-row" id="row-email-generator">
|
||||
@@ -153,7 +154,7 @@
|
||||
<select id="select-cf-domain" class="data-select"></select>
|
||||
<input type="text" id="input-cf-domain" class="data-input" placeholder="例如 yourdomain.xyz"
|
||||
style="display:none;" />
|
||||
<button id="btn-cf-domain-mode" class="btn btn-outline btn-sm" type="button">添加</button>
|
||||
<button id="btn-cf-domain-mode" class="btn btn-outline btn-sm data-inline-btn" type="button">添加</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="data-row" id="row-inbucket-host" style="display:none;">
|
||||
@@ -168,7 +169,7 @@
|
||||
<span class="data-label">注册邮箱</span>
|
||||
<div class="data-inline">
|
||||
<input type="text" id="input-email" class="data-input" placeholder="自动生成或手动粘贴邮箱" />
|
||||
<button id="btn-fetch-email" class="btn btn-outline btn-sm" type="button">获取</button>
|
||||
<button id="btn-fetch-email" class="btn btn-outline btn-sm data-inline-btn" type="button">获取</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="data-row data-check-row">
|
||||
@@ -181,42 +182,39 @@
|
||||
<div class="data-row">
|
||||
<span class="data-label">延迟</span>
|
||||
<div class="data-inline auto-delay-inline">
|
||||
<label class="data-check auto-delay-check" for="input-auto-delay-enabled">
|
||||
<input type="checkbox" id="input-auto-delay-enabled" />
|
||||
<span>启动前倒计时</span>
|
||||
</label>
|
||||
<div class="auto-delay-controls">
|
||||
<input type="number" id="input-auto-delay-minutes" class="data-input auto-delay-input" value="30" min="1"
|
||||
max="1440" step="1" title="启动前倒计时分钟数" />
|
||||
<span class="data-unit">分钟</span>
|
||||
<div class="auto-delay-side auto-delay-side-left">
|
||||
<label class="data-check auto-delay-check" for="input-auto-delay-enabled">
|
||||
<input type="checkbox" id="input-auto-delay-enabled" />
|
||||
</label>
|
||||
<div class="auto-delay-controls">
|
||||
<input type="number" id="input-auto-delay-minutes" class="data-input auto-delay-input" value="30" min="1"
|
||||
max="1440" step="1" title="启动前倒计时分钟数" />
|
||||
<span class="data-unit">分钟</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="auto-delay-side auto-delay-side-right">
|
||||
<span class="auto-delay-caption">步间间隔</span>
|
||||
<div class="auto-delay-controls">
|
||||
<input type="number" id="input-auto-step-delay-seconds" class="data-input auto-delay-input" value=""
|
||||
min="0" max="600" step="1" title="步间延迟秒数,0 或留空则不延迟" />
|
||||
<span class="data-unit">秒</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="data-row">
|
||||
<span class="data-label">步间随机</span>
|
||||
<div class="data-inline auto-delay-inline">
|
||||
<div class="auto-delay-controls">
|
||||
<input type="number" id="input-auto-step-delay-min-seconds" class="data-input auto-delay-input" value="12" min="0"
|
||||
max="600" step="1" title="自动运行每一步执行前的最小随机等待秒数" />
|
||||
<span class="data-unit">~</span>
|
||||
<input type="number" id="input-auto-step-delay-max-seconds" class="data-input auto-delay-input" value="18" min="0"
|
||||
max="600" step="1" title="自动运行每一步执行前的最大随机等待秒数" />
|
||||
<span class="data-unit">秒</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="data-row">
|
||||
<span class="data-label">OAuth</span>
|
||||
<span id="display-oauth-url" class="data-value mono truncate">等待中...</span>
|
||||
</div>
|
||||
<div class="data-row">
|
||||
<span class="data-label">回调</span>
|
||||
<div class="data-inline data-value-actions">
|
||||
<span id="display-localhost-url" class="data-value data-value-fill mono truncate">等待中...</span>
|
||||
<button id="btn-save-settings" class="btn btn-outline btn-sm" type="button">保存</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="data-row">
|
||||
<span class="data-label">OAuth</span>
|
||||
<span id="display-oauth-url" class="data-value mono truncate">等待中...</span>
|
||||
</div>
|
||||
<div class="data-row">
|
||||
<span class="data-label">回调</span>
|
||||
<div class="data-inline data-value-actions">
|
||||
<span id="display-localhost-url" class="data-value data-value-fill mono truncate">等待中...</span>
|
||||
<button id="btn-save-settings" class="btn btn-outline btn-sm data-inline-btn" type="button">保存</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="hotmail-section" class="data-card hotmail-card" style="display:none;">
|
||||
<div class="section-mini-header">
|
||||
<div class="section-mini-copy">
|
||||
@@ -226,7 +224,8 @@
|
||||
<div class="section-mini-actions">
|
||||
<button id="btn-clear-used-hotmail-accounts" class="btn btn-ghost btn-xs" type="button">清空已用</button>
|
||||
<button id="btn-delete-all-hotmail-accounts" class="btn btn-ghost btn-xs" type="button">全部删除</button>
|
||||
<button id="btn-toggle-hotmail-list" class="btn btn-ghost btn-xs" type="button" aria-expanded="false">展开列表</button>
|
||||
<button id="btn-toggle-hotmail-list" class="btn btn-ghost btn-xs" type="button"
|
||||
aria-expanded="false">展开列表</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="data-row">
|
||||
@@ -243,7 +242,8 @@
|
||||
</div>
|
||||
<div class="data-row">
|
||||
<span class="data-label">刷新令牌</span>
|
||||
<input type="password" id="input-hotmail-refresh-token" class="data-input mono" placeholder="必填,粘贴刷新令牌(refresh token)" />
|
||||
<input type="password" id="input-hotmail-refresh-token" class="data-input mono"
|
||||
placeholder="必填,粘贴刷新令牌(refresh token)" />
|
||||
</div>
|
||||
<div class="data-row hotmail-actions-row">
|
||||
<span class="data-label"></span>
|
||||
@@ -252,7 +252,8 @@
|
||||
<div class="data-row hotmail-import-row">
|
||||
<span class="data-label">批量导入</span>
|
||||
<div class="hotmail-import-box">
|
||||
<textarea id="input-hotmail-import" class="data-textarea mono" placeholder="账号----密码----客户端ID----刷新令牌 name@hotmail.com----password----client-id----refresh-token"></textarea>
|
||||
<textarea id="input-hotmail-import" class="data-textarea mono"
|
||||
placeholder="账号----密码----客户端ID----刷新令牌 name@hotmail.com----password----client-id----refresh-token"></textarea>
|
||||
<button id="btn-import-hotmail-accounts" class="btn btn-outline btn-sm" type="button">导入</button>
|
||||
</div>
|
||||
</div>
|
||||
@@ -372,4 +373,4 @@
|
||||
<script src="sidepanel.js"></script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
</html>
|
||||
+24
-54
@@ -85,8 +85,7 @@ const inputRunCount = document.getElementById('input-run-count');
|
||||
const inputAutoSkipFailures = document.getElementById('input-auto-skip-failures');
|
||||
const inputAutoDelayEnabled = document.getElementById('input-auto-delay-enabled');
|
||||
const inputAutoDelayMinutes = document.getElementById('input-auto-delay-minutes');
|
||||
const inputAutoStepDelayMinSeconds = document.getElementById('input-auto-step-delay-min-seconds');
|
||||
const inputAutoStepDelayMaxSeconds = document.getElementById('input-auto-step-delay-max-seconds');
|
||||
const inputAutoStepDelaySeconds = document.getElementById('input-auto-step-delay-seconds');
|
||||
const autoStartModal = document.getElementById('auto-start-modal');
|
||||
const autoStartTitle = autoStartModal?.querySelector('.modal-title');
|
||||
const autoStartMessage = document.getElementById('auto-start-message');
|
||||
@@ -112,8 +111,6 @@ const AUTO_DELAY_MAX_MINUTES = 1440;
|
||||
const AUTO_DELAY_DEFAULT_MINUTES = 30;
|
||||
const AUTO_STEP_DELAY_MIN_SECONDS = 0;
|
||||
const AUTO_STEP_DELAY_MAX_SECONDS = 600;
|
||||
const AUTO_STEP_DELAY_DEFAULT_MIN_SECONDS = 12;
|
||||
const AUTO_STEP_DELAY_DEFAULT_MAX_SECONDS = 18;
|
||||
const DEFAULT_LOCAL_CPA_STEP9_MODE = 'submit';
|
||||
|
||||
let latestState = null;
|
||||
@@ -154,7 +151,7 @@ const MAIL_PROVIDER_LOGIN_CONFIGS = {
|
||||
},
|
||||
'163-vip': {
|
||||
label: '163 VIP 邮箱',
|
||||
url: 'https://webmail.vip.163.com/',
|
||||
url: 'https://vip.163.com/',
|
||||
},
|
||||
qq: {
|
||||
label: 'QQ 邮箱',
|
||||
@@ -453,21 +450,23 @@ function normalizeAutoDelayMinutes(value) {
|
||||
return Math.min(AUTO_DELAY_MAX_MINUTES, Math.max(AUTO_DELAY_MIN_MINUTES, Math.floor(numeric)));
|
||||
}
|
||||
|
||||
function normalizeAutoStepDelaySeconds(value, fallback = AUTO_STEP_DELAY_DEFAULT_MIN_SECONDS) {
|
||||
const numeric = Number(value);
|
||||
if (!Number.isFinite(numeric)) {
|
||||
return fallback;
|
||||
function normalizeAutoStepDelaySeconds(value) {
|
||||
const rawValue = String(value ?? '').trim();
|
||||
if (!rawValue) {
|
||||
return null;
|
||||
}
|
||||
|
||||
const numeric = Number(rawValue);
|
||||
if (!Number.isFinite(numeric)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return Math.min(AUTO_STEP_DELAY_MAX_SECONDS, Math.max(AUTO_STEP_DELAY_MIN_SECONDS, Math.floor(numeric)));
|
||||
}
|
||||
|
||||
function normalizeAutoStepDelayRange(minValue, maxValue) {
|
||||
const minSeconds = normalizeAutoStepDelaySeconds(minValue, AUTO_STEP_DELAY_DEFAULT_MIN_SECONDS);
|
||||
const maxSeconds = Math.max(
|
||||
minSeconds,
|
||||
normalizeAutoStepDelaySeconds(maxValue, AUTO_STEP_DELAY_DEFAULT_MAX_SECONDS)
|
||||
);
|
||||
return { minSeconds, maxSeconds };
|
||||
function formatAutoStepDelayInputValue(value) {
|
||||
const normalized = normalizeAutoStepDelaySeconds(value);
|
||||
return normalized === null ? '' : String(normalized);
|
||||
}
|
||||
|
||||
function updateAutoDelayInputState() {
|
||||
@@ -621,10 +620,6 @@ function collectSettingsPayload() {
|
||||
const selectedCloudflareDomain = normalizeCloudflareDomainValue(
|
||||
!cloudflareDomainEditMode ? selectCfDomain.value : activeDomain
|
||||
) || activeDomain;
|
||||
const autoStepDelayRange = normalizeAutoStepDelayRange(
|
||||
inputAutoStepDelayMinSeconds.value,
|
||||
inputAutoStepDelayMaxSeconds.value
|
||||
);
|
||||
return {
|
||||
panelMode: selectPanelMode.value,
|
||||
vpsUrl: inputVpsUrl.value.trim(),
|
||||
@@ -644,8 +639,7 @@ function collectSettingsPayload() {
|
||||
autoRunSkipFailures: inputAutoSkipFailures.checked,
|
||||
autoRunDelayEnabled: inputAutoDelayEnabled.checked,
|
||||
autoRunDelayMinutes: normalizeAutoDelayMinutes(inputAutoDelayMinutes.value),
|
||||
autoStepRandomDelayMinSeconds: autoStepDelayRange.minSeconds,
|
||||
autoStepRandomDelayMaxSeconds: autoStepDelayRange.maxSeconds,
|
||||
autoStepDelaySeconds: normalizeAutoStepDelaySeconds(inputAutoStepDelaySeconds.value),
|
||||
};
|
||||
}
|
||||
|
||||
@@ -887,12 +881,7 @@ function applySettingsState(state) {
|
||||
inputAutoSkipFailures.checked = Boolean(state?.autoRunSkipFailures);
|
||||
inputAutoDelayEnabled.checked = Boolean(state?.autoRunDelayEnabled);
|
||||
inputAutoDelayMinutes.value = String(normalizeAutoDelayMinutes(state?.autoRunDelayMinutes));
|
||||
const autoStepDelayRange = normalizeAutoStepDelayRange(
|
||||
state?.autoStepRandomDelayMinSeconds,
|
||||
state?.autoStepRandomDelayMaxSeconds
|
||||
);
|
||||
inputAutoStepDelayMinSeconds.value = String(autoStepDelayRange.minSeconds);
|
||||
inputAutoStepDelayMaxSeconds.value = String(autoStepDelayRange.maxSeconds);
|
||||
inputAutoStepDelaySeconds.value = formatAutoStepDelayInputValue(state?.autoStepDelaySeconds);
|
||||
if (state?.autoRunTotalRuns) {
|
||||
inputRunCount.value = String(state.autoRunTotalRuns);
|
||||
}
|
||||
@@ -948,7 +937,7 @@ function getSelectedEmailGenerator() {
|
||||
function getEmailGeneratorUiCopy() {
|
||||
if (getSelectedEmailGenerator() === 'cloudflare') {
|
||||
return {
|
||||
buttonLabel: '生成 Cloudflare',
|
||||
buttonLabel: '生成',
|
||||
placeholder: '点击生成 Cloudflare 邮箱,或手动粘贴邮箱',
|
||||
successVerb: '生成',
|
||||
label: 'Cloudflare 邮箱',
|
||||
@@ -956,7 +945,7 @@ function getEmailGeneratorUiCopy() {
|
||||
}
|
||||
|
||||
return {
|
||||
buttonLabel: '获取 Duck',
|
||||
buttonLabel: '获取',
|
||||
placeholder: '点击获取 DuckDuckGo 邮箱,或手动粘贴邮箱',
|
||||
successVerb: '获取',
|
||||
label: 'Duck 邮箱',
|
||||
@@ -2416,28 +2405,14 @@ inputAutoDelayMinutes.addEventListener('blur', () => {
|
||||
});
|
||||
|
||||
function syncAutoStepDelayInputs() {
|
||||
const range = normalizeAutoStepDelayRange(
|
||||
inputAutoStepDelayMinSeconds.value,
|
||||
inputAutoStepDelayMaxSeconds.value
|
||||
);
|
||||
inputAutoStepDelayMinSeconds.value = String(range.minSeconds);
|
||||
inputAutoStepDelayMaxSeconds.value = String(range.maxSeconds);
|
||||
inputAutoStepDelaySeconds.value = formatAutoStepDelayInputValue(inputAutoStepDelaySeconds.value);
|
||||
}
|
||||
|
||||
inputAutoStepDelayMinSeconds.addEventListener('input', () => {
|
||||
inputAutoStepDelaySeconds.addEventListener('input', () => {
|
||||
markSettingsDirty(true);
|
||||
scheduleSettingsAutoSave();
|
||||
});
|
||||
inputAutoStepDelayMinSeconds.addEventListener('blur', () => {
|
||||
syncAutoStepDelayInputs();
|
||||
saveSettings({ silent: true }).catch(() => { });
|
||||
});
|
||||
|
||||
inputAutoStepDelayMaxSeconds.addEventListener('input', () => {
|
||||
markSettingsDirty(true);
|
||||
scheduleSettingsAutoSave();
|
||||
});
|
||||
inputAutoStepDelayMaxSeconds.addEventListener('blur', () => {
|
||||
inputAutoStepDelaySeconds.addEventListener('blur', () => {
|
||||
syncAutoStepDelayInputs();
|
||||
saveSettings({ silent: true }).catch(() => { });
|
||||
});
|
||||
@@ -2539,13 +2514,8 @@ chrome.runtime.onMessage.addListener((message) => {
|
||||
if (message.payload.autoRunDelayMinutes !== undefined) {
|
||||
inputAutoDelayMinutes.value = String(normalizeAutoDelayMinutes(message.payload.autoRunDelayMinutes));
|
||||
}
|
||||
if (message.payload.autoStepRandomDelayMinSeconds !== undefined || message.payload.autoStepRandomDelayMaxSeconds !== undefined) {
|
||||
const autoStepDelayRange = normalizeAutoStepDelayRange(
|
||||
message.payload.autoStepRandomDelayMinSeconds ?? inputAutoStepDelayMinSeconds.value,
|
||||
message.payload.autoStepRandomDelayMaxSeconds ?? inputAutoStepDelayMaxSeconds.value
|
||||
);
|
||||
inputAutoStepDelayMinSeconds.value = String(autoStepDelayRange.minSeconds);
|
||||
inputAutoStepDelayMaxSeconds.value = String(autoStepDelayRange.maxSeconds);
|
||||
if (message.payload.autoStepDelaySeconds !== undefined) {
|
||||
inputAutoStepDelaySeconds.value = formatAutoStepDelayInputValue(message.payload.autoStepDelaySeconds);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user