使用 Calibre 的命令行工具下载新闻

2019-08-17

Calibre 具有完善的新闻下载功能,可以从各种媒体的网站抓取最新的文章并生成电子书文件。得益于开源社区的贡献,它还内置了针对一千多个不同网站编写的配置方案(称作 recipe),并且更新非常及时。

但是,Calibre 的图形界面非常简陋且经常卡顿,使用起来体验较差。如果要使用定时下载新闻的功能,还必须保证软件一直在后台运行。另外,如果想在 Linux 服务器上运行 Calibre,一般也没有图形界面可用。

Calibre 一言难尽的图形界面

Calibre 一言难尽的图形界面

因此,使用命令行来下载新闻是更快捷、通用、且适合自动化的做法。本文将介绍用 Calibre 的命令行工具下载新闻的一般方法,然后在此基础上说明如何配置自动运行,并将下载好的文件通过不同方式传输到其他设备上阅读。

基本用法

Calibre 在命令行中的新闻下载功能是整合在其格式转换命令 ebook-convert 中的。其基本用法是:

ebook-convert "Title of news source.recipe" outputfile.epub

其中,第一个参数是 recipe 的名称。不过,Calibre 在文档中没有指出的是,在使用内置方案时,Title of news source.recipe 不是指内置方案的文件名,而是指新闻网站的全称,.recipe 不是扩展名,只是一个后缀。只有在找不到对应的内置方案时,Calibre 才认为该参数是自定义方案的绝对路径。

要知道自己想阅读的网站有没有专用的内置方案,除了可以在 Calibre 的图形界面的新闻下载界面中查询,还可以使用 ebook-convert --list-recipes 命令。例如:

$ ebook-convert --list-recipes | grep 'New York Times'
	New York Times Book Review
	New York Times Sports Beat
	New York Times Technology Beat
	The New York Times
	The New York Times (Web)

所以,如果要下载当天的《纽约时报》,完整的命令应该是

ebook-convert "The New York Times.recipe" nytimes.epub

下载所得的 EPUB 文件如下图所示,除个别特殊样式不能正常显示之外,整体效果比较令人满意。

用 Calibre 下载的报纸

用 Calibre 下载的报纸

定时下载报纸期刊

对于更新时间固定的报纸或期刊,在每次出新时手动下载显然是没有必要的。另外,最好能够在所下载文件的名称中标明日期,以便区分。

还是以下载每天的《纽约时报》为例。创建一个名为 getnyt.sh 的脚本文件(同时使用 chmod +x 为其增加运行权限),其内容为:

#!/bin/bash

TODAY=$(date +%m%d)
ebook-convert "The New York Times.recipe" nytimes-$TODAY.epub

这里,TODAY 变量使用了 date 命令的自定义日期格式功能,为下载的文件标注了日期。其他更复杂的日期格式可以用 man date 查阅。

下一个要解决的问题是如何让脚本定期运行。在 macOS 或 Linux 上,显而易见的答案是使用 cron。运行 crontab -e 打开 crontab 文件的编辑界面,在其中加入:

CRON_TZ=America/New_York
30 0 * * * /root/getnyt.sh >/dev/null 2>&1

这里用到了 CRON_TZ 变量来指定时区。《纽约时报》的更新时间是美国东部时间每天凌晨,虽然可以手工换算成国内时区,但直接使用纽约时区可以避免考虑夏时制的问题。30 0 * * * 指全年每月、每周七天的 0:30 分。类似地,对于一般每周四中午更新周刊内容的《经济学人》,相应的 cron 日程应该是 0 12 * * 4。(更详细的 cron 日程写法可以使用这个工具阅读并测试。)

最后,由于 Calibre 在下载新闻时会输出很多日志,这里用>/dev/null 2>&1 让脚本静默运行。

将下载的期刊发送给其他设备

当然,新闻下载成电子书格式以后,终归还是要搬运到其他设备里阅读的。具体做法因需求而异,包括:

**直接连接到服务器下载:**如果你使用 iPad 等设备作为阅读器,那么可以直接使用 Documents 这类支持 SFTP 的文件管理工具登录服务器下载。

**添加到 Calibre 资料库:**如果你习惯用 Calibre 来管理所有的电子书,并且就是在平时存放 Calibre 资料库的电脑上运行脚本,那么可以考虑将下载好的电子书直接添加到资料库。Calibre 在命令行下使用 calibredb 工具来维护资料库,对应的完整命令形如:

calibredb add --with-library /path/to/library nytimes.epub

你还可以进一步使用 Calibre 的内容服务器功能在其他设备上访问下载好的新闻。

**存入网盘:**如果你是在远程服务器上运行 Calibre 下载新闻,那么更实际的方法或许是直接把下载好的电子书存进网盘。这可以通过 rclone 来实现。该工具支持包括 Dropbox、OneDrive 和 Google Drive 等各大主流在线存储服务,具体的配置方式可以参考官方文档。以 OneDrive 为例,配置好以后,在上文脚本后加入一行

rclone copy nytimes.epub onedrive:/Documents/News; rm nytimes.epub

即可将 Calibre 下载的期刊文件转移到网盘。

如果想使用百度网盘,那么也可以配置 BaiduPCS-Go,然后使用 BaiduPCS-Go upload 命令来上传。

**通过邮件发送:**最后,你也可以考虑将下载好的新闻通过邮件形式发送。这对于 Kindle 用户可能尤其实用,因为可以配合 Kindle 的文档服务功能实现新闻推送的效果。

Calibre 内置了一个用于发送邮件的命令行工具 calibre-smtp。由于该命令涉及的参数太多,建议使用脚本和变量来控制。例如,下面片段的作用是以 Gmail 发送下载好的当日《纽约时报》(注意很多开启了两步验证的邮件服务需要配置专用密码)。

TODAY=$(date +%m%d)
DATELONG=$(date +%Y/%m/%d)
SMTP="smtp.gmail.com"
PORT="587"
USER="username"
PASSWD="password"
FROM="[email protected]"
TO="[email protected]"
MSG="Please find attached today’s New York Times. Have a good day!"

calibre-smtp --attachment nytimes-$TODAY.epub --relay "$SMTP" --port "$PORT" --username "$USER" --password "$PASSWD" --encryption-method TLS --subject "Today’s New York Times ($DATELONG)" "$FROM" "$TO" "$MSG"

额外考虑:Calibre 的网络环境配置

最后需要考虑的是,如果你的服务器本身访问新闻网站有困难,Calibre 也无法直接下载新闻。Calibre 遵从系统的代理设置,支持的代理类型为 HTTP 和 HTTPS,但不包括 Socks(但可以先通过 PrivoxyProxifier 这类工具转换)。对于 macOS,该设置位于「系统偏好设置」>「网络」>「高级」>「代理」;对于 Windows 10,则位于「设置」>「网络和 Internet」>「代理」。Linux 系统或者使用脚本的场景,则需执行:

export https_proxy=https://username:password@servername; export http_proxy=http://username:password@servername