起因:我只是想保存一篇文章
昨天在 GitHub 上看到一篇很好的文章——"提問的智慧"(How To Ask Questions The Smart Way),想把它存到电子阅读器里慢慢看。
我心想:能不能让 AI 帮我搞定?于是随口问了一句:
从github中搜索html to epub的相关Skill,即可以将Html文件封装为epub电子书的skill.
这就是整个故事的起点。没有任何预设方案,没有任何技术准备,就是一句话。
第一句:帮我做成 EPUB
AI 很快给出了搜索结果,但我觉得还是直接做更省事。于是我直接说:
读取这个网址的内容:https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way将网页中的"提問的智慧"这篇文章全部的内容,封装为一本epub书籍。
就这么一句话,几分钟后 AI 告诉我:EPUB 已生成,12个章节,42KB,打开看看,封面、目录、章节结构一应俱全。排版的样式也很好看!具体如下:
我当时的反应:真的就这么简单?过去,同样的内容,我如果用 Sigil 制作EPUB,没有 30 分钟,估计是完不成,现在不到 1 分钟就搞定了!!
第二句:转成简体中文
打开一看,内容是繁体中文的。原文就是 Traditional Chinese,这很正常。但我想要简体中文版本,于是又说了一句:
现在是繁体中文的,转换为简体中文
AI 很快就处理好了。文件夹里出现了两个文件——繁体版和简体版,文件名也自动变成了"提问的智慧.epub"。
第三句:出问题了,看看怎么修
但当我兴冲冲打开简体中文版的时候——一片空白,什么都看不到。
我说:
简体中文版的打开没有显示文本,分析问题出在哪来
AI 展开了一通排查,最后告诉我:原来是文件名编码的问题。繁体文件名在转换过程中路径断裂了,阅读器找不到文件,所以显示空白。
几分钟后修复完成,AI 说:
现在简体中文版可以正常阅读了,请你重新打开试试
我打开一看——真的正常
第四句:打包成 Skill
一来一回解决了问题,我突然想到:这个流程这么顺手,能不能把它变成一个随时可用的工具?于是我说:
封装为skill
AI 追问了几个细节:输入格式、触发时机、语言处理。我简单回了三句话:
输入格式:根据指定数据源,可能是markdown,也可能是html触发时机:你说的都可以,就是自然语言触发,或者我会直接手动调用skill语言处理:如果是繁体中文,自动转换为简体中文,内置到skill中
最终成果:一句话,一本电子书
现在,我只要随便说一句:
"把这篇文章做成epub"
或者:
"Save as ebook" / "生成epub" / "转换为EPUB"
AI 就会自动完成:获取内容 → 识别格式 → 繁简转换 → 排版 → 输出 EPUB3 电子书。
整个过程,从我开始到结束,我动嘴说了不到十句话,就从一个需求变成了一个随时可用的工具。
一些感想
回看这个过程,有几个场景让我印象深刻:
第一次生成时,看着 AI 把一篇 700 多行的 Markdown 文章变成一本带目录、带封面、排版精美的电子书,那种感觉就像自己会了魔法——虽然实际上我只是说了一句话。
空白页的那次 Debug,我一度以为要自己上手编码了。结果我说"分析问题出在哪",AI 自己找到了根因、自己修复、自己验证。我全程只需要打开文件确认结果。
封装 Skill 的时候,AI 主动问我要什么输入格式、什么触发方式,我只需要做选择题和填空题。
这让我意识到:AI 真正的价值不是帮你写代码,而是把"我想要"到"我得到了"之间的路径,缩到最短。 从想要一本电子书,到真的拿到手,中间隔的只是一句自然语言。
如果你也有类似的需求,不妨试试用自然语言告诉 AI 你的想法。可能结果会超出你的预期。
附:技术实现简记
以下记录了这个 Skill 实现过程中的几个技术要点,供感兴趣的朋友参考。
Skill 能力一览
| |
|---|
| Markdown / HTML / URL / 纯文本,自动识别 |
| # |
| |
| |
| CJK 优化 CSS(思源黑体、1.8 行高、2em 首行缩进) |
繁简转换的坑
这是最值得记一笔的问题。zhconv 对 OPF 元数据文件做繁简转换时,href 路径里的繁体字也被连带转换了,比如 chap_聲明.xhtml 变成了 chap_声明.xhtml。但实际磁盘上的文件名并没变,导致阅读器找不到文件,整本书空白。
修复方案是在对所有文本文件完成繁简转换后,同步重命名磁盘上的文件名,让实际文件路径与 OPF/NCX/Nav 中的引用保持一致。
ebooklib 的几个注意点
ebooklib 的 Tuple 类在 v0.18+ 中已移除,TOC 需使用原生 Python 元组read_epub() + write_epub() 存在 uid=None 的 bug,编辑 EPUB 时需使用原始 ZIP 操作- EPUB3 规范要求
mimetype 文件必须是 ZIP 中的第一个文件,且使用 ZIP_STORED(无压缩)
Python 3.14 兼容性
在 macOS 的 Python 3.14 上遇到了一个边际问题:from html import escape 导致 os.getpid() 返回异常。原因是 Python 3.14 内部模块加载顺序变化导致 posixpath 模块意外掩盖了 os.getpid()。改用 time.time_ns() 替代。
同时,raw.githubusercontent.com 在 macOS + Python 3.14 上存在 SSL 证书验证失败问题,实现中加入了自动降级策略:优先尝试 SSL 连接,失败后自动切换到 curl -sL 子进程获取内容。
技术栈
- ebooklib
- markdown
- zhconv
- Python 3.14
觉得有用?欢迎点赞、在看、转发,让更多人了解 AI 的实际应用场景。