From 6216a269566e007c602d577f3da1198cf856d3d3 Mon Sep 17 00:00:00 2001 From: QLHazyCoder <2825305047@qq.com> Date: Sat, 16 May 2026 17:34:45 +0800 Subject: [PATCH] fix: update official site links --- README.md | 2 +- background/contribution-oauth.js | 2 +- docs/使用教程.md | 6 +++--- sidepanel/contribution-content-update-service.js | 2 +- sidepanel/contribution-mode.js | 4 ++-- sidepanel/sidepanel.js | 10 +++++----- tests/contribution-content-update-service.test.js | 4 ++-- ...anel-cloudflare-temp-email-random-subdomain.test.js | 4 ++-- tests/sidepanel-contribution-mode.test.js | 8 ++++---- tests/sidepanel-new-user-guide.test.js | 6 +++--- 项目完整链路说明.md | 10 +++++----- 项目文件结构说明.md | 6 +++--- 12 files changed, 32 insertions(+), 32 deletions(-) diff --git a/README.md b/README.md index 3302f1f..6ea1b06 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ # 交流群请进官网查看 -### 点击进入官网查看最新地址与交流群入口 +### 点击进入官网查看最新地址与交流群入口 **最新地址、交流群入口、最新通知,统一以官网为准。** diff --git a/background/contribution-oauth.js b/background/contribution-oauth.js index e0ec423..749e2d0 100644 --- a/background/contribution-oauth.js +++ b/background/contribution-oauth.js @@ -1,7 +1,7 @@ (function attachBackgroundContributionOAuth(root, factory) { root.MultiPageBackgroundContributionOAuth = factory(); })(typeof self !== 'undefined' ? self : globalThis, function createBackgroundContributionOAuthModule() { - const API_BASE_URL = 'https://apikey.qzz.io/oauth/api'; + const API_BASE_URL = 'https://flowpilot.qlhazycoder.top/oauth/api'; const ACTIVE_STATUSES = new Set(['started', 'waiting', 'processing']); const FINAL_STATUSES = new Set(['auto_approved', 'auto_rejected', 'manual_review_required', 'expired', 'error']); const CALLBACK_FINAL_STATUSES = new Set(['submitted']); diff --git a/docs/使用教程.md b/docs/使用教程.md index b3c335e..8126f4f 100644 --- a/docs/使用教程.md +++ b/docs/使用教程.md @@ -640,9 +640,9 @@ 1. 打开 [Clash Verge](https://github.com/clash-verge-rev/clash-verge-rev),进入左侧的 `订阅`(`Profiles`)界面。 2. 在右上角或对应位置找到并双击打开 `全局扩展脚本`。 -![05d15cd026ec21d0cffde04ad0d1a6c9](https://apikey.qzz.io/content-assets/library/2026/04/20260424-163252--05d15cd026ec21d0cffde04ad0d1a6c9--0a59ba73acff.png) +![05d15cd026ec21d0cffde04ad0d1a6c9](https://flowpilot.qlhazycoder.top/content-assets/library/2026/04/20260424-163252--05d15cd026ec21d0cffde04ad0d1a6c9--0a59ba73acff.png) 3. 将里面的内容全部清空,替换为下方脚本代码。 -![2026 04 25 003728](https://apikey.qzz.io/content-assets/library/2026/04/20260424-163745--2026-04-25-003728--59bf89f34367.png) +![2026 04 25 003728](https://flowpilot.qlhazycoder.top/content-assets/library/2026/04/20260424-163745--2026-04-25-003728--59bf89f34367.png) 4. 点击保存,使用右上角保存按钮或按 `Ctrl+S`。 💻 脚本代码(如果遇到格式错误,可让豆包帮你修复后再粘贴) @@ -741,7 +741,7 @@ function main(config, profileName) { 3. 在对应下拉框中选择 `🔁 非港轮询`。 4. 确认右上角的 `代理模式`(`Mode`)已经设置为 `规则模式`(`Rule`)。 5. 确认左侧 `设置` 中的 `系统代理`(`System Proxy`)已经开启。 -![2026 04 25 003703](https://apikey.qzz.io/content-assets/library/2026/04/20260424-163745--2026-04-25-003703--21e892504b82.png) +![2026 04 25 003703](https://flowpilot.qlhazycoder.top/content-assets/library/2026/04/20260424-163745--2026-04-25-003703--21e892504b82.png) ### 第十三部分:订阅节点与自建推荐 diff --git a/sidepanel/contribution-content-update-service.js b/sidepanel/contribution-content-update-service.js index ba158fe..b496b16 100644 --- a/sidepanel/contribution-content-update-service.js +++ b/sidepanel/contribution-content-update-service.js @@ -1,5 +1,5 @@ (() => { - const PORTAL_BASE_URL = 'https://apikey.qzz.io'; + const PORTAL_BASE_URL = 'https://flowpilot.qlhazycoder.top'; const CONTENT_SUMMARY_API_URL = `${PORTAL_BASE_URL}/api/content-summary`; const CACHE_KEY = 'multipage-contribution-content-summary-v1'; const FETCH_TIMEOUT_MS = 6000; diff --git a/sidepanel/contribution-mode.js b/sidepanel/contribution-mode.js index 891caa1..e511d08 100644 --- a/sidepanel/contribution-mode.js +++ b/sidepanel/contribution-mode.js @@ -15,8 +15,8 @@ constants = {}, } = context; - const contributionPortalUrl = constants.contributionPortalUrl || 'https://apikey.qzz.io'; - const contributionUploadUrl = constants.contributionUploadUrl || 'https://apikey.qzz.io/upload'; + const contributionPortalUrl = constants.contributionPortalUrl || 'https://flowpilot.qlhazycoder.top'; + const contributionUploadUrl = constants.contributionUploadUrl || 'https://flowpilot.qlhazycoder.top/upload'; const pollIntervalMs = Math.max(1500, Math.floor(Number(constants.pollIntervalMs) || 2500)); const hiddenRows = [ diff --git a/sidepanel/sidepanel.js b/sidepanel/sidepanel.js index 93e9c0b..eebdd26 100644 --- a/sidepanel/sidepanel.js +++ b/sidepanel/sidepanel.js @@ -976,7 +976,7 @@ const DEFAULT_LUCKMAIL_BASE_URL = 'https://mails.luckyous.com'; const DEFAULT_LUCKMAIL_EMAIL_TYPE = 'ms_graph'; const DISPLAY_TIMEZONE = 'Asia/Shanghai'; const DEFAULT_ACCOUNT_RUN_HISTORY_HELPER_BASE_URL = 'http://127.0.0.1:17373'; -const CONTRIBUTION_UPLOAD_URL = 'https://apikey.qzz.io/'; +const CONTRIBUTION_UPLOAD_URL = 'https://flowpilot.qlhazycoder.top/'; const DEFAULT_PHONE_VERIFICATION_ENABLED = false; const DEFAULT_HERO_SMS_COUNTRY_ID = 52; const DEFAULT_HERO_SMS_COUNTRY_LABEL = 'Thailand'; @@ -1971,7 +1971,7 @@ function shouldPromptNewUserGuide() { } function getContributionPortalUrl() { - return String(contributionContentService?.portalUrl || 'https://apikey.qzz.io').trim(); + return String(contributionContentService?.portalUrl || 'https://flowpilot.qlhazycoder.top').trim(); } function openNewUserGuidePrompt() { @@ -12128,9 +12128,9 @@ const contributionModeManager = window.SidepanelContributionMode?.createContribu sendMessage: (message) => chrome.runtime.sendMessage(message), }, constants: { - contributionOauthUrl: `${String(contributionContentService?.portalUrl || 'https://apikey.qzz.io').replace(/\/+$/, '')}/oauth/`, - contributionPortalUrl: String(contributionContentService?.portalUrl || 'https://apikey.qzz.io').replace(/\/+$/, ''), - contributionUploadUrl: `${String(contributionContentService?.portalUrl || 'https://apikey.qzz.io').replace(/\/+$/, '')}/upload`, + contributionOauthUrl: `${String(contributionContentService?.portalUrl || 'https://flowpilot.qlhazycoder.top').replace(/\/+$/, '')}/oauth/`, + contributionPortalUrl: String(contributionContentService?.portalUrl || 'https://flowpilot.qlhazycoder.top').replace(/\/+$/, ''), + contributionUploadUrl: `${String(contributionContentService?.portalUrl || 'https://flowpilot.qlhazycoder.top').replace(/\/+$/, '')}/upload`, }, }); const baseRenderContributionMode = contributionModeManager?.render diff --git a/tests/contribution-content-update-service.test.js b/tests/contribution-content-update-service.test.js index 8e4fdcd..7ee6357 100644 --- a/tests/contribution-content-update-service.test.js +++ b/tests/contribution-content-update-service.test.js @@ -131,8 +131,8 @@ test('getContentUpdateSnapshot falls back to cached snapshot when the live reque updatedAtDisplay: '2026-04-20 08:00', }, ], - portalUrl: 'https://apikey.qzz.io', - apiUrl: 'https://apikey.qzz.io/api/content-summary', + portalUrl: 'https://flowpilot.qlhazycoder.top', + apiUrl: 'https://flowpilot.qlhazycoder.top/api/content-summary', checkedAt: Date.now() - 1000, }; diff --git a/tests/sidepanel-cloudflare-temp-email-random-subdomain.test.js b/tests/sidepanel-cloudflare-temp-email-random-subdomain.test.js index eb723f6..8a4e767 100644 --- a/tests/sidepanel-cloudflare-temp-email-random-subdomain.test.js +++ b/tests/sidepanel-cloudflare-temp-email-random-subdomain.test.js @@ -84,7 +84,7 @@ test('openCloudflareTempEmailUsageGuidePage opens the contribution portal home p const api = new Function(` const openedUrls = []; -function getContributionPortalUrl() { return 'https://apikey.qzz.io'; } +function getContributionPortalUrl() { return 'https://flowpilot.qlhazycoder.top'; } function openExternalUrl(url) { openedUrls.push(url); } ${bundle} return { @@ -94,7 +94,7 @@ return { `)(); api.openCloudflareTempEmailUsageGuidePage(); - assert.deepEqual(api.openedUrls, ['https://apikey.qzz.io']); + assert.deepEqual(api.openedUrls, ['https://flowpilot.qlhazycoder.top']); }); test('openCloudflareTempEmailUsageGuidePage skips opening when the contribution portal URL is empty', () => { diff --git a/tests/sidepanel-contribution-mode.test.js b/tests/sidepanel-contribution-mode.test.js index 8e2ffe1..fe59214 100644 --- a/tests/sidepanel-contribution-mode.test.js +++ b/tests/sidepanel-contribution-mode.test.js @@ -549,8 +549,8 @@ test('contribution mode manager enters mode, starts main auto flow, polls contri }, }, constants: { - contributionPortalUrl: 'https://apikey.qzz.io', - contributionUploadUrl: 'https://apikey.qzz.io/upload', + contributionPortalUrl: 'https://flowpilot.qlhazycoder.top', + contributionUploadUrl: 'https://flowpilot.qlhazycoder.top/upload', pollIntervalMs: 2500, }, }); @@ -581,7 +581,7 @@ test('contribution mode manager enters mode, starts main auto flow, polls contri assert.ok(updateSyncUiCount >= 1); assert.ok(updateConfigMenuCount >= 1); assert.equal(timers.length, 0); - assert.deepStrictEqual(openedUrls, ['https://apikey.qzz.io']); + assert.deepStrictEqual(openedUrls, ['https://flowpilot.qlhazycoder.top']); dom.inputContributionNickname.value = '贡献者昵称'; dom.inputContributionQq.value = '123456'; @@ -602,7 +602,7 @@ test('contribution mode manager enters mode, starts main auto flow, polls contri assert.equal(dom.contributionModeSummary.textContent, '\u5df2\u63d0\u4ea4\u56de\u8c03\uff0c\u7b49\u5f85\u670d\u52a1\u7aef\u786e\u8ba4'); dom.btnOpenContributionUpload.listeners.click(); - assert.deepStrictEqual(openedUrls, ['https://apikey.qzz.io', 'https://apikey.qzz.io/upload']); + assert.deepStrictEqual(openedUrls, ['https://flowpilot.qlhazycoder.top', 'https://flowpilot.qlhazycoder.top/upload']); await dom.btnExitContributionMode.listeners.click(); manager.render(); diff --git a/tests/sidepanel-new-user-guide.test.js b/tests/sidepanel-new-user-guide.test.js index 0c64a53..31a294f 100644 --- a/tests/sidepanel-new-user-guide.test.js +++ b/tests/sidepanel-new-user-guide.test.js @@ -130,7 +130,7 @@ const localStorage = { }; const btnContributionMode = { disabled: false }; const latestState = { contributionMode: false }; -const contributionContentService = { portalUrl: 'https://apikey.qzz.io' }; +const contributionContentService = { portalUrl: 'https://flowpilot.qlhazycoder.top' }; const openedUrls = []; let modalOptions = null; let nextChoice = 'confirm'; @@ -164,7 +164,7 @@ return { assert.equal(confirmed, true); assert.equal(api.getDismissed(), '1'); - assert.deepStrictEqual(api.getOpenedUrls(), ['https://apikey.qzz.io']); + assert.deepStrictEqual(api.getOpenedUrls(), ['https://flowpilot.qlhazycoder.top']); assert.equal(modalOptions.title, '新手引导'); assert.equal(modalOptions.alert.text, '本提示仅出现一次。'); assert.deepStrictEqual( @@ -178,5 +178,5 @@ return { api.setNextChoice(null); const skipped = await api.maybeShowNewUserGuidePrompt(); assert.equal(skipped, false); - assert.deepStrictEqual(api.getOpenedUrls(), ['https://apikey.qzz.io']); + assert.deepStrictEqual(api.getOpenedUrls(), ['https://flowpilot.qlhazycoder.top']); }); diff --git a/项目完整链路说明.md b/项目完整链路说明.md index 7c9e096..62c52cb 100644 --- a/项目完整链路说明.md +++ b/项目完整链路说明.md @@ -40,7 +40,7 @@ - 动态渲染步骤列表 - 管理顶部“贡献”按钮与贡献模式主面板;贡献模式本身是 sidepanel 的运行态 UI 模式,不是新的 `panelMode` 来源 - 在贡献模式下复用同一套主自动流程启动,并在面板内展示贡献链路的 `OAUTH / 回调 / 总状态` 三块实时状态 -- 在顶部“贡献/使用”按钮下方展示一个非强制的内容更新轻提示;提示来源于 `apikey.qzz.io` 的公开公告 / 教程摘要,用户关闭后仅对当前 `promptVersion` 静默,下次内容版本变化后会重新出现 +- 在顶部“贡献/使用”按钮下方展示一个非强制的内容更新轻提示;提示来源于 `flowpilot.qlhazycoder.top` 的公开公告 / 教程摘要,用户关闭后仅对当前 `promptVersion` 静默,下次内容版本变化后会重新出现 - 在 sidepanel 初始化和点击“自动”按钮前刷新一次贡献站公开内容摘要;点击“自动”时会先冻结当时输入或号池锁定的目标轮数,后续刷新、保存和后台状态回灌不能把启动目标改回旧的 1 轮;如果刷新失败,不阻塞主自动流程 - 在日志区通过“记录”按钮打开独立的账号记录覆盖层,并展示成功/失败/停止/重试统计与分页列表;同一轮同时出现邮箱和手机号时只显示一条组合记录,按本轮 `accountIdentifierType` 展示主身份,另一种身份作为副行显示 - 查询 GitHub Releases 并展示更新卡片;当前更新服务会区分 `Ultra`、历史 `Pro` 与 legacy `v` 三个版本族,排序时固定以 `Ultra` 为最高正式系列,同时会在读取缓存后重新排序,避免历史 `Pro` 或 `v` 版本误显示为比 `Ultra` 更新 @@ -235,12 +235,12 @@ IP 代理模块在同步、切换、Change、出口探测和自动运行成功 4. sidepanel 隐藏 CPA 管理地址、管理密钥、SUB2API 配置、Codex2API 配置、自定义密码等普通模式配置,并禁用来源选择、配置菜单和记录入口 5. 用户点击 `开始贡献` 后,不再单独走一条旁路 OAuth 流程,而是直接复用顶部 `自动` 的同一套主自动流 6. 步骤 1~6 仍按原来的注册自动化执行 -7. 当主流程进入步骤 7 时,后台改为调用公开接口 `POST https://apikey.qzz.io/oauth/api/start` 申请贡献登录地址,而不是去 CPA / SUB2API / Codex2API 来源刷新 OAuth +7. 当主流程进入步骤 7 时,后台改为调用公开接口 `POST https://flowpilot.qlhazycoder.top/oauth/api/start` 申请贡献登录地址,而不是去 CPA / SUB2API / Codex2API 来源刷新 OAuth 8. 步骤 7 拿到 `session_id / auth_url / state` 后,继续沿用原有登录链路进入授权页 9. 步骤 9 仍负责捕获 localhost callback;贡献模式下后台也会持续监听导航变化,必要时提前兼容处理 callback 10. 步骤 10 在贡献模式下不再打开 CPA 管理页,而是围绕公开贡献会话做 callback 提交兼容和最终状态确认;当状态进入 `auto_approved / auto_rejected / manual_review_required / expired / error` 时结束 11. 当前服务端如果返回“无需手动提交 callback”,扩展会把它视为兼容成功态,而不是报错 -12. `已有认证文件?前往上传` 继续打开 `https://apikey.qzz.io/` +12. `已有认证文件?前往上传` 继续打开 `https://flowpilot.qlhazycoder.top/` 13. `退出贡献模式` 会清理贡献会话相关运行态,`重置` 只重置主流程状态,不会自动退出贡献模式 这条链路的关键边界是: @@ -255,9 +255,9 @@ IP 代理模块在同步、切换、Change、出口探测和自动运行成功 ### 4.5 贡献内容更新提示链路 -这条链路用于把 `apikey.qzz.io` 上的公开公告 / 使用教程更新,映射成 sidepanel 顶部“贡献/使用”按钮下方的轻提示。 +这条链路用于把 `flowpilot.qlhazycoder.top` 上的公开公告 / 使用教程更新,映射成 sidepanel 顶部“贡献/使用”按钮下方的轻提示。 -1. 贡献站公开暴露 `GET https://apikey.qzz.io/api/content-summary` +1. 贡献站公开暴露 `GET https://flowpilot.qlhazycoder.top/api/content-summary` 2. 接口返回 `announcement / tutorial` 两类内容的可见状态、更新时间,以及聚合后的 `promptVersion` 3. `sidepanel/contribution-content-update-service.js` 负责拉取这个摘要,并在本地缓存最近一次可用结果 4. `sidepanel.js` 在 sidepanel 初始化时会先拉一次摘要;如果当前 `promptVersion` 没被本地关闭过,就显示提示 diff --git a/项目文件结构说明.md b/项目文件结构说明.md index 3374882..0371d96 100644 --- a/项目文件结构说明.md +++ b/项目文件结构说明.md @@ -1,4 +1,4 @@ -# 项目文件结构说明 +# 项目文件结构说明 本文档列出当前仓库中所有“非忽略文件”,并说明每个文件的作用。 @@ -47,7 +47,7 @@ - `background/account-run-history.js`:账号记录模块,负责以统一账号标识维护最新记录;邮箱注册以邮箱为主身份,手机号注册以手机号为主身份,同一轮后续绑定的手机号或邮箱会并入同一条记录并覆盖旧占位状态;模块统一归一化成功/失败/停止三态并落地到 `chrome.storage.local`,兼容 phone-only 与 email+phone 组合记录、空密码,并按默认本地 helper 地址自动尝试把完整快照同步到本地 helper;若 helper 未启动,则静默跳过。 - `background/auto-run-controller.js`:自动运行主控制器,封装多轮执行、重试、轮次摘要、线程间隔与倒计时恢复逻辑;当前自动流程会绑定 `autoRunSessionId`,手动停止后旧的倒计时计划、旧重试链路和旧恢复入口不会再复活已失效的自动运行;fresh-attempt reset 时会额外保留 Plus 模式与 PayPal 配置、`gmailBaseEmail`、`mail2925BaseEmail` 与当前 2925 账号选择,避免自动流程重置后丢失关键持久配置。 -- `background/contribution-oauth.js`:贡献模式的公开 OAuth 流程模块,负责调用 `apikey.qzz.io` 的公开贡献接口、保存贡献会话运行态、在主 10 步流程里为步骤 7 提供贡献登录地址、在步骤 9/10 衔接 callback 捕获与兼容提交 `/oauth/api/submit-callback`,并把真实服务端状态映射回 sidepanel 运行态。 +- `background/contribution-oauth.js`:贡献模式的公开 OAuth 流程模块,负责调用 `flowpilot.qlhazycoder.top` 的公开贡献接口、保存贡献会话运行态、在主 10 步流程里为步骤 7 提供贡献登录地址、在步骤 9/10 衔接 callback 捕获与兼容提交 `/oauth/api/submit-callback`,并把真实服务端状态映射回 sidepanel 运行态。 - `background/cloudmail-provider.js`:Cloud Mail / SkyMail 后台 provider 模块,负责 Token 获取、邮箱创建、邮件列表读取、验证码轮询和生成/转发收件目标邮箱选择;新生成的 Cloud Mail 地址会统一走共享注册邮箱状态持久化,既回写带来源标记的注册邮箱运行态,也能在 Step 8 `add-email` 的手机号身份链路中保留 `signupPhone* / accountIdentifier*`。 - `background/generated-email-helpers.js`:生成邮箱辅助层,除了 Duck / Cloudflare / iCloud / Cloudflare Temp Email,也统一承接 Gmail / 2925 的别名邮箱生成入口与自定义邮箱池读取;当 provider 为 2925 且 `mail2925Mode = provide` 时,会先确保当前账号池里已有可用账号,再基于该账号生成别名邮箱;若 `mail2925Mode = receive`,则会回退到普通邮箱生成链路;当生成方式为 iCloud 且 `icloudFetchMode = always_new` 时,会强制跳过未用别名复用并新建别名;当生成方式为 `custom-pool` 时,会按当前目标轮次读取邮箱池中的对应邮箱;Duck 生成前会优先结合 `registrationEmailState` 与侧栏当前可见邮箱解析对比基线,避免重复拿到旧地址;所有生成结果都会统一走共享注册邮箱状态持久化,普通邮箱流仍切回邮箱身份,Step 8 `add-email` 的手机号身份流则保留当前手机号身份。 - `background/ip-proxy-core.js`:IP 代理核心模块,负责代理条目解析、账号/接口代理池运行态、PAC 应用与清除、代理鉴权回填、出口探测、失败时的目标站点 fail-close 防漏规则,以及自动运行成功阈值后的代理切换支撑。 @@ -148,7 +148,7 @@ - `sidepanel/mail-2925-manager.js`:侧边栏 2925 账号池管理器,负责 2925 账号的新增、导入、切换、手动登录、启停、清冷却与删除。 - `sidepanel/form-dialog.js`:侧边栏公共表单弹窗模块,负责渲染可复用的小型表单弹窗,支持动态字段、校验、确认与取消。 - `sidepanel/account-records-manager.js`:侧边栏账号记录面板管理器,负责“记录”按钮、覆盖层开关、分页列表、成功/失败/停止统计摘要和清理确认;展示时按 `accountIdentifierType` 决定主身份,手机号注册显示手机号并把绑定邮箱放副行,邮箱注册显示邮箱并把后续绑定手机号放副行。 -- `sidepanel/contribution-content-update-service.js`:侧边栏贡献内容更新服务,负责拉取 `https://apikey.qzz.io/api/content-summary`、缓存公开公告/教程摘要,并输出可用于提示展示的 `promptVersion` 与最新更新时间。 +- `sidepanel/contribution-content-update-service.js`:侧边栏贡献内容更新服务,负责拉取 `https://flowpilot.qlhazycoder.top/api/content-summary`、缓存公开公告/教程摘要,并输出可用于提示展示的 `promptVersion` 与最新更新时间。 - `sidepanel/contribution-mode.js`:侧边栏贡献模式管理器,负责顶部“贡献”按钮、确认弹窗、贡献模式显隐、复用主自动流程启动、侧栏内贡献状态轮询、上传页跳转,以及贡献模式下对来源选择、配置入口、记录入口和敏感配置行(包括 Codex2API 配置)的禁用与隐藏。 - `sidepanel/ip-proxy-panel.js`:侧边栏 IP 代理面板逻辑,负责代理配置显隐、服务/模式切换、账号串参数同步、状态卡渲染,以及同步、下一条、Change、检测出口、检查 IP 等按钮行为。 - `sidepanel/ip-proxy-provider-711proxy.js`:侧边栏 711Proxy 输入辅助逻辑,负责从 host、username、region 输入中推断和归一化国家/地区参数。