From 818791f39509c4dc4547f53f129b15fe356e42f8 Mon Sep 17 00:00:00 2001 From: QLHazyCoder <2825305047@qq.com> Date: Sun, 26 Apr 2026 16:28:24 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=A2=9E=E5=BC=BA=20Plus=20Checkout=20?= =?UTF-8?q?=E5=86=85=E5=AE=B9=E8=84=9A=E6=9C=AC=EF=BC=8C=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E5=A4=9A=E6=AC=A1=E6=B3=A8=E5=85=A5=E5=90=8C=E4=B8=80=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2=E7=9A=84=E5=8A=9F=E8=83=BD=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- content/plus-checkout.js | 2 + docs/使用教程.md | 91 +++++++++++++++++++++-- tests/plus-checkout-address-input.test.js | 34 +++++++++ 3 files changed, 120 insertions(+), 7 deletions(-) diff --git a/content/plus-checkout.js b/content/plus-checkout.js index 81a10ad..216b194 100644 --- a/content/plus-checkout.js +++ b/content/plus-checkout.js @@ -1,5 +1,6 @@ // content/plus-checkout.js — ChatGPT Plus checkout helper. +(function attachPlusCheckoutContentScript() { console.log('[MultiPage:plus-checkout] Content script loaded on', location.href); window.__MULTIPAGE_PLUS_CHECKOUT_READY__ = true; @@ -1121,3 +1122,4 @@ function inspectPlusCheckoutState() { }, }; } +})(); diff --git a/docs/使用教程.md b/docs/使用教程.md index 2b2e1c1..4926491 100644 --- a/docs/使用教程.md +++ b/docs/使用教程.md @@ -1,12 +1,13 @@ -# Codex 注册扩展相关项目、更新、邮箱切换、PayPal 与 Clash Verge 配置教程 +# Codex 注册扩展相关项目、更新、邮箱、PayPal 与 Clash Verge 配置教程 -本教程用于说明相关项目地址、扩展更新方式、`Cloudflare Temp Email` 与 `QQ 邮箱` 的使用方法、`PayPal` 注册绑卡流程,以及 [Clash Verge](https://github.com/clash-verge-rev/clash-verge-rev) 的 `🔁 非港轮询` 配置方法。 +本教程用于说明相关项目地址、扩展更新方式、`Cloudflare Temp Email`、`iCloud 隐私邮箱` 与 `QQ 邮箱` 的使用方法、`PayPal` 注册绑卡流程,以及 [Clash Verge](https://github.com/clash-verge-rev/clash-verge-rev) 的 `🔁 非港轮询` 配置方法。 ## 适用场景 - 需要拉取并部署 `cpa` 或 `sub2api` 项目 - 已经安装本扩展,想更新到最新版本 - 需要把 `Cloudflare Temp Email` 用作 `邮箱生成` 或 `邮箱服务` +- 需要使用 `iCloud+` 的 `隐藏邮件地址` 作为隐私邮箱 - 需要临时切换 `QQ 邮箱` 地址继续使用 - 需要注册并使用 `PayPal` 个人账户 - 需要在 `Clash Verge` 中启用 `🔁 非港轮询` @@ -17,6 +18,8 @@ - 已安装好的扩展文件夹 - 可以打开浏览器的 `扩展程序管理` 页面 - 已准备好 `Cloudflare Temp Email` 后端地址;如需随机子域,域名解析也已配置完成 +- 一个已开通 `iCloud+` 的 Apple ID +- 一个用于接收转发邮件的邮箱 - 一个可正常登录的 `QQ 邮箱` - 一个可正常接收短信的手机号 - 一张可在线支付的借记卡或信用卡 @@ -100,7 +103,67 @@ 8. 查看搭建参考 如果你还没有部署后端,可参考 [LINUX DO 教程](https://linux.do/t/topic/316819)。 -### 第四部分:`QQ 邮箱`切换邮箱使用教程 +### 第四部分:`iCloud 隐私邮箱` 使用方法 + +1. 准备 Apple ID + 如果条件允许,建议使用非日常主力 Apple ID。 + 这样即使触发风控,也不会影响你平时常用的 Apple ID。 + +2. 在 `iPhone` 或 `iPad` 上开通并启用 `iCloud 邮件` + 打开 `设置` App。 + 点击顶部你的姓名,进入 `Apple ID` 设置。 + 点击 `iCloud`。 + 找到 `邮件`,打开右侧开关。 + 如果是首次开通,系统会提示你创建电子邮件地址。 + 输入你想要的邮箱前缀,例如 `yourname`。 + 系统会自动检查名称是否可用。 + 点击 `下一步` 后,即可创建 `yourname@icloud.com` 邮箱。 + +3. 在 `Mac` 上启用 `iCloud 邮件` + 点击屏幕左上角的苹果菜单。 + 打开 `系统设置`。 + 点击你的姓名,进入 `Apple ID` 设置。 + 点击 `iCloud`。 + 在应用列表中找到 `iCloud 邮件`,确认开关已经打开。 + 如果是首次开通,系统会引导你创建新的 `@icloud.com` 邮箱地址,按屏幕提示输入前缀即可完成。 + +4. 进入 `隐藏邮件地址` + 在 `iCloud` 页面往下滑,找到 `iCloud+` 服务。 + 点击 `隐藏邮件地址`。 + 这里就是后续要使用的隐私邮箱功能。 + +5. 先手动创建一批隐私邮箱 + 建议先手动生成一个隐私邮箱确认流程可用。 + 如果插件端直接生成,可能会遇到冷却时间或风控。 + 更稳妥的做法是先手动创建一批,例如 `20` 个左右,让插件后续自动读取。 + 同时确认 `转发至` 已经设置为你要接收邮件的邮箱。 + 完成后,手机端或平板端的准备工作就结束了。 + +6. 配置插件端的邮箱服务 + 在插件里把 `邮箱服务` 选择为你用于接收转发邮件的邮箱。 + 然后登录该邮箱,确保能正常收信。 + +7. 配置插件端的邮箱生成 + 将 `邮件生成` 选择为 `iCloud 隐私邮箱`。 + 往下滑到对应配置区域。 + 先在网页中登录你的 `iCloud`。 + 回到插件的 `隐私邮箱配置` 中点击刷新,等待插件拉取你已经创建好的隐私邮箱。 + +8. 选择邮箱使用方式 + 建议选择 `复用未使用的`。 + 如果你希望使用后释放数量,可以勾选 `使用后删除`。 + 如果不删除,隐私邮箱可以保留为长期邮箱使用。 + 目前观察到,如果一直不删除,手动创建到 `20` 多个后可能会提示数量已满,后续需要继续观察具体原因。 + +9. 控制创建频率 + 建议每天最多新建 `3` 个左右。 + 测试中一天创建过多会触发 `iCloud` 风控提示。 + +10. 查看 Apple 官方说明 + `iCloud 邮件` 主地址创建说明:[Create a primary email address for iCloud Mail](https://support.apple.com/is-is/guide/icloud/mmdd8d1c5c/icloud) + `隐藏邮件地址` 创建与转发说明:[Create and edit Hide My Email addresses on iCloud.com](https://support.apple.com/lv-lv/guide/icloud/mm1a876f7aed/icloud) + +### 第五部分:`QQ 邮箱`切换邮箱使用教程 1. 登录 `QQ 邮箱` 先登录你当前正在使用的 `QQ 邮箱` 账号。 @@ -119,7 +182,7 @@ 这两个邮箱地址使用完成后,可以直接删除。 删除后再次创建新的英文邮箱和 `Foxmail` 邮箱,即可重复注册使用。 -### 第五部分:`PayPal` 注册与绑卡使用教程 +### 第六部分:`PayPal` 注册与绑卡使用教程 1. 打开注册页面 打开 [https://www.paypal.com/signin](https://www.paypal.com/signin)。 @@ -171,14 +234,14 @@ 常见情况是上传身份证件。 `PayPal` 官方帮助中心说明,通常会在 `2 个工作日` 内审核,但某些情况可能更久。 -### 第六部分:0元试用 ChatGPT Plus 教程 +### 第七部分:0元试用 ChatGPT Plus 教程 本部分说明如何在已登录 ChatGPT 的状态下,通过脚本快速生成 Plus 支付链接,然后选择 PayPal 支付完成0元试用订阅。 #### 准备工作 1. 已有一个登录状态的 ChatGPT 账户。 -2. 一个可用的 PayPal 账户(参考第五部分进行注册和绑卡)。 +2. 一个可用的 PayPal 账户(参考第六部分进行注册和绑卡)。 3. 能够接收生成的账单地址的真实地址或虚拟地址。 4. Chrome 浏览器(推荐使用地址补全功能)。 @@ -326,7 +389,7 @@ - **PayPal 登录后页面无法继续跳转** 稍等片刻让页面加载完毕。如果长时间未响应,检查浏览器是否有弹窗被隐藏,或尝试刷新页面。 -### 第七部分:配置 [Clash Verge](https://github.com/clash-verge-rev/clash-verge-rev) 的 `🔁 非港轮询` +### 第八部分:配置 [Clash Verge](https://github.com/clash-verge-rev/clash-verge-rev) 的 `🔁 非港轮询` #### 第一步:添加扩展脚本 @@ -448,6 +511,17 @@ function main(config, profileName) { 可以。你在 `账号管理` 中创建英文邮箱和 `Foxmail` 邮箱,使用后直接删除,再重复创建即可继续使用。 +### `iCloud 隐私邮箱` 插件刷新后没有邮箱怎么办? + +先确认你已经在网页中登录 `iCloud`,并且已经在 `隐藏邮件地址` 里手动创建过隐私邮箱。 +然后回到插件的 `隐私邮箱配置` 里重新刷新,等待插件拉取已创建的邮箱。 + +### `iCloud 隐私邮箱` 要不要勾选 `使用后删除`? + +如果你想让邮箱数量及时释放,可以勾选 `使用后删除`。 +如果你想把某些地址当作长期邮箱保留,可以不删除。 +需要注意的是,如果一直不删除,隐私邮箱数量可能会很快达到上限。 + ### `PayPal` 绑卡时报错怎么办? 先去 `钱包` 页面再看一眼,有时虽然页面提示报错,但实际上已经绑定成功。 @@ -469,6 +543,9 @@ function main(config, profileName) { - 不论使用哪种方式更新扩展,更新完成后都必须在浏览器的 `扩展程序管理` 页面重新加载一次该扩展。 - 如果同时把 `Cloudflare Temp Email` 用作 `邮箱生成` 和 `邮箱服务`,请同时检查 `Admin Auth`、`Custom Auth`、`Temp 域名` 和 `邮件接收` 是否都已配置。 - 开启 `随机子域` 前,请先确认后端已经配置 `RANDOM_SUBDOMAIN_DOMAINS`,并且 Cloudflare DNS 已完成 `MX *` 设置。 +- 使用 `iCloud 隐私邮箱` 前,建议先手动创建一批地址,再让插件读取并复用。 +- `iCloud 隐私邮箱` 不建议短时间大量新建,测试中一天创建过多会触发 `iCloud` 风控提示,建议每天最多新建 `3` 个左右。 +- 如果条件允许,建议使用非日常主力 Apple ID 配置 `iCloud 隐私邮箱`,避免影响平时常用账号。 - 如需部署 `cpa`,请先确认部署环境可以访问 `OpenAI`,否则可能出现第十步认证成功但没有认证文件的问题。 - `QQ 邮箱`切换邮箱时,建议在使用完成后及时删除,再重新创建,避免混淆当前正在使用的邮箱地址。 - 中国大陆居民注册 `PayPal` 个人账户时,姓名请按身份证上的中文姓名填写,不要使用拼音。 diff --git a/tests/plus-checkout-address-input.test.js b/tests/plus-checkout-address-input.test.js index 68214cb..5ab4de8 100644 --- a/tests/plus-checkout-address-input.test.js +++ b/tests/plus-checkout-address-input.test.js @@ -1,9 +1,43 @@ const test = require('node:test'); const assert = require('node:assert/strict'); const fs = require('node:fs'); +const vm = require('node:vm'); const source = fs.readFileSync('content/plus-checkout.js', 'utf8'); +test('plus checkout content script can be injected repeatedly on the same page', () => { + const attrs = new Map(); + const context = { + console: { log() {}, warn() {}, error() {}, info() {} }, + location: { href: 'https://chatgpt.com/' }, + window: {}, + document: { + documentElement: { + getAttribute(name) { + return attrs.get(name) || null; + }, + setAttribute(name, value) { + attrs.set(name, String(value)); + }, + }, + }, + chrome: { + runtime: { + onMessage: { + addListener() {}, + }, + }, + }, + }; + context.window = context; + vm.createContext(context); + + vm.runInContext(source, context); + vm.runInContext(source, context); + + assert.equal(context.__MULTIPAGE_PLUS_CHECKOUT_READY__, true); +}); + function extractFunction(name) { const plainStart = source.indexOf(`function ${name}(`); const asyncStart = source.indexOf(`async function ${name}(`);