Bläddra i källkod

统一 CPA 文案并补充许可证

QLHazyCoder 4 månader sedan
förälder
incheckning
b1ec4fe35d
5 ändrade filer med 240 tillägg och 39 borttagningar
  1. 201 0
      LICENSE
  2. 15 15
      README.md
  3. 7 7
      background.js
  4. 14 14
      content/vps-panel.js
  5. 3 3
      sidepanel/sidepanel.html

+ 201 - 0
LICENSE

@@ -0,0 +1,201 @@
+Apache License
+Version 2.0, January 2004
+http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+   "License" shall mean the terms and conditions for use, reproduction,
+   and distribution as defined by Sections 1 through 9 of this document.
+
+   "Licensor" shall mean the copyright owner or entity authorized by
+   the copyright owner that is granting the License.
+
+   "Legal Entity" shall mean the union of the acting entity and all
+   other entities that control, are controlled by, or are under common
+   control with that entity. For the purposes of this definition,
+   "control" means (i) the power, direct or indirect, to cause the
+   direction or management of such entity, whether by contract or
+   otherwise, or (ii) ownership of fifty percent (50%) or more of the
+   outstanding shares, or (iii) beneficial ownership of such entity.
+
+   "You" (or "Your") shall mean an individual or Legal Entity
+   exercising permissions granted by this License.
+
+   "Source" form shall mean the preferred form for making modifications,
+   including but not limited to software source code, documentation
+   source, and configuration files.
+
+   "Object" form shall mean any form resulting from mechanical
+   transformation or translation of a Source form, including but
+   not limited to compiled object code, generated documentation,
+   and conversions to other media types.
+
+   "Work" shall mean the work of authorship, whether in Source or
+   Object form, made available under the License, as indicated by a
+   copyright notice that is included in or attached to the work
+   (an example is provided in the Appendix below).
+
+   "Derivative Works" shall mean any work, whether in Source or Object
+   form, that is based on (or derived from) the Work and for which the
+   editorial revisions, annotations, elaborations, or other modifications
+   represent, as a whole, an original work of authorship. For the purposes
+   of this License, Derivative Works shall not include works that remain
+   separable from, or merely link (or bind by name) to the interfaces of,
+   the Work and Derivative Works thereof.
+
+   "Contribution" shall mean any work of authorship, including
+   the original version of the Work and any modifications or additions
+   to that Work or Derivative Works thereof, that is intentionally
+   submitted to Licensor for inclusion in the Work by the copyright owner
+   or by an individual or Legal Entity authorized to submit on behalf of
+   the copyright owner. For the purposes of this definition, "submitted"
+   means any form of electronic, verbal, or written communication sent
+   to the Licensor or its representatives, including but not limited to
+   communication on electronic mailing lists, source code control systems,
+   and issue tracking systems that are managed by, or on behalf of, the
+   Licensor for the purpose of discussing and improving the Work, but
+   excluding communication that is conspicuously marked or otherwise
+   designated in writing by the copyright owner as "Not a Contribution."
+
+   "Contributor" shall mean Licensor and any individual or Legal Entity
+   on behalf of whom a Contribution has been received by Licensor and
+   subsequently incorporated within the Work.
+
+2. Grant of Copyright License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   copyright license to reproduce, prepare Derivative Works of,
+   publicly display, publicly perform, sublicense, and distribute the
+   Work and such Derivative Works in Source or Object form.
+
+3. Grant of Patent License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   (except as stated in this section) patent license to make, have made,
+   use, offer to sell, sell, import, and otherwise transfer the Work,
+   where such license applies only to those patent claims licensable
+   by such Contributor that are necessarily infringed by their
+   Contribution(s) alone or by combination of their Contribution(s)
+   with the Work to which such Contribution(s) was submitted. If You
+   institute patent litigation against any entity (including a
+   cross-claim or counterclaim in a lawsuit) alleging that the Work
+   or a Contribution incorporated within the Work constitutes direct
+   or contributory patent infringement, then any patent licenses
+   granted to You under this License for that Work shall terminate
+   as of the date such litigation is filed.
+
+4. Redistribution. You may reproduce and distribute copies of the
+   Work or Derivative Works thereof in any medium, with or without
+   modifications, and in Source or Object form, provided that You
+   meet the following conditions:
+
+   (a) You must give any other recipients of the Work or
+       Derivative Works a copy of this License; and
+
+   (b) You must cause any modified files to carry prominent notices
+       stating that You changed the files; and
+
+   (c) You must retain, in the Source form of any Derivative Works
+       that You distribute, all copyright, patent, trademark, and
+       attribution notices from the Source form of the Work,
+       excluding those notices that do not pertain to any part of
+       the Derivative Works; and
+
+   (d) If the Work includes a "NOTICE" text file as part of its
+       distribution, then any Derivative Works that You distribute must
+       include a readable copy of the attribution notices contained
+       within such NOTICE file, excluding those notices that do not
+       pertain to any part of the Derivative Works, in at least one
+       of the following places: within a NOTICE text file distributed
+       as part of the Derivative Works; within the Source form or
+       documentation, if provided along with the Derivative Works; or,
+       within a display generated by the Derivative Works, if and
+       wherever such third-party notices normally appear. The contents
+       of the NOTICE file are for informational purposes only and
+       do not modify the License. You may add Your own attribution
+       notices within Derivative Works that You distribute, alongside
+       or as an addendum to the NOTICE text from the Work, provided
+       that such additional attribution notices cannot be construed
+       as modifying the License.
+
+   You may add Your own copyright statement to Your modifications and
+   may provide additional or different license terms and conditions
+   for use, reproduction, or distribution of Your modifications, or
+   for any such Derivative Works as a whole, provided Your use,
+   reproduction, and distribution of the Work otherwise complies with
+   the conditions stated in this License.
+
+5. Submission of Contributions. Unless You explicitly state otherwise,
+   any Contribution intentionally submitted for inclusion in the Work
+   by You to the Licensor shall be under the terms and conditions of
+   this License, without any additional terms or conditions.
+   Notwithstanding the above, nothing herein shall supersede or modify
+   the terms of any separate license agreement you may have executed
+   with Licensor regarding such Contributions.
+
+6. Trademarks. This License does not grant permission to use the trade
+   names, trademarks, service marks, or product names of the Licensor,
+   except as required for reasonable and customary use in describing the
+   origin of the Work and reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty. Unless required by applicable law or
+   agreed to in writing, Licensor provides the Work (and each
+   Contributor provides its Contributions) on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+   implied, including, without limitation, any warranties or conditions
+   of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+   PARTICULAR PURPOSE. You are solely responsible for determining the
+   appropriateness of using or redistributing the Work and assume any
+   risks associated with Your exercise of permissions under this License.
+
+8. Limitation of Liability. In no event and under no legal theory,
+   whether in tort (including negligence), contract, or otherwise,
+   unless required by applicable law (such as deliberate and grossly
+   negligent acts) or agreed to in writing, shall any Contributor be
+   liable to You for damages, including any direct, indirect, special,
+   incidental, or consequential damages of any character arising as a
+   result of this License or out of the use or inability to use the
+   Work (including but not limited to damages for loss of goodwill,
+   work stoppage, computer failure or malfunction, or any and all
+   other commercial damages or losses), even if such Contributor
+   has been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability. While redistributing
+   the Work or Derivative Works thereof, You may choose to offer,
+   and charge a fee for, acceptance of support, warranty, indemnity,
+   or other liability obligations and/or rights consistent with this
+   License. However, in accepting such obligations, You may act only
+   on Your own behalf and on Your sole responsibility, not on behalf
+   of any other Contributor, and only if You agree to indemnify,
+   defend, and hold each Contributor harmless for any liability
+   incurred by, or claims asserted against, such Contributor by reason
+   of your accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
+
+APPENDIX: How to apply the Apache License to your work.
+
+   To apply the Apache License to your work, attach the following
+   boilerplate notice, with the fields enclosed by brackets "[]"
+   replaced with your own identifying information. (Don't include
+   the brackets!) The text should be enclosed in the appropriate
+   comment syntax for the file format. We also recommend that a
+   file or class name and description of purpose be included on the
+   same "printed page" as the copyright notice for easier
+   identification within third-party archives.
+
+Copyright [yyyy] [name of copyright owner]
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.

