# 知乎备份修正版 v2

先打开 `全量备份_2026-10-04/index.html` 查看作者作品备份；原来的 `index.html` 和 `样稿/` 仍提供样稿。此目录独立于 `D:\bf\bfzhihu`，旧 HTML、PDF、Word 和 raw 数据不覆盖。

## 2026-10-04 作者备份

当前作者 `jiu-li-fanx`（玖小璃，API 名称 Sorge）列表实际返回 110 条：75 个回答、33 篇文章、2 条想法。三类列表均到明确末页，并覆盖旧备份中的全部已知 ID。主页统计为 77／34／2，仍有 2 个回答和 1 篇文章未被列表返回，ID 未知；`status.complete=false`、`api_listing_complete=true` 如实保留此差额。

2026 年文章与各年份回答有 6 组完整内容重复，优先保留文章，最终阅读目录为 69 个回答、33 篇文章、2 条想法，共 104 份作品，每份各有 HTML 和 PDF。110 条原始记录均保留在 `source/records/`；去重只影响阅读副本。`deduplicate.py` 比较正文、注释、图片与链接，人工确认的一组额外图片差异记录在 `source/duplicate-decisions.json`，不会据此放宽其他作品的去重。

文件按 `回答/创建年份/`、`文章/创建年份/`、`想法/创建年份/` 直接保存，目录内有可离线打开的索引。正文图片与 4 篇文章封面嵌入 HTML；完整注释保留双向跳转。`备份说明.html` 列出来源、统计差额、重复作品及检查结果。

本次另为截图指定的 7 篇作品补充 Word，其中 2 篇由已有 Word 迁入，5 篇新生成。Word 保存在各篇现有的类型／年份目录中。只有文件存在、已验收且 SHA256 与记录一致时，索引行才显示 Word 链接。

这 7 篇同时提供“Word 预览”和“下载 Word”两个入口。预览页直接显示经过核验的 Word 实际分页，可离线在网页查看；需要编辑或保存副本时再下载 DOCX。预览页为 `.word-preview.html`，页面图片独立保存于 `assets/word-previews/`，不依赖在线 Office 服务。

## 本次修正

- 文章标题取消旧模板人为添加的蓝色下边框。
- 正文分隔线恢复为居中浅灰短线，默认宽度为正文的 40%。
- 分隔线或标题后的原始空段、短装饰段与后续首段保持同页，避免横线或框顶单独留在上一页；装饰文字和空白均保留。
- `sup[data-text]` 的完整文字和 `data-url` 链接在文末显示；只有 URL 的引用也完整保留。正文角标与文末注释可以互相跳转。
- 保留原始 HTML 的段落、空段、换行、强调、下划线、标题层级和图片属性。没有清理作者原文的空白。
- 使用当前 Chrome 导出 A4 PDF，保留中文字体、链接和打印样式；修改正文或样式后重新生成，避免复用旧 PDF。
- 原始 API JSON 按 SHA256 存为快照。内容变化会新增版本，生成版本也按正文、样式和脚本输入分目录保存。

原站样稿网页返回 HTTP 403，无法读取实时计算样式。本次阅读样式根据你提供的原站截图恢复，原始内联格式优先；不承诺网页和 A4 PDF 的换行、分页逐像素相同。详细记录见 `reference/style-notes.md`。

## 三篇样稿

| 样稿 | 来源 | 完整注释数 | 检查重点 |
| --- | --- | ---: | --- |
| 为什么总把别人想的那么坏? ? | 回答 2753605551 | 0 | 标题没有蓝线 |
| 以庸俗性文化享乐批判为耻 | 文章 674028467 | 8 | 短分隔线、脚注、空段与标题分页 |
| 【译】精神病诗学：精神卫生照护与乔瓦尼·斯坦盖利尼的“发现逻辑” | 文章 2068292876400907909 | 65 | 长正文、长注释、链接和跨页引用 |

