Golang 生成 O'Reilly 在线学习平台的电子书

O’Reilly 是有名的动物书出版公司,当然他们也不仅仅出电子书还有很多别的业务。O’Reilly 在线学习平台上有他们所有出版过的图书都是原版的,但是仅提供在线阅读,虽然也有 App,但是想在 kindle 上看提高阅读体验。

于是抽时间练习练习 Golang 写了个程序,生成 mobi 格式的电子书。Github 地址 oreilly_kindle_book

使用说明

  • 目前仅支持 macOS、linux, windows 改改应该也可以,但是我手头没有 windows 测不了,或者编个 Docker image 也 ok。
  • 需要 O’Reilly 在线学习平台的账号,这是必须的。
  • 安装 kindlegen,mobi 的生成就靠它。

oreilly_kindle_book 编译

基于 golang 1.13 开发,目前没有上传二进制包,自行编译吧。

推荐 clone 之后直接 make && make install

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ git clone https://github.com/zyh94946/oreilly_kindle_book.git
$ cd oreilly_kindle_book
$ make && make install
Building oreilly_kindle_book...
Building success...
Installing oreilly_kindle_book...
Install success to /usr/local/bin/oreilly_kindle_book.
Usage of oreilly_kindle_book:
-email string
you login email of https://www.oreilly.com/member/
-help
help
-n string
the num of https://learning.oreilly.com/library/view/BOOK-NAME/***
-p string
you login password of https://www.oreilly.com/member/
-version
print version and exit

当然 go get 也可以

1
2
$ go get github.com/zyh94946/oreilly_kindle_book
$ go install github.com/zyh94946/oreilly_kindle_book

oreilly_kindle_book 使用

非常简单

1
$ oreilly_kindle_book -n BOOK_NUM -email YOU_EMAIL -p YOU_PASSWORD

完成后 mobi 会生成在当前目录下。

技术总结

咱要 kindle 用,首先研究下 mobi 的生成。有两个特定格式的文件,一个 ncx (组织目录),一个 opf (组织所有文件),按格式来就能生成。开始梳理需要的资源看看可行性。完事准备写程序都爬下来,生成所需的格式,用 kindlegen 测试生成 mobi,大问题没有小问题不少,挨个解决。最后发现实现登录也不难索性加上了。编写过程中看了很多 go 原生包也使用了不少。

golang 需要注意的点不完全总结:

  • go func(){}() 实际执行的时间与其所属语句执行时间是不一样的。
  • 通过 chan 控制并发。
  • 大量字符串拼接不要用 + 时间与空间上都复杂。可用使用 strings.Builder{} 字节切片的概念。
  • os.Exit() 结束程序后,defer 不会执行。
  • 有问题多看看官方文档比什么都强 :)。