comics-downloader的MangaDex API对接解析:用官方REST API优雅抓取漫画章节的完整思路
【免费下载链接】comics-downloadertool to download comics and manga in pdf/epub/cbr/cbz from a website项目地址: https://gitcode.com/gh_mirrors/co/comics-downloader
comics-downloader 是一款开源的漫画与日漫下载工具,支持把网页上的漫画章节一键抓取并封装为 PDF、EPUB、CBR、CBZ 等电子书格式。本文以它对接 MangaDex 官方 REST API 的实现为例,拆解"从 URL 到漫画图片"的完整抓取思路,帮你理解如何用 API 优雅地替代脆弱的网页爬虫 📚
为什么选官方 API,而不是解析网页?
很多下载器通过抓取 HTML 页面再正则提取图片链接,一旦网站改版就集体失效。MangaDex 提供了结构清晰的官方 REST API,返回标准 JSON,接口稳定、体积小、速度快。这正是 comics-downloader 中 mangadex.go 的设计哲学:整个 MangaDex 适配器不到 200 行代码,就实现了从单章到整本的完整下载能力。
对于想自己写下载器或爬虫的朋友,这套思路完全可复用。
整体架构:统一接口 + 站点适配器
理解源码前先看骨架。所有站点实现统一的BaseSite接口(base.go),只暴露三个方法:
| 方法 | 职责 |
|---|---|
RetrieveIssueLinks | 根据用户 URL 返回章节链接列表 |
GetInfo | 返回漫画名称与章节号 |
Initialize | 填充某一章节的全部图片链接 |
loader.go 按域名分发到具体适配器(匹配到mangadex就创建NewMangadex(options))。所有站点最终都把结果写入统一的Comic结构体(core.go),再由核心层负责下载与封装——站点层只负责"找链接",核心层只负责"下载和打包",职责非常干净。
第一步:解析 URL,区分"单章"与"整本"
⚡ 用户可能传两种链接:chapter/{章节ID}/...(单章)或title/{漫画ID}/...(整本漫画)。
RetrieveIssueLinks 用 TrimAndSplitURL 把 URL 按/切分,看第 4 段(parts[3])判断:
- 是
chapter→ 只返回用户给的那一章; - 是
title→ 调用章节列表接口,返回全部章节; - 其他情况 → 直接报
URL not supported错误,快速失败不浪费时间。
这种"先识别意图、再走不同分支"的写法,是每个站点适配器都需要的第一步。
第二步:三个核心 REST 接口拆解
1️⃣ 获取漫画标题:/manga/{mangaID}
getManga 请求api.mangadex.org/manga/{mangaID},响应中attributes.title是一个多语言标题映射表(语言代码 → 标题)。源码按用户-country参数优先取对应语言的标题,找不到就取任意一个,非常贴心。
2️⃣ 获取章节列表:/manga/{mangaID}/aggregate
getChapters 请求api.mangadex.org/manga/{mangaID}/aggregate,可选带translatedLanguage[]={语言}过滤翻译语言。响应是两层嵌套的 JSON:
volumes(卷) → chapters(章) → { id, chapter: "575" }拿到每章 ID 后,拼回人类可读的章节 URLmangadex.org/chapter/{chapterID}供后续使用。
💡 源码注释里记录了一个 API 的"坑"(L82-L84):当漫画没有卷信息时,接口返回空数组[];否则返回对象。解码失败时静默返回空列表而不是报错——这是对接真实 API 时不得不处理的边界情况。
3️⃣ 获取章节图片:/chapter/{chapterID} + /at-home/server/{chapterID}
这是最关键的一步,getChapter 分两次请求:
- 请求
api.mangadex.org/chapter/{chapterID},拿到卷号、章号、标题,以及relationships里所属漫画的 ID(用于反查漫画名); - 请求
api.mangadex.org/at-home/server/{chapterID},拿到hash和文件列表。
然后按固定规则拼装图片直链:uploads.mangadex.org/data/{hash}/{文件名}。图片真实地址藏在 at-home 接口的 hash 里,直接猜 URL 是猜不出来的——这类"先问服务器、再拼 CDN 地址"的模式在漫画站中很常见。
第三步:并行下载 + 封装电子书
图片链接交给核心层后,DownloadImages 用信号量限制并发(默认 CPU 核数),把每张图片按0001-image.jpg、0002-image.jpg顺序落盘;MakeComic 再按-format参数分流:
- pdf:逐页嵌入图片,按原始像素比例生成页面尺寸;
- epub:第一张图作为封面,其余作为章节;
- cbr/cbz:打包成压缩归档后改扩展名。
常用命令行组合:
./comics-downloader -url=整本漫画URL -all -format=epub ./comics-downloader -url=整本漫画URL -all -range=1-30 ./comics-downloader -url=单章URL -images-only实用技巧:语言过滤与错误处理
-country参数:MangaDex 用 ISO 3166-1 国家/地区代码过滤翻译语言(如en、fr),对应 Options.Country,在章节列表和标题选择两处生效;- 统一校验
result字段:三个接口每次解码后都检查Result != "ok"并抛出Unexpected response(mangadex.go),避免把错误响应当正常数据用; GetInfo的容错(L180-L209):章节标题拼成Vol 60 Chapter 575, A Will of Stone样式,漫画名查询失败时仍保留章节名,保证文件名可用。
如何克隆源码继续阅读?
想动手阅读或修改,可克隆仓库后从三个文件入手:
git clone https://gitcode.com/gh_mirrors/co/comics-downloader推荐阅读顺序:
- pkg/sites/base.go —— 先看接口契约(10 行);
- pkg/sites/mangadex.go —— 本文主角,API 对接全流程;
- pkg/sites/loader.go + pkg/core/core.go —— 看调度与下载封装;
- pkg/sites/mangadex_test.go —— 注释中的测试用例展示了单章、整本、
-last、不支持 URL 等场景的预期行为,是最好的"活文档"。
总结
comics-downloader 对 MangaDex 的对接给出了一个教科书式范例:解析 URL 判断意图 → 用官方 REST API 换结构化数据 → 按规则拼图片直链 → 并发下载后封装电子书。没有 CSS 选择器、没有正则抠 HTML,全部围绕 JSON 接口展开,因此稳定、简洁、易维护。如果你正在为自己的站点写下载工具,这套"接口优先、快速失败、统一核心层"的思路值得直接借鉴 📥
【免费下载链接】comics-downloadertool to download comics and manga in pdf/epub/cbr/cbz from a website项目地址: https://gitcode.com/gh_mirrors/co/comics-downloader
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考