# ZReader **Repository Path**: Dinomorphia/zreader ## Basic Information - **Project Name**: ZReader - **Description**: 一个用来看知乎的阅读器 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-09-07 - **Last Updated**: 2026-10-07 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # ZReader · 知乎阅读器 本地归档知乎内容的 Tauri 2 桌面应用(Windows / WebView2)。 ## 功能 - **单窗口浏览知乎**:知乎页面与本地「文库」在同一个窗口的 WebView 内互相导航 - **收藏回答/文章**:在问题页每条回答旁点「★ 收藏」→ 弹出确认卡片(题目 / 回答者 / 摘要)→ 确认后入库;支持同一问题下多答不互相覆盖 - **正文本地化**:文章/回答正文转为 Markdown(TeX 公式保留为 `$...$`/`$$...$$`),图片下载到本地 `media/` 目录(4 路并发、防盗链 Referer 处理) - **文库**:标题/作者/标签/时间列表、正文搜索(SQLite FTS5 + 中文逐字分词)、全文阅读(KaTeX 公式渲染) - **登录态**:知乎窗口内登录后,通过 WebView2 CookieManager 同步 Cookie(含 HttpOnly 的 `z_c0`),供后端以登录态抓取/下载 - **目标页面跳转**:知乎站内 `target="_blank"` 链接与“新窗口”请求统一在当前窗口打开;外链交给系统浏览器 ## 开发 依赖管理使用 **pnpm**(Node ≥ 20,pnpm ≥ 11): ```powershell pnpm install # 首次安装(生成 pnpm-lock.yaml) pnpm run tauri dev # 启动开发(自动编译 Rust 并打开窗口) pnpm run build # 仅构建前端 ``` > pnpm 11 注意点: > - 项目设置放在 `pnpm-workspace.yaml`(`allowBuilds` 白名单放行 esbuild/rolldown/@tauri-apps/cli 等构建脚本),`.npmrc` 只保留 registry。 > - 若报 `Cannot find package 'rolldown'` / `Cannot find native binding`:通常是全局 store 位于 Program Files 等受保护目录,junction 被系统安全层拦截。把 store 迁到普通目录即可(同一磁盘可启用硬链接): > ```powershell > pnpm config set --location=user store-dir D:/.pnpm-store > ``` > - `scripts/fix-tauri-binding.cjs`(postinstall)负责修复 pnpm 布局下 `@tauri-apps/cli` 原生绑定的链接问题。 ## 数据存储 文章与元数据保存在系统数据目录(Windows): ``` %APPDATA%/com.zreader.app/ ├─ library.db # SQLite:文章、标签、全文索引、设置 └─ posts// # 文章正文与媒体 ├─ post.md # YAML front-matter + Markdown 正文 ├─ metadata.json └─ media/ # 下载的图片 ``` ## 架构 ``` src/ # React + TS 前端(本地文库视图) src-tauri/ ├─ scripts/zhihu-inject.js # 知乎页面注入:悬浮工具栏 + 每条回答的“收藏”按钮 ├─ src/ │ ├─ lib.rs # 主窗口创建、站内链接单窗口策略 │ ├─ commands.rs # IPC 命令:预览/保存/文库/浏览控制 │ ├─ app_state.rs │ ├─ error.rs │ ├─ store/ # SQLite + FTS5 │ └─ zhihu/ │ ├─ extract.rs # HTML → Markdown/TeX/图片/元数据(按实体 id 精确定位) │ ├─ cookie_bridge.rs # WebView2 CookieManager(Windows) │ ├─ client.rs / media.rs / url.rs / cookie.rs └─ capabilities/ # IPC ACL(远程知乎域显式放行所需命令) ``` ## 技术要点备忘 - 保存链路:知乎页内 `fetch()` 同源抓取 HTML(浏览器身份,绕开后端裸请求 403)→ `preview_save` 解析出“题目/作者/摘要”给用户确认 → `save_html` 入库(`answer_id` 决定存储键,不与 URL 中的其他回答串扰) - 后端直连抓取仅作为文库“粘贴链接”的兜底入口,可能受知乎反爬限制