- 项目基于知乎现有接口+TypeScript 构建,为知友提供方便的, 以供自己阅读/自身结集整理为目的的, 将知乎内容转为 Epub 电子书的途径
- 下载软件安装包, 双击安装
- 在
任务输入框
中输入待抓取的网址信息 - 点击
开始执行
按钮 - 执行完毕后会打开电子书所在文件夹, 使用多看阅读或 Win10 下双击使用 Edge 浏览器打开均可
- 输出文件
知乎助手输出的电子书\epub
内, 为输出的 Epub 电子书, 可以直接使用电子书阅读器阅读知乎助手输出的电子书\html
内, 为输出的网页版答案列表html
文件夹中为按回答分割的单个回答页面列表,index.html
为目录页单文件版
文件夹中为整个文件, 可以使用浏览器打开后, 直接打印为 PDF 书籍
- 使用示例 =>
- 在生成电子书时可能会有卡顿, 根据电子书的体积(100k
2G)卡顿时间在 1s1 分钟不等, 函请谅解 - 所有图片缓存都会存在安装目录下, 随着制作的电子书数量增加, 体积可能会非常大, 因此建议将软件安装在非系统盘根目录, 体积大了直接删除即可
网址类型 | 描述 | 示例 |
---|---|---|
指定知乎用户的全部提问/回答/想法/赞同过的回答/赞同过的文章/关注过的问题 | 用户个人主页地址 | http://www.zhihu.com/people/yyln2016 |
专栏 | 专栏网址 | http://zhuanlan.zhihu.com/yyln2016 |
文章 | 文章地址 | https://zhuanlan.zhihu.com/p/58653502 |
话题 | 知乎话题地址, 保存话题信息和话题精华中的答案 |
http://www.zhihu.com/topic/20024374 |
问题 | 问题地址 | https://www.zhihu.com/question/26784045 |
回答 | 答案地址 | https://www.zhihu.com/question/26784045/answer/178802510 |
想法 | 想法地址 | https://www.zhihu.com/pin/1013109294408986624 |
收藏夹(公开/私人) | 知乎公开收藏夹地址, 只保存收藏夹信息和收藏夹内的答案, 由于获取不到文章列表, 所以无法保存文章 只能保存所登录账号的私密收藏夹夹 |
http://www.zhihu.com/collection/19555617 |
- 电子书名
- 最终生成的电子书名
- 抓取任务
- 支持三种模式:
- 默认独立输出单本电子书: 按子任务分别输出电子书 -> 不允许自定义电子书名
- 合并混排输出: 输出一本电子书, 电子书内容为将多个子任务的内容混排后进行输出 -> 允许自定义电子书名
- 合并按顺序输出: 输出一本电子书, 但内部按子任务进行合并排序, 每个子任务是一个章节 -> 允许自定义电子书名
- 支持三种模式:
- 排序规则
- 可以按照: 创建时间/更新时间/赞同数/回答数对内容进行排序
- 当有多个排序规则时, 排序优先级按从上到下进行
- 图片质量
- 高清 => 默认值
- 无图 => 完全没有图片
- 原图 => 图片原图, 会导致电子书体积过大, 一般不建议使用
- 自动分卷
- 每本电子书内最多可有的(问题+想法+文章)总数
- 超过该数值会对电子书进行自动分卷, 输出名为"电子书-卷 1"/"电子书-卷 2"/"电子书-卷 3"/etc 的 n 个文件
- 备注
- 用于保存备注信息
- 配置文件内容
- 最终生成的配置文件, debug 用
如有 bug, 烦请邮件告知
务必附上出现 bug 时的配置文件哦
-
基础功能
- 抓取用户回答
- 导出用户回答
- 抓取收藏夹
- 导出收藏夹
- 抓取话题精华回答
- 导出话题精华回答
- 自定义抓取问题/回答/文章列表
- 抓取专栏文章
- 导出专栏文章
- 抓取用户行为记录
- 导出用户点赞的所有文章/回答
- 使用基础命令, 派发进程
-
扩展功能
- 导出为单页 HTML
- 导出为 epub
- 支持通过配置, 按赞同数/创建时间 正序/倒序 导出文章/答案
- 添加升级检测, 从服务器获取 cookie
- 添加图形界面, 利用 Electron 创建图形界面/登陆知乎/生成命令配置
- 利用 Electron 根据命令启动配置
- 在 Electron 展示后端运行日志
- 获取问题/回答/文章时, 统一使用标准的 answer/article 接口进行获取, 保证数据结构一致性(需要了解知乎接口相关参数原理)
- 能够自动读取上一次生成的配置文件, 而不是每次都需要重新输入
- 能够按照赞同/答案长度等指标过滤答案
- 开始运行时在前端界面自动检测升级, 并给与提示
- 导出文件时, 支持自定义配置
- 电子书名
- 应有默认值
- 封面
- 作者
- 电子书名
-
todo
- 将 type 声明改为使用 namespace 形式进行声明
- 将 view 改为使用类继承方式进行实现
- 输出目录结构
- 当用户回答为空时, 需要跳过渲染环节
- 解决 GUI 下看不到运行日志的问题
- 解决 GUI 版本无法生成 epub 文件
- 解决 GUI 版本无法将生成结果从缓存文件夹中复制到输出文件夹中的问题
- 为电子书添加封面
- 解决 Edge 浏览器下用户头像过大问题
- 解决目录列表页显示有空行的问题
- 解决多看电子书结尾处右下角会换行的问题
- 添加一个 tab, 作为使用说明
- 运行日志刷新频率过高会导致页面卡死, 定时刷新需要延长执行时间
- 展示日志应该限制总高度, 每次刷新后应自动滚动到最下方
- 把 demo 调的正规一点
- 话题支持输出文章&回答(话题列表中同时有回答&文章, 目前为了赶进度, 只渲染的文章)
- 支持分卷(每 10000 个问题分为一本电子书, 避免文件体积过大)
- 调整回答右下角日期格式, 现在分成了三块, 不好看
- 支持配置项中的功能
- 答案排序
- 创建时间
- 更新时间
- 赞同数
- 评论数
- 由高到低
- 有新到旧
- 图片质量
- 高清
- 原图
- 无图
- 自动分卷
- 10000
- 答案排序
- 只有抓取全部记录才是高频率的抓取, 因此可以设定抓取范围, 按时间范围, 避免频繁抓取
- 验证想法页面是否可以正常渲染
- 优化页面样式
- 启动时检查是否有权限/用户是否被封禁
- 如果用户被封禁, 暂停任务, 提示用户重新登陆
-
fixed bug list
- 输出图片的时候, 本应该替换 src 属性, 但是替换成了 data-default-watermark-src 属性
- 致谢列表溢出了背景颜色区域
-
二期规划
- 项目目标
- 制作电子书, 方便自己阅读
- 而不是制作电子书, 以对外发布
- 不需要商业化
- 因此不需要复杂的排版功能
- 关键在于, 是否方便
- 需要
- 收集功能
- 简单自定义内容
- 制作电子书, 方便自己阅读
- 电子书制作模式
- 基础模式
- 选择数据源
- 问题/答案/收藏夹/话题/想法/专栏/文章/用户回答/用户提问过的问题/用户关注过的问题/用户赞同过的回答&文章/用户想法
- 确认输出模式
- 排序模式
- 正序/倒序
- 问题与文章
- 赞同数
- 评论数
- 答案/文章创建时间
- 答案/文章最后更新时间
- 收藏时间-可选
- 想法
- 发布时间
- 赞同数
- 评论数
- 转发数
- 用户故事
- 支持按照赞同时间顺序
- 正序/倒序
- 支持按照赞同时间顺序
- 用户关注过的问题
- 支持按照关注时间顺序
- 正序/倒序
- 支持按照关注时间顺序
- 问题列表/混排模式
- 支持按照原始设定顺序
- 答案视为一个问题
- 文章也视为一个问题
- 按以下进行排序
- 总答案赞同数
- 问题关注人数
- 问题浏览数
- 问题创建时间
- 问题最后编辑时间
- 单纯收藏夹
- 支持按收藏时间排序
- 过滤条件
- 正序/倒序
- 问题与文章
- 赞同数
- 评论数
- 答案/文章创建时间
- 答案/文章最后更新时间
- 想法
- 发布时间
- 赞同数
- 评论数
- 转发数
- 问题与文章
- 前 n 条/前百分之 n
- 至少 m 条
- 至多 y 条
- 正序/倒序
- 图片配置
- 原图
- 默认
- 无图
- 自定义逻辑
- 按最小宽高(或/且)
- 宽大于指定值 => 使用原图
- 高大于指定值 => 使用原图
- 按最小宽高(或/且)
- 排序模式
- 输出单位
- 如果是简单类型(话题/专栏/用户回答/用户问题/用户想法/收藏夹/单个问题), 单独输出一本电子书, 允许自定义书名
- 如果是复杂类型(两种及以上类型混合), 按问题/文章/想法三大类聚合输出, 不支持分章节
- 存储单位
- 基本单位
- 回答
- 文章
- 想法
- id 统一使用 varchar(100)
- 使用基本接口进行查询
- 其余数据使用这两者进行构建, 例如, 关注问题列表的记录为
- 关注问题列表
- 问题下回答列表
- 关注问题列表
- 基本单位
- 选择数据源
- 基础模式
- 支持自定义
- 电子书
- 书名
- 封面图片
- 作者
- 相关可配置属性
- 电子书集合
- 统一叫自定义电子书
- 回答
- 问题
- 专栏
- 文章
- 想法
- 电子书
- 支持抓取
- 想法
- 回答
- 问题
- 用户关注过的问题下的回答
- 组织模式
- 按问题组织
- 对外的最小粒度应该是问题/文章/想法
- 想法单条展示
- 想法下
- 图片 => 直接展示
- 文章/回答 => 抓取内容进行渲染
- 问题 => 抓取答案进行渲染, 默认只渲染按赞同数排名的前 20 条
- 想法下
- 项目目标
- 变量命名规范
- 类型统一使用 namespace 方式声明, 导入时使用
Type + xxx
形式进行导入 - Model 导入时统一使用
M + xxx
形式进行导入 - View 导入时统一使用
View + xxx
形式进行导入 - Util 工具函数导入时统一使用
xxx + Util
形式进行导入 - async 函数前统一添加
async
前缀, 以和正常函数进行区分
- 类型统一使用 namespace 方式声明, 导入时使用
- 文件命名规范
- 统一使用下划线方式命名
- 建议只开发命令版
- 使用
npm run ace
启动
- 使用
- GUI 版需要为 Electron 编译 sqlite3, 非常麻烦, 不建议尝试
- 编译指南: https://www.cnblogs.com/DonaHero/p/9809325.html
- 流程
- Windows 用户
- 安装 Python3, 第一步时勾选
添加Python到Path
, 如果未勾选, 可以重装一遍 - 安装VS 2022 社区版
- 文件-新建项目-Visual C++ -> 选择 安装 vs2022 所需的 C++开发环境
- 执行
npm run rebuild-electron-with-sqlite3
, 编译完成 sqlite3 之后, 就可以启动 GUI 界面了
- 安装 Python3, 第一步时勾选
- Mac 用户
- 我没有 mac 谢谢
- Windows 用户
- 注意:
- 打包时会向 dist 目录中复制一份 node_modules 目录, 导致 npm run 时优先从 dist 中获取 node_module 信息, 导致无法启动
- 因此, 打包结束后需要将 dist 里的 node_modules 目录删掉, 以免影响后续开发工作
- 打包时会向 dist 目录中复制一份 node_modules 目录, 导致 npm run 时优先从 dist 中获取 node_module 信息, 导致无法启动
- 电子书封面分辨率为: 100 * 130(宽*高)
- commit 信息规范 =>
关键字 功能 feat 添加新功能 format 调整代码格式 fix 修复错误 doc 修订文档/注释
- TypeScript 提供类型支持, 在编写代码时可以自动提示变量下的属性
- Electron 提供图形界面, 利用 webview 标签直接登陆知乎
- 利用知乎接口抓取数据
- ace/command 提供命令行支持
- sqlite3 提供数据库支持
- 将电子书制作分为以下三步
- 初始化环境 => 对应于
npm run ace Init:Env
命令 - 抓取指定内容 => 对应于
npm run ace Fetch:XXX
系列命令, 目前支持Column
/Author
/Activity
/Collection
/Topic
- 从数据库中获得数据, 生成指定内容电子书 => 对应于
npm run ace Generate:XXX
系列命令, 目前支持Column
/Author
/Activity
/Collection
/Topic
- 因此, 实际任务流程就是根据用户输入 url, 生成对应命令配置, 不断执行命令即可
- 初始化环境 => 对应于
- 项目开发流程
npm run watch
启动监控, 将ts
自动编译为js
文件npm run startgui
, 启动前端界面(vue 项目, 基于 Element-UI 简单构建)- 修改
src/index.ts
, 将代码由替换为// 线上地址 mainWindow.loadFile('./gui/dist/index.html') // 本地调试 & 打开控制台 // mainWindow.loadURL('http://127.0.0.1:8080') // mainWindow.webContents.openDevTools()
使用本地页面进行调试// 线上地址 // mainWindow.loadFile('./gui/dist/index.html') // 本地调试 & 打开控制台 mainWindow.loadURL('http://127.0.0.1:8080') mainWindow.webContents.openDevTools()
- 执行
npm run start
, 启动 Electron- 前端点击
开始任务
按钮后, 将任务配置写入task_config_list.json
, 再由 Electron 收集登陆后产生的知乎 cookie, 存入config.json
文件中, 随后启动Dispatch:Command
命令, 开始执行任务
- 前端点击
- 注意事项
- Electron 需要编译 sqlite3 后才能启动, 不容易搞, 建议直接使用
npm run ace
命令行方式进行调试 - 命令使用说明详见代码
- 建议最好配置淘宝镜像, 以便加快 install 速度
npm config set registry https://registry.npmmirror.com npm config set disturl https://npmmirror.com/mirrors/node/ npm config set electron_mirror https://npmmirror.com/mirrors/electron/
- 如果 sharp 无法安装, 可以尝试使用
npm install
进行安装
- Electron 需要编译 sqlite3 后才能启动, 不容易搞, 建议直接使用
欢迎通过issue提建议