重构duckduckgo邮箱获取

This commit is contained in:
QLHazyCoder
2026-05-12 02:26:46 +08:00
parent 745010d6c9
commit f81cc74c29
16 changed files with 492 additions and 53 deletions
+22 -7
View File
@@ -150,9 +150,11 @@
- 当前轮冻结后的注册方式 `resolvedSignupMethod`
- 当前统一账号标识 `accountIdentifierType / accountIdentifier`
- 当前邮箱 / 密码
- 注册邮箱运行态 `registrationEmailState = { current, previous, source, updatedAt }`
- 当前手机号注册运行态 `signupPhoneNumber / signupPhoneActivation / signupPhoneCompletedActivation`
- 侧栏“注册手机号”输入框只同步运行态 `signupPhoneNumber / accountIdentifierType / accountIdentifier`,不属于持久配置,也不参与配置导入导出
- 邮箱身份写入时会把 `accountIdentifierType / accountIdentifier` 改回邮箱,并清理旧的 `signupPhone*` 注册手机号运行态,避免后续 Step 4 / Step 8 被旧手机号污染而误走短信分支
- 邮箱写入统一通过 `setEmailState*` 同步更新 `email``registrationEmailState`;如果当前邮箱因 Step 8 恢复被清空,但还需要保留上一份 Duck / add-email 对比基线,则只清空 `current`,保留 `previous`
- 本轮联动自检重点:
1. Step 2 一旦自动取到手机号,必须立刻广播并回填侧栏运行态手机号。
2. sidepanel 重新加载后,必须从当前 state 恢复“注册手机号”文本框,而不是只恢复邮箱。
@@ -468,6 +470,7 @@ IP 代理模块在同步、切换、Change、出口探测和自动运行成功
1. 先确认当前认证页真实状态,而不是只看 `accountIdentifierType`
2. 当前是 `add-email`
- 调用 `resolveSignupEmailForFlow` 按需获取或生成本轮绑定邮箱;手机号注册不会在 Step 2 提前生成邮箱,只有真实进入 `add-email` 时才占用邮箱资源
- 如果邮箱生成器已经在生成阶段写回运行态,这里不会再重复覆盖 `registrationEmailState`,但会保留手机号身份
- 内容脚本发送 `SUBMIT_ADD_EMAIL` 填写邮箱并提交
- 页面进入邮箱验证码页后,用绑定邮箱作为 `step8VerificationTargetEmail`
3. 当前是邮箱验证码页:
@@ -489,7 +492,7 @@ IP 代理模块在同步、切换、Change、出口探测和自动运行成功
- 当登录验证码提交后进入 `phone-verification` 页时,内容脚本会显式把该页面识别为“手机验证码页”,避免与邮箱验证码页混淆。
- 手机号注册身份本身不会让 Step 8 自动走短信;只有真实页面状态是 `phone_verification_page` 时才调用短信 helper。手机号注册登录后出现 `add-email` 时,Step 8 走“按需生成邮箱 -> 绑定邮箱 -> 邮箱验证码”链路。
- 如果手机号注册账号在 Step 8 的 `add-email` / 邮箱验证码阶段失败并回退到 Step 7,Step 7 会优先使用当前轮保留的注册手机号身份重新登录,避免误用尚未绑定成功的邮箱登录。
- `email_in_use` 会在 Step 8 当前步骤内清理当前邮箱并重新打开 `add-email` 获取新邮箱;`max_check_attempts` 不继续点击认证页 `重试`,只恢复当前 Step 8。
- `email_in_use` 会在 Step 8 当前步骤内仅清空 `registrationEmailState.current / state.email`,保留 `registrationEmailState.previous` 作为上一轮比较基线,再重新打开 `add-email` 获取新邮箱;`max_check_attempts` 不继续点击认证页 `重试`,只恢复当前 Step 8。
### Step 9
@@ -599,11 +602,15 @@ Plus 模式可见步骤:
2. 点击 `获取 / 生成` 时:
- Gmail 生成 `name+tag@gmail.com`
- 2925 仅在 provide 模式下生成 `name123456@2925.com`
3. Step 2 / Step 3 进入注册流程前,会先判断当前 `state.email`
- 如果已经是与当前基邮箱兼容的完整邮箱,则直接复用
3. 生成链路与手动保存邮箱都会统一维护 `registrationEmailState = { current, previous, source, updatedAt }`
- `current` 表示当前准备提交或刚生成的注册邮箱
- `previous` 表示最近一份仍可作为 Duck / Step 8 恢复对比基线的邮箱
4. Step 2 / Step 3 进入注册流程前,不再只看单一的 `state.email`
- 如果当前完整邮箱仍与当前基邮箱兼容,则直接复用
- 如果为空或不兼容,则按当前 provider / mode 重新生成
4. 保存或执行 Step 3 时,如果手动填写的完整邮箱与当前 Gmail / 2925 provide 基邮箱不兼容,sidepanel 会直接拦截;`2925 receive` 不参与这条兼容性约束
5. auto-run fresh attempt reset 时,会保留:
5. sidepanel 手动点击“获取 / 生成”时,会把输入框当前可见邮箱一并传给后台,优先作为 Duck 新地址比较基线;如果 UI 当前为空,再回退到 `registrationEmailState.current / previous`
6. 保存或执行 Step 3 时,如果手动填写的完整邮箱与当前 Gmail / 2925 provide 基邮箱不兼容,sidepanel 会直接拦截;`2925 receive` 不参与这条兼容性约束
7. auto-run fresh attempt reset 时,会保留:
- `gmailBaseEmail`
- `mail2925BaseEmail`
@@ -645,11 +652,14 @@ Plus 模式可见步骤:
- 别名邮箱生成
- UI 文案输出
- `background/registration-email-state.js`
统一维护当前注册邮箱、上一份比较基线邮箱、来源与更新时间,并提供 Duck 生成前解析比较基线、Step 8 清空当前邮箱但保留历史基线的共享工具。
- `background/generated-email-helpers.js`
在原有 Duck / Cloudflare / iCloud / Cloudflare Temp Email 生成链路之外,新增 Gmail / 2925 的共享生成接入。
在原有 Duck / Cloudflare / iCloud / Cloudflare Temp Email 生成链路之外,新增 Gmail / 2925 的共享生成接入;Duck 生成前会按“侧栏当前可见邮箱 -> `registrationEmailState.current` -> `registrationEmailState.previous`”的顺序解析比较基线
- `background/signup-flow-helpers.js`
负责在真正提交注册邮箱前做“复用已有完整邮箱 / 重新生成”的最终决策。
负责在真正提交注册邮箱前做“复用已有完整邮箱 / 重新生成”的最终决策,并避免把生成阶段已经落库的邮箱再次重复写入运行态
### 7.1 生成邮箱
@@ -666,6 +676,11 @@ Plus 模式可见步骤:
- 自定义邮箱池
- iCloud 隐私邮箱
补充:
- 所有生成器在返回邮箱后都会统一调用 `setEmailState(..., { source })` 回写运行态,保证 `email``registrationEmailState` 同步更新。
- Duck 生成链路不会再直接拿“生成前瞬间读到的输入框值”当唯一基线,而是优先使用 sidepanel 当前可见邮箱,再回退到共享的注册邮箱运行态基线,避免生成前后地址对比失效。
### 7.1.1 Cloud Mail
组成: