【免费下载链接】zlib
一个 Z-Library 命令行工具,支持图书搜索、下载、发送到 Kindle,支持 AI Agent 集成。 如需提交 Issue 或 PR,请前往 https://github.com/heartleo/zlib
zlib 是一个 Z-Library 命令行工具:搜索图书、下载文件、发送到 Kindle,全部在终端里完成。由于 Z-Library 的 EAPI 接口没有任何官方文档,zlib 项目在开发中用 JADX 反编译了官方 Android APK,直接从代码里还原出 EAPI 接口定义,再逐条与真实服务器响应交叉验证。本文完整复盘这套 APK 逆向还原接口的实战方法。
为什么要逆向 APK 找接口?
EAPI(Electron API,Z-Library 移动端使用的接口)有几个绕不开的麻烦:
- 没有官方文档:端点、参数、返回结构全都"藏在"客户端里;
- 网页端不稳定:部分域名对非浏览器请求会进入 DiamWall 重定向循环,而移动端的 EAPI 往往还能正常工作;
- 接口随时会变:上游可能改字段、改认证,甚至关闭域名。
在这种情况下,官方 Android 应用就是最好的"活文档"——它声明了完整的接口路径、HTTP 方法和参数结构,比抓包更系统,比零散的网络博客更权威。zlib 正是沿着这条思路,把逆向结果沉淀成了 EAPI 文档 和完整的客户端实现。
用 JADX 反编译 APK 的标准姿势
逆向过程记录在 docs/android-api-research.md,核心步骤只有三步:
- 锁定目标版本:官方 Android 包为
com.positron_it.zlib,versionName 1.11.4。由于latest.apk是可变下载地址,下载后先记录 SHA-256 校验值,保证可复现; - 用 JADX 导出关键类:API 全部定义在
com.positron_it.zlib.data.ZLibApi这一个类里,直接单类导出即可:
jadx --single-class 'com.positron_it.zlib.data.ZLibApi' --single-class-output 'ZLibApi.java' 'zlibrary.apk'
-
读懂 Retrofit 注解:Z-Library 的 App 使用 Retrofit 框架,每个方法的注解里直接写着路径和参数,例如:
功能 方法 参数 登录 POST /eapi/user/loginemail、password、auth_token搜索 POST eapi/book/searchmessage、yearFrom、yearTo、languages[]、extensions[]、e、page、limit、order图书详情 GET /eapi/book/{id}/{hash}路径参数 id、hash下载链接 GET /eapi/book/{id}/{hash}/file文件经动态 URL 二次 GET 流式下载
这就是逆向接口最省力的地方:一个类的注解 ≈ 一整份接口清单。
还原出的 EAPI 接口矩阵
ZLibApi 一共声明了 37 个方法。按功能归类后,核心矩阵如下(完整矩阵见 docs/android-eapi-deep-dive.md):
| 类别 | 端点 | 说明 |
|---|---|---|
| 会话 | POST /eapi/user/login | 登录;响应中取回 remix_userkey 作为后续凭证 |
| 搜索 | POST /eapi/book/search | 表单提交关键词、年份、语言、格式、排序 |
| 图书 | GET /eapi/book/{id}/{hash}、/formats、/similar | 详情、可用格式、相似图书 |
| 下载 | GET /eapi/book/{id}/{hash}/file | 生成下载链接,二进制文件从动态地址流式获取 |
| 书架 | GET /eapi/user/book/downloaded、/eapi/user/book/saved | 下载历史与收藏夹,均支持 order,page,limit |
| 推荐 | GET /eapi/book/most-popular、/recently、/eapi/user/book/recommended | 热门、新书、个性化推荐 |
| 账户 | GET /eapi/user/profile、/eapi/info/domains | 账户信息、下载配额、可用域名列表 |
| 元信息 | GET /eapi/info/languages、/extensions、/plans | 语言、格式、套餐规则 |
数据模型也写在类里
Retrofit 方法上标注的响应模型(ZLibBooksListing、ZLibBook、ZLibPagination 等)等于把 JSON 结构也交代了,例如:
ZLibBook:id、hash、title、author、year、extension、filesizeString、cover、description等;ZLibPagination:current、total_pages等分页字段;ZLibBookFormats:每个格式带独立的id、hash、extension——换格式不是改扩展名,而是换 ID/Hash 对。
模型细节与调用行为对比表见 docs/android-eapi-deep-dive.md 的"Data models and call behaviour"一节。
排序参数 order:逆向出的隐藏功能
APK 的搜索排序对话框会把选项下标传进一个数组,再经 BooksRepo.Query.order 注入搜索表单。逆向还原出的 8 个取值:
| UI 含义 | order 取值 |
|---|---|
| 热门 | popular |
| 最佳匹配 | bestmatch |
| 最新上架 | date |
| 书名 A–Z / Z–A | titleA / title |
| 年份 | year |
| 文件大小(大→小 / 小→大) | filesize / filesizeA |
实测同一查询下 8 个值各返回不同的 ID 排序,于是 zlib 直接把它做成了 search --order 参数。注意收藏夹和下载历史用的是另一套 7 值排序(saved_date、downloaded_date 等),不能与搜索排序混用——这也是纯逆向阅读能看出来的坑。
APK 声明与 zlib 源码交叉验证
还原出的接口并不是抄一遍就完事。zlib 把每个端点与客户端源码逐条对齐:
- internal/zlib/eapi.go:登录表单编码、搜索字段、
remix-userid/remix-userkey请求头; - internal/zlib/eapi_book.go:图书详情与两步下载(先取
/file链接,再跟随动态 URL 流式下载); - internal/zlib/eapi_profile.go:账户信息与下载历史路径;
- internal/cli/doctor.go:用
GET /eapi/info/domains逐个探测域名健康度。
交叉验证同时确立了三条安全红线,都写在 docs/android-api-research.md 中:
- APK 常量永不复制进源码:反编译出的固定授权头、设备信息只是"声明",是否必需必须由服务器响应证明;
- 域名单白:APK 里打包的域名只是出厂默认值,不能绕过 zlib 的域名白名单与重定向凭证剥离逻辑;
- GET 也可能改状态:
/save、/unsave、/delete等端点虽用 GET 却会变更账户状态,绝不能当作只读请求缓存或重试。
逆向的边界:声明不等于实测
这是整份研究最有价值的部分——把"APK 声明"与"真实服务器行为"分开标注:
GET /eapi/book/recently:声明返回图书列表,实测只回success=1而没有books,于是recently被暂缓;GET .../formats:模型完整,但实测 6 本书全部返回空数组,CLI 只能如实展示"无其他格式";POST /eapi/user/login:个别账户会被单独拒绝(Authorization failed),而同一账户用 Cookie 导入后 EAPI 完全正常——说明登录端点被单独管控,zlib 因此保留了zlib login --cookies的 Cookie 导入通道;GET /eapi/info/domains:返回 5 个候选域名,但并非"全球可用清单",仍须 zlib doctor 逐一探测。
一句话总结方法论:反编译给出地图,实测验证道路,两者都要留痕。
小结
zlib 的这次 APK 逆向把"无文档接口"变成了可维护的工程资产:JADX 单类导出 Retrofit 注解 → 整理端点/参数/模型矩阵 → 逐条与服务器实测对照 → 落入 Go 客户端与安全边界。完整的端点矩阵、模型表和排序行为对比,都可以直接阅读仓库内两份研究文档:
- 初版静态分析:docs/android-api-research.md
- 深度实测与命令规划:docs/android-eapi-deep-dive.md
- 接口使用与限制说明:docs/eapi.md
【免费下载链接】zlib
一个 Z-Library 命令行工具,支持图书搜索、下载、发送到 Kindle,支持 AI Agent 集成。 如需提交 Issue 或 PR,请前往 https://github.com/heartleo/zlib
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考






