【免费下载链接】GPTSession2CPAandSub2API项目地址https://gitcode.com/gh_mirrors/gp/GPTSession2CPAandSub2API点击查看免费下载GPTSession2CPAandSub2API 是一款纯前端单页面 ChatGPT Session 转换工具把 ChatGPT Web 登录 session JSON 一键转换成 CPA、sub2api、Cockpit、9router、Codex、AxonHub、Codex-Manager 可导入的 JSON。整个项目最值得学习的地方是它把全部功能装进了单个 HTML 文件用一段IIFE 立即执行函数组织代码实现了零依赖、零构建、零后端的完整 Web 应用。本文带你深度剖析这套架构的设计思路与代码组织方式。零依赖架构为什么单个 HTML 文件就能跑一个转换工具 先看一下项目的完整文件结构你会发现它轻到什么程度文件职责docs/index.html唯一的应用入口样式、页面结构、全部业务逻辑tests/convert-session.test.js无构建单元测试直接在 Node 中执行 HTML 内的脚本docs/favicon.svg页面图标README.md使用与本地运行说明这种单 HTML 文件架构带来三个直接好处零构建没有package.json、没有打包器双击 docs/index.html 就能在浏览器里使用见 README.md 的本地使用一节。零后端所有解析与转换都在浏览器本地完成token 不上传、不写入本地存储天然适合处理敏感登录凭证。零全局污染所有 JS 代码被 IIFE 包裹不向window泄漏任何变量页面即使被嵌入其他环境也互不干扰。单文件三层结构CSS 层、DOM 层与 IIFE 脚本层docs/index.html 共 1760 行可以清晰拆成三段读源码时建议按这个顺序层位置说明样式层docs/index.html#L9-L623CSS 变量主题 响应式布局DOM 层docs/index.html#L625-L777输入面板、格式切换按钮、输出区、账号预览表格脚本层docs/index.html#L778-L1758一个内联script 一个 IIFE承载全部逻辑DOM 层的设计也值得注意输出格式用 7 个带data-format属性的按钮表达docs/index.html#L662-L668JS 只需一次性querySelectorAll([data-format])就能全部接管所有状态文本都挂在固定id的元素上如#input-status、#stat-count为脚本层的集中式状态打下基础。IIFE 内部作用域隔离与集中式状态管理脚本从 docs/index.html#L779 的(() {开始到 docs/index.html#L1757 的})();结束——约 980 行代码全部位于同一个闭包内。IIFE 内部按配置 → 状态 → 工具 → 管道 → 渲染 → 事件绑定的顺序组织① 常量与标签表OUTPUT_LABELS映射 7 种输出格式docs/index.html#L780-L788。② 单一状态对象state这是整个页面的事实来源docs/index.html#L790-L796const state { format: sub2api, sessions: [], converted: [], skipped: [], outputText: , };③ 元素缓存elements一次性querySelector缓存约 20 个 DOM 引用docs/index.html#L798-L817避免后续反复查询 DOM。④ 内置示例数据exampleSession提供了脱敏的 session 结构docs/index.html#L819-L832对应页面上填入示例结构按钮方便新手无真实凭证也能体验完整流程。这种state elements模式是单文件应用非常实用的组织方式状态只有state这一份任何输入变化最终都收敛到updateOutput()统一刷新界面不会出现多处状态不同步的问题。完整数据流从粘贴 JSON 到生成输出 ⚙️理解了骨架后来看一次粘贴 JSON → 得到输出的完整调用链这是本项目最核心的一条管道输入触发文本框input事件绑定到scheduleConvertdocs/index.html#L1601-L1630。JSON 解析与扫描parseInputDocuments先做JSON.parse再交给collectSessionLikeObjects深度遍历任意嵌套结构自动找出所有长得像 session的对象——判断标准是同时存在 token 字段accessToken/access_token/tokens.accessToken等多种写法和身份字段email、user、meta.label等见 docs/index.html#L1088-L1145。它还用WeakSet防止循环引用导致的死循环。逐个转换convertFromText对每个候选对象调用convertSession单个失败只记入skipped列表而不会中断整体docs/index.html#L1502-L1536。选择目标格式并渲染buildOutputDocument按state.format输出对应结构updateOutput统一写回输出框、统计卡片、账号表格与错误列表docs/index.html#L1544-L1570。拖拽/选择文件走的是平行入口readFilesdocs/index.html#L1666-L1725最终汇入同一条convertSession → updateOutput管道——多条入口、单一管道这就是单文件代码仍保持清晰的根本原因。多源字段归一化firstNonEmpty 兜底策略ChatGPT Web session、9router OAuth JSON、Codexauth.json、AxonHub auth.json、Codex-Manager JSON 这 5 类输入同一个语义的字段可能叫完全不同的名字。项目没有为每类输入写一个解析器而是用一个通用工具函数firstNonEmptydocs/index.html#L840-L847做多路径兜底const accountId firstNonEmpty( record.account?.id, record.account_id, record.tokens?.account_id, record.providerSpecificData?.chatgptAccountId, /* …还有十余种候选路径 */ );在convertSession里accessToken、sessionToken、refreshToken、idToken、email、accountId、planType等关键字段全部采用这种按优先级依次尝试十几种取值路径的写法docs/index.html#L1167-L1298。配合 JWT 解析辅助函数parseJwtPayload、decodeBase64Urldocs/index.html#L858-L893工具还能从accessToken的 JWT payload 里反推出邮箱、账号 ID、套餐类型和过期时间——即使输入 JSON 本身没写全。一个 convertSession 同时产出 7 种目标格式架构上最巧妙的一笔convertSessiondocs/index.html#L1162-L1447在单次调用中同时构造全部 7 种目标格式一次性返回cpa、cockpit、nineRouter、codexAuthJson、axonHub、codexManager、sub2apiAccount共 7 份结果。好处显而易见切换输出格式只是buildOutputDocument里的一次取值切换是纯渲染操作O(1) 完成docs/index.html#L1457-L15007 种格式共享同一套字段抽取与归一化逻辑天然保证一致单元测试无需为每种格式各造一套 fixture。细节处理也见功力ChatGPT Web session 通常没有refresh_token和真实id_token代码会在缺少id_token时构造一个 Codex 可解析的占位 JWTbuildSyntheticCodexIdTokendocs/index.html#L965-L994AxonHub 缺少refresh_token时写入__missing_refresh_token__占位并附带说明字段docs/index.html#L1401-L1411stripUnavailable则负责从输出中剔除空值字段docs/index.html#L1018-L1035。无构建单元测试Node vm 沙箱直接跑浏览器脚本 没有构建、没有模块化打包代码怎么测答案在 tests/convert-session.test.js用正则直接从docs/index.html中截取内联script的源码tests/convert-session.test.js#L55手写一个createFakeElement伪造 DOM 元素含classList、dataset、addEventListenertests/convert-session.test.js#L8-L50通过vm.runInNewContext在干净沙箱中执行整段页面脚本tests/convert-session.test.js#L105像真实用户一样操作给#session-input赋值、派发input事件、点击格式按钮然后断言#output里的 JSON。比如 sub2api 过期时间的用例tests/convert-session.test.js#L123-L149验证了expires_at必须取每个账号自己的access token 的 JWTexp。全文共 10 个用例tests/convert-session.test.js#L441-L450覆盖 7 种格式的关键分支运行方式就是node tests/convert-session.test.js同样零依赖。这套正则提取 vm 沙箱 假 DOM的手法是所有内联脚本单文件项目都能直接复用的测试方案。快速本地运行与代码扩展指南 ✅本地运行直接用浏览器打开 docs/index.html 即可无需安装任何东西页面顶部有浏览器本地解析 / 不上传 token / 不写入存储三枚徽章说明隐私边界。想加一种新的输出格式按现有架构只需 4 步在OUTPUT_LABELS中登记格式名docs/index.html#L780-L788在convertSession返回对象里新增一个字段构造新格式的数据docs/index.html#L1432-L1446在buildOutputDocument中加一个if (state.format ...)分支docs/index.html#L1457-L1500在 DOM 层加一个data-format按钮并在 tests/convert-session.test.js 里补一个用例。架构小结单 HTML 文件 IIFE 并不是偷懒而是一种刻意的取舍——把应用压缩到一个可双击打开的文件里用单一 state 单一渲染入口 单一转换管道三条纪律维持可维护性再用 vm 沙箱测试补齐工程化短板。对于只需要跑在浏览器里、强调隐私与便携的工具类项目这是一个非常值得抄作业的模板。赞分享【免费下载链接】GPTSession2CPAandSub2API项目地址https://gitcode.com/gh_mirrors/gp/GPTSession2CPAandSub2API点击查看免费下载相关推荐从安装到精通OmX完整入门教程从安装到精通OmX完整入门教程 OmXOh My codeX是一款功能强大的开发工具它能为你的编码工作流带来革命性的提升。通过添加钩子hooks、代人工智能AI AgentAgent 编排Agent 工作流CLI开发工具AI 技能如何用Pkg.jl的[compat]锁定依赖版本区间兼容性配置完整指南如何用Pkg.jl的 compat 锁定依赖版本区间兼容性配置完整指南 Pkg.jl 是 Julia 语言的官方包管理器 而其中的 compat 配置正是你探索rot.js地图生成7种算法打造无限随机地牢探索rot.js地图生成7种算法打造无限随机地牢 rot.js是一个功能强大的JavaScript地牢生成库专为Roguelike游戏开发而设计。这个开源工游戏开发创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考