+ 15 - 15
README.md

@@ -6,7 +6,7 @@
 
 ## 当前能力
 
-- 从 VPS 面板自动获取 OpenAI OAuth 授权链接
+- 从 CPA 面板自动获取 OpenAI OAuth 授权链接
 - 自动打开 OpenAI 注册页并点击 `Sign up / Register`
 - 自动填写邮箱与密码
 - 支持自定义密码;留空时自动生成强密码
@@ -26,7 +26,7 @@
 
 - Chrome 浏览器
 - 打开扩展开发者模式
-- 你自己的 VPS 管理面板,且页面结构与当前脚本适配
+- 你自己的 CPA 管理面板,且页面结构与当前脚本适配
 - 至少准备一种验证码接收方式:
   - DuckDuckGo `@duck.com` + QQ / 163 / Inbucket 转发
   - 手动填写一个可收信邮箱
@@ -42,7 +42,7 @@
 
 ## 侧边栏配置说明
 
-### `VPS`
+### `CPA`
 
 你的管理面板 OAuth 页面地址,例如:
 
@@ -146,7 +146,7 @@ Step 3 使用的注册邮箱。
 6. `Login via OAuth`
 7. `Get Login Code`
 8. `Manual OAuth Confirm`
-9. `VPS Verify`
+9. `CPA Verify`
 
 ### Auto 模式
 
@@ -154,7 +154,7 @@ Step 3 使用的注册邮箱。
 
 当前 Auto 逻辑是:
 
-1. Step 1 获取 VPS OAuth 链接
+1. Step 1 获取 CPA OAuth 链接
 2. Step 2 打开 OpenAI 注册页
 3. 尝试自动获取 Duck 邮箱
 4. 如果 Duck 自动获取失败,暂停并等待你在侧边栏填写邮箱后点击 `Continue`
@@ -174,7 +174,7 @@ Step 3 使用的注册邮箱。
 
 通过 `content/vps-panel.js`:
 
-- 打开 VPS OAuth 面板
+- 打开 CPA OAuth 面板
 - 等待 `Codex OAuth` 卡片出现
 - 点击“登录”
 - 读取页面里的授权链接
@@ -229,7 +229,7 @@ Step 3 使用的注册邮箱。
 
 ### Step 6: Login via OAuth
 
-在登录前会先重新获取一遍最新的 VPS OAuth 链接,再使用刚注册的账号登录。
+在登录前会先重新获取一遍最新的 CPA OAuth 链接,再使用刚注册的账号登录。
 
 支持:
 
@@ -257,13 +257,13 @@ Step 3 使用的注册邮箱。
 - 如果 120 秒内没有捕获到 localhost 回调,会报错超时
 - README 中的按钮名称沿用了旧文案,但代码行为是“自动尝试点击”
 
-### Step 9: VPS Verify
+### Step 9: CPA Verify
 
-回到 VPS 面板:
+回到 CPA 面板:
 
 - 自动填写 localhost 回调地址
 - 自动点击“提交回调 URL”
-- 必须等到 VPS 面板出现精确的 `认证成功!` 状态徽标后,才判定成功
+- 必须等到 CPA 面板出现精确的 `认证成功!` 状态徽标后,才判定成功
 - 成功后会自动关闭匹配 `http://localhost:1455/auth` 这一类前缀的 localhost 残留页面
 
 ## Duck 邮箱自动获取
@@ -312,8 +312,8 @@ Step 3 使用的注册邮箱。
 
 配置项另外使用 `chrome.storage.local` 持久化保存:
 
-- VPS 地址
-- VPS 管理密钥
+- CPA 地址
+- CPA 管理密钥
 - 自定义密码
 - 邮箱服务
 - Inbucket 主机
@@ -335,7 +335,7 @@ background.js              后台主控,编排 1~9 步、Tab 复用、状态
 manifest.json              扩展清单
 data/names.js              随机姓名、生日数据
 content/utils.js           通用工具:等待元素、点击、日志、停止控制
-content/vps-panel.js       VPS 面板步骤:Step 1 / Step 9
+content/vps-panel.js       CPA 面板步骤:Step 1 / Step 9
 content/signup-page.js     OpenAI 注册/登录页步骤:Step 2 / 3 / 5 / 6 / 8
 content/duck-mail.js       Duck 邮箱自动获取
 content/qq-mail.js         QQ 邮箱验证码轮询
@@ -390,7 +390,7 @@ sidepanel/                 侧边栏 UI
 
 - Step 8 对页面结构较敏感
 - Duck 自动获取依赖 Duck 页面真实 DOM
-- VPS 面板 DOM 也需要和当前脚本选择器匹配
+- CPA 面板 DOM 也需要和当前脚本选择器匹配
 - `Auto` 按钮名称和 Step 8 的旧文案还未完全统一,但代码行为以实际实现为准
 
 ## 调试建议
@@ -403,6 +403,6 @@ sidepanel/                 侧边栏 UI
 ## 安全说明
 
 - 所有状态仅保存在浏览器会话中