样稿均复用已有原始数据；之后按用户要求另行采集作者当前列表，保存在 `全量备份_2026-10-04/`。`样稿/` 提供便于直接打开的 HTML、PDF 和 TXT 阅读副本。`archive/` 保存样稿原始快照和生成文件；`manifest.json` 指向样稿当前原文版本成功生成的文件，`index.html` 提供样稿阅读入口。导入新原文后会标为待构建，避免显示前一版 PDF。`qa/` 保存逐页渲染和文字核验结果。

## 本机运行环境

本机已有两套 Python：HTML/备份/QA 使用带 lxml、Pillow、pypdf、pypdfium2 的 Codex 运行库；浏览器采集与 PDF 导出使用带 Playwright 的 `D:\Python314\python.exe` 和已安装的 Chrome。

PowerShell 中先设置：

```powershell
Set-Location -LiteralPath 'D:\bf\bfzhihu_v2'
$archivePython = 'C:\Users\asus\.cache\codex-runtimes\codex-primary-runtime\dependencies\python\python.exe'
$browserPython = 'D:\Python314\python.exe'
$env:PYTHONIOENCODING = 'utf-8'
```

重建本次三篇样稿：

```powershell
& $archivePython .\backup.py samples --browser-python $browserPython
& $archivePython .\qa_check.py
```

从旧 raw 导入指定回答或文章，然后生成：

```powershell
& $archivePython .\backup.py import-old --ids 2753605551 674028467
& $archivePython .\backup.py build --ids 2753605551 674028467 --browser-python $browserPython
```

从单篇 API JSON 导入：

```powershell
& $archivePython .\backup.py import-json 'D:\bf\bfzhihu\单篇备份_2026-10-03\source\2068292876400907909.json' --kind posts
& $archivePython .\backup.py build --ids 2068292876400907909 --browser-python $browserPython
```

含正文图片时，可以提供本地图片目录，例如 `build --media-root 'D:\bf\bfzhihu\jiu-li-fanx'`。只有确定匹配的图片会嵌入 HTML，保留源尺寸与说明。缺图会报错；确认需要下载时加 `--download-media`。如需明确生成缺图草稿，可加 `--allow-missing-media`，审计文件会保留不完整状态。三篇当前样稿均无正文图片。

## 新采集器

`capture_zhihu.py` 只采集原始 JSON，并记录采集范围、数量、分页是否结束、错误和是否限量。默认无浏览器窗口；确需登录时加 `--login`。它使用已有 `D:\bf\bfzhihu\_profile` 登录环境，运行期间不要同时让旧脚本使用该 profile。

采集指定文章，并导入生成：

```powershell
& $browserPython .\capture_zhihu.py --urls 'https://zhuanlan.zhihu.com/p/674028467' --output '.\source\one_article.json'
& $archivePython .\backup.py import-json '.\source\one_article.json'
& $archivePython .\backup.py build --ids 674028467 --browser-python $browserPython
```

后续需要作者全量采集时可用：

```powershell
& $browserPython .\capture_zhihu.py --author 'https://www.zhihu.com/people/jiu-li-fanx' --types posts,answers --output '.\source\author_2026-10-03.json'
& $archivePython .\backup.py import-json '.\source\author_2026-10-03.json'
& $archivePython .\backup.py build --browser-python $browserPython --download-media
```

以上是单篇快照构建器的使用示例。本次作者采集已另行执行，分类阅读目录由 `author_archive.py` 构建，支持文章、回答和想法。接口失败、缺页或主页统计差额会明确记录，不能以“有文件”判断全量成功。`--max` 一律标为限量样本，`complete=false`。

采集器默认拒绝覆盖已有 JSON；重复运行请更换文件名。作者模式的 `status.complete` 同时要求列表分页完成且主页统计数一致；`api_listing_complete` 只表示实际返回列表到末页，不能代替逐篇在线正文核对。原始折叠和登录 flags 均保留为警告。

重建已采集的作者分类目录：

