# “公众号入口 + 手机用户脚本”验证方案

## 1. 目标

让受控用户使用本人晋江账号，在手机浏览器中整理本人已经购买且能够正常阅读的章节，生成 TXT/EPUB 供个人备份。避免 App Store 分发、Ad Hoc 设备数量限制，也避免运营方接触用户的晋江密码、Cookie 和小说正文。

## 2. 信任边界

### 公众号与安装站点能够看到

- 用户给公众号发送的作品链接；
- 微信平台正常提供的公众号用户标识；
- 安装站点的常规访问日志。

### 公众号与安装站点不接收

- 晋江账号和密码；
- 晋江 Cookie、token、reader ID；
- 章节 HTML、正文、OCR 输入和导出文件。

用户脚本运行于用户已经打开的晋江作品页。脚本通过用户脚本管理器申请跨 `jjwxc.net` 子域请求和 Cookie 读取权限，使用当前浏览器已有的晋江会话。所有章节内容只保存在页面内存中，生成文件后由用户主动保存。

## 3. 用户流程

1. 用户向公众号发送晋江作品链接。
2. 公众号只规范化书籍 ID，返回安装站点链接，并把作品链接放入查询参数。
3. 用户首次安装支持用户脚本的手机浏览器和本项目脚本。
4. 用户在真实的晋江域名登录；本项目不提供或代理登录页。
5. 用户打开作品页，点击页面右下角“拾页”。
6. 用户确认仅处理本人已购内容并选择 TXT/EPUB。
7. 脚本以低并发读取可读章节，在当前页面内存中解析、排序并生成文件。
8. 下载完成后显示独立“保存”按钮，用户点击后触发系统分享或浏览器下载。

## 4. 当前验证版实现

- 支持标准桌面作品页 URL 和移动作品链接的统一转换。
- 支持免费章节解析。
- 实现 VIP 请求、登录客户号读取、现有 VIP 解密和 CSS 插入文字还原的代码路径。
- 动态字体只使用公开字体映射；缺失时明确失败，不输出未经确认的文字。
- 默认并发为 2，每章失败后重试一次。
- 支持 TXT 和无封面 EPUB。
- 不写入 LocalStorage 或 IndexedDB，不恢复中断任务。
- 公众号 Worker 只做微信签名校验、链接提取和文本回复，不代理晋江请求。

## 5. 必须实机验证的风险

1. Focus/Alook 对 `GM_xmlhttpRequest`、`GM_cookie` 的兼容程度，尤其是 `www.jjwxc.net` 到 `my.jjwxc.net` 的带凭证请求。
2. 晋江 Cookie 是否允许用户脚本管理器读取登录客户号；如果不允许，VIP 解密路径不能成立。
3. iOS 对长任务的前台存活和内存限制。
4. `navigator.share` 对 EPUB MIME 类型的支持；代码已保留普通下载回退。
5. 晋江限流、页面结构和动态字体映射变化。

## 6. 与 PWA 代理方案的区别

本方案没有代抓后端。公众号和安装站点不会接收晋江 Cookie，也不会转发章节内容。代价是用户必须安装支持用户脚本的浏览器，并保持作品页前台运行；稳定性取决于第三方浏览器提供的用户脚本 API。

## 7. 许可证与平台风险

- 解析与导出代码沿用现项目的 AGPL-3.0-or-later；安装页提供与脚本版本对应的源代码下载。
- 改为用户脚本不会消除晋江网站条款、内容授权、商标和自动化访问风险。
- 邀请码只能控制安装入口，无法阻止已经获得脚本的人复制和再分发；不能把邀请码当成真正的版权或技术保护。

## 8. 建议的通过条件

只有在一台真实 iPhone 上连续通过以下测试，才进入正式产品化：免费短篇 TXT、本人已购 VIP 单章、包含动态字体的 VIP 章节、100 章以上长篇、TXT 保存、EPUB 保存、锁屏/切后台中断提示。若 Cookie 权限或 VIP 跨域请求失败，应停止该路线，不应改为隐蔽收集用户凭证的服务器代理。