-- 没有硬编码你的 VPS 地址、密码或账户
+- 没有硬编码你的 CPA 地址、密码或账户
 - 自定义密码只存在当前会话存储中
 - 邮箱和密码会被记录到本轮 `accounts` 中,便于追踪本次运行结果

+ 7 - 7
background.js

@@ -568,7 +568,7 @@ function getSourceLabel(source) {
   const labels = {
     'sidepanel': '侧边栏',
     'signup-page': '认证页',
-    'vps-panel': 'VPS 面板',
+    'vps-panel': 'CPA 面板',
     'qq-mail': 'QQ 邮箱',
     'mail-163': '163 邮箱',
     'inbucket-mail': 'Inbucket 邮箱',
@@ -1530,9 +1530,9 @@ async function resumeAutoRun() {
 
 async function executeStep1(state) {
   if (!state.vpsUrl) {
-    throw new Error('尚未配置 VPS 地址,请先在侧边栏填写。');
+    throw new Error('尚未配置 CPA 地址,请先在侧边栏填写。');
   }
-  await addLog('步骤 1:正在打开 VPS 面板...');
+  await addLog('步骤 1:正在打开 CPA 面板...');
   await reuseOrCreateTab('vps-panel', state.vpsUrl, {
     inject: ['content/utils.js', 'content/vps-panel.js'],
     reloadIfSameUrl: true,
@@ -1912,10 +1912,10 @@ async function executeStep5(state) {
 
 async function refreshOAuthUrlBeforeStep6(state) {
   if (!state.vpsUrl) {
-    throw new Error('尚未配置 VPS 地址,请先在侧边栏填写。');
+    throw new Error('尚未配置 CPA 地址,请先在侧边栏填写。');
   }
 
-  await addLog('步骤 6:正在刷新登录用的 OAuth 链接...');
+  await addLog('步骤 6:正在刷新登录用的 CPA OAuth 链接...');
   const waitForFreshOAuth = waitForStepComplete(1, 120000);
   await executeStep1(state);
   await waitForFreshOAuth;
@@ -2105,10 +2105,10 @@ async function executeStep9(state) {
     throw new Error('缺少 localhost 回调地址,请先完成步骤 8。');
   }
   if (!state.vpsUrl) {
-    throw new Error('尚未填写 VPS 地址,请先在侧边栏输入。');
+    throw new Error('尚未填写 CPA 地址,请先在侧边栏输入。');
   }
 
-  await addLog('步骤 9:正在打开 VPS 面板...');
+  await addLog('步骤 9:正在打开 CPA 面板...');
 
   let tabId = await getTabId('vps-panel');
   const alive = tabId && await isTabAlive('vps-panel');

+ 14 - 14
content/vps-panel.js

@@ -1,5 +1,5 @@
-// content/vps-panel.js — Content script for VPS panel (steps 1, 9)
-// Injected on: VPS panel (user-configured URL)
+// content/vps-panel.js — Content script for CPA panel (steps 1, 9)
+// Injected on: CPA panel (user-configured URL)
 //
 // Actual DOM structure (after login click):
 // <div class="card">
@@ -112,8 +112,8 @@ async function waitForExactSuccessBadge(timeout = 30000) {
 
   const finalText = getStatusBadgeText();
   throw new Error(finalText
-    ? `VPS 面板状态不是“认证成功!”,当前为“${finalText}”。`
-    : 'VPS 面板长时间未出现“认证成功!”状态徽标。');
+    ? `CPA 面板状态不是“认证成功!”,当前为“${finalText}”。`
+    : 'CPA 面板长时间未出现“认证成功!”状态徽标。');
 }
 
 function findManagementKeyInput() {
@@ -192,19 +192,19 @@ async function ensureOAuthManagementPage(vpsPassword, step = 1, timeout = 45000)
     const managementLoginButton = findManagementLoginButton();
     if (managementKeyInput && managementLoginButton) {
       if (!vpsPassword) {
-        throw new Error('VPS 面板需要管理密钥,请先在侧边栏填写 VPS Key(管理密钥)。');
+        throw new Error('CPA 面板需要管理密钥,请先在侧边栏填写 CPA Key(管理密钥)。');
       }
 
       if ((managementKeyInput.value || '') !== vpsPassword) {
         await humanPause(350, 900);
         fillInput(managementKeyInput, vpsPassword);
-        log(`步骤 ${step}:已填写 VPS 管理密钥。`);
+        log(`步骤 ${step}:已填写 CPA 管理密钥。`);
       }
 
       const rememberCheckbox = findRememberPasswordCheckbox();
       if (rememberCheckbox && !rememberCheckbox.checked) {
         simulateClick(rememberCheckbox);
-        log(`步骤 ${step}:已勾选 VPS 面板“记住密码”。`);
+        log(`步骤 ${step}:已勾选 CPA 面板“记住密码”。`);
         await sleep(300);
       }
 
@@ -212,7 +212,7 @@ async function ensureOAuthManagementPage(vpsPassword, step = 1, timeout = 45000)
         lastLoginAttemptAt = Date.now();
         await humanPause(350, 900);
         simulateClick(managementLoginButton);
-        log(`步骤 ${step}:已提交 VPS 管理登录。`);
+        log(`步骤 ${step}:已提交 CPA 管理登录。`);
       }
 
       await sleep(1500);
@@ -232,7 +232,7 @@ async function ensureOAuthManagementPage(vpsPassword, step = 1, timeout = 45000)
     await sleep(250);
   }
 
-  throw new Error('无法进入 VPS 的 OAuth 管理页面,请检查面板是否正常加载。URL: ' + location.href);
+  throw new Error('无法进入 CPA 的 OAuth 管理页面,请检查面板是否正常加载。URL: ' + location.href);
 }
 
 // ============================================================
@@ -242,7 +242,7 @@ async function ensureOAuthManagementPage(vpsPassword, step = 1, timeout = 45000)
 async function step1_getOAuthLink(payload) {
   const { vpsPassword } = payload || {};
 
-  log('步骤 1:正在等待 VPS 面板加载并进入 OAuth 页面...');
+  log('步骤 1:正在等待 CPA 面板加载并进入 OAuth 页面...');
 
   const { header, authUrlEl: existingAuthUrlEl } = await ensureOAuthManagementPage(vpsPassword, 1);
   let authUrlEl = existingAuthUrlEl;
@@ -266,11 +266,11 @@ async function step1_getOAuthLink(payload) {
     } catch {
       throw new Error(
         '点击 OAuth 登录按钮后未出现授权链接。' +
-        '请检查 VPS 面板服务是否正在运行。URL: ' + location.href
+        '请检查 CPA 面板服务是否正在运行。URL: ' + location.href
       );
     }
   } else {
-    log('步骤 1:VPS 面板上已显示授权链接。');
+    log('步骤 1:CPA 面板上已显示授权链接。');
   }
 
   const oauthUrl = (authUrlEl.textContent || '').trim();
@@ -283,7 +283,7 @@ async function step1_getOAuthLink(payload) {
 }
 
 // ============================================================
-// Step 9: VPS Verify — paste localhost URL and submit
+// Step 9: CPA Verify — paste localhost URL and submit
 // ============================================================
 
 async function step9_vpsVerify(payload) {
@@ -312,7 +312,7 @@ async function step9_vpsVerify(payload) {
     try {
       urlInput = await waitForElement('input[placeholder*="localhost"]', 5000);
     } catch {
-      throw new Error('在 VPS 面板中未找到回调地址输入框。URL: ' + location.href);
+      throw new Error('在 CPA 面板中未找到回调地址输入框。URL: ' + location.href);
     }
   }
 

+ 3 - 3
sidepanel/sidepanel.html

@@ -45,12 +45,12 @@
   <section id="data-section">
     <div class="data-card">
       <div class="data-row">
-        <span class="data-label">VPS</span>
+        <span class="data-label">CPA</span>
         <input type="password" id="input-vps-url" class="data-input" placeholder="http://ip:port/management.html#/oauth" />
       </div>
       <div class="data-row">
         <span class="data-label">管理密钥</span>
-        <input type="password" id="input-vps-password" class="data-input" placeholder="请输入管理密钥" />
+        <input type="password" id="input-vps-password" class="data-input" placeholder="请输入 CPA 管理密钥" />
       </div>
       <div class="data-row">
         <span class="data-label">邮箱服务</span>
@@ -160,7 +160,7 @@
       </div>
       <div class="step-row" data-step="9">
         <div class="step-indicator" data-step="9"><span class="step-num">9</span></div>
-        <button class="step-btn" data-step="9">VPS 回调验证</button>
+        <button class="step-btn" data-step="9">CPA 回调验证</button>
         <span class="step-status" data-step="9"></span>
       </div>
     </div>