```powershell
$authorRoot = 'D:\bf\bfzhihu_v2\全量备份_2026-10-04'
& $archivePython .\author_archive.py --root $authorRoot plan --capture "$authorRoot\source\author-full.json"
& $archivePython .\author_archive.py --root $authorRoot prepare --capture "$authorRoot\source\author-full.json" --allow-incomplete --media-root 'D:\bf\bfzhihu\jiu-li-fanx' --download-media
& $archivePython .\author_archive.py --root $authorRoot render --browser-python $browserPython
& $archivePython .\qa_check.py --root $authorRoot
& $archivePython .\qa_layout.py --root $authorRoot
# 查看渲染后的相关页缝与候选问题，再写下视觉核查记录。
& $archivePython .\merge_visual_reviews.py --root $authorRoot
& $archivePython .\author_archive.py --root $authorRoot finalize
& $archivePython .\write_author_summary.py --root $authorRoot
```

此处 `--allow-incomplete` 允许为已取得的 110 条生成文件，统计缺口仍公开保留。相同输入只复用内容哈希、图片映射、HTML 和 PDF 全部匹配的已成功文件；改变正文、样式、图片或生成脚本会重新生成。旧图片只按旧 raw 中的原 URL 匹配，不能按新正文图片次序猜测。重复的已验证 URL 图片可从 `source/media/` 缓存离线复用。

## 指定作品的 Word

`word_archive.py` 从分类目录中已保存的原始记录生成指定作品的 Word，使用 `--ids` 明确范围。运行时必须选择 `--validate-only` 或 `--write`：前者只校验，不写入 DOCX；后者才生成，已有 DOCX 会跳过。示例对应本次截图中的 7 篇：

```powershell
$authorRoot = 'D:\bf\bfzhihu_v2\全量备份_2026-10-04'
$wordIds = @('2076343092538615588', '2076703002703021552', '2079196044706035648', '2086039451625695041', '2088313767453053634', '2088618640975438538', '2088929671375221796')
& $archivePython .\word_archive.py --root $authorRoot --ids $wordIds --validate-only
& $archivePython .\word_archive.py --root $authorRoot --ids $wordIds --write
```

生成后需完成正文、注释与渲染检查，再将 Word 相对路径、SHA256 和验收状态登记到作者目录的 `manifest.json`，刷新索引与备份说明。Word 链接单独校验，原有 104 份 HTML/PDF 的验收记录继续保留。

完成 Word 文字与逐页视觉核验后，为已验收 Word 生成网页预览：

```powershell
& $archivePython .\word_preview.py --root $authorRoot
& $archivePython .\write_author_summary.py --root $authorRoot
```

预览复用当前 Word 的已核验页图，不重新生成 Word。来源 Word、预览 HTML 和全部页图的哈希都符合记录时，目录才显示预览链接；页面图片展示排版，选择和复制文字可使用同篇的“文字阅读”入口。

## 验证与文件说明

- `article_html.py --self-test` 检查注释链接、重复引用、只有 URL 的引用、空段与图片属性。86 篇旧原始记录已通过正文和 DOM 完整性验证。
- `qa_check.py` 核验 PDF 正文与全部注释覆盖、空白页和越界文字，并渲染每一页供目视核查。原文有序列表的自动编号计入 PDF 预期文本。
- `qa/verification.json` 是程序检查结果；程序不能单独证明装饰框分页正确，最终还需检查渲染后的相关页缝。
- `backup.py` 管理导入、快照、HTML/TXT 与 PDF 生成；`render_pdf.py` 在不访问网络的 Chrome 中打印 HTML；`styles/zhihu.css` 是屏幕与打印样式。

原始 JSON 是恢复与重排的依据。API 中 `content_need_truncated` 字段只作为原始标记记录，没有凭此判断全文缺失；当前正文完整性结论是相对收到的原始 JSON，不能代替在线原文核对。

本工具不永久删除旧文件，也不自动运行项目备份或推送。
