用 GitHub Actions 让 Calibre 定时推送新闻到 Kindle
Calibre 提供了一个强大、灵活且易用的新闻下载框架,可以很方便地将 RSS 订阅源或普通网页转制成电子书。再配合 Calibre 的邮件投递功能和 Kindle 的 Send to Kindle 服务,就可以将你的 Kindle 变成电子报纸,在读书的同时不错过任何你认为值得留意的新闻消息。
尽管 Calibre 的新闻下载功能很好用,但是想要定时下载并推送新闻却并不算方便,因为这需要让运行 Calibre 的计算机长时间运行,对个人计算机来说不仅不现实,也相当浪费资源。
本文提供一种方法彻底解决这个痛点。该方法利用 GitHub 的 Actions 功能让 Calibre 按照设定时间自动下载新闻并推送到指定的邮箱,不仅配置简单,速度快,而且完全免费。
小提示:以下步骤均可在手机或平板上操作,不过想要测试 Calibre 的 Recipe 脚本仍需要使用计算机。
一、必备条件
在开始接下来的步骤之前你需要确保具备以下条件才能让项目正常运行:
- 需要免费注册一个 GitHub 账号(已注册可忽略);
- 需要一个开通 SMTP 服务且可正常使用的邮箱;
- 需要一个接收新闻的邮箱地址(如 Kindle 邮箱)。
另外,当涉及到项目文件修改时,你可使用 Git 工具,也可使用 GitHub 的在线修改功能。
二、配置项目
项目的配置过程只有两步,先是将书伴的 Calibre News Delivery 项目复制到你的 GitHub 项目库中,然后在复制的项目设置中添加必要的变量就可以了。配置完成后建议先手动测试一下。
1、创建项目
登录 Github 账号,然后点击链接进入书伴的 Calibre News Delivery 项目页面。
点击项目页面右上方的【Use this template】按钮,然后在弹出的菜单中点击“Create a new repository”。然后填写“Repository name”并点击【Create repository】按钮完成创建。
* 注意:虽然这里推荐使用模板模板创建项目,但要注意,这样创建的项目无法获取原始项目的更新,如果你想要持续跟随原始项目更新,可以点击页面上方的【Fork】按钮创建分支。不过这种方式需要你手动开启 Actions 功能。
2、添加变量
点击新创建项目导航中的【Setting】进入设置页面,然后点击左侧的【Environments】进入变量配置页面。点击【New environment】按钮并在“Name”输入框中输入变量配置名称“calibre-news”。点击【Configure environment】按钮完成创建并自动进入变量配置页面。
找到“Environment secrets”这一栏,点击【add environment secret】按钮依次添加如下表所示的变量。注意“Name”要与表中的“名称”一致,相应的值要按照实际情况填写。
名称 | 必填项 | 说明 | 示例值 |
---|---|---|---|
FROM | 是 | 你的电子邮箱地址 | 如:xxx@gmail.com |
TO | 是 | 你的接收邮箱地址 | 如:xxx@kindle.com |
ENCRYPT | 是 | SMTP 加密方式 | 如:SSL |
SECRET | 是 | SMTP 密码 | 如:xxxxxxxxxx |
SMTP | 是 | SMTP 服务器 | 如:smtp.gmail.com |
PORT | 是 | SMTP 端口 | 如:465 |
FORMAT | 否 | 电子书格式(默认为 epub) | 如:epub |
SIZE | 否 | 附件大小限制(默认为 25MB) | 如:25 |
DAYS | 否 | 临时存储天数(默认为 90) | 如:90 |
注意,变量功能仅在公开项目中可用。所填写的信息与 Calibre 的邮件设置中的一致,为避免在实际运行出误,这些信息建议先在 Calibre 中测试,确认有效后再填写。
3、测试运行
项目默认预置了两个新闻源,变量配置成功后可手动测试一下,看是否能够正常工作。
点击项目导航中的【Actions】进入该项目的 Actions 页面。点击左侧的【Calibre News Delivery】进入该工作流。点击右侧的【Run workflow】按钮开始测试。
如果一切正常,则工作流日志会出现绿色对勾,你的 Kindle 会收到如下所示两本电子书。
如果出错,则工作日志会出出现红色叉号。你可以查看运行日志并根据错误信息排查问题。
三、添加脚本
Calibre 是通过 Recipe 脚本(以下简称脚本)来抓取网络内容的,你可以使用其内置的大量脚本,也可以按照自己的需求自行编写脚本(具体可参考官方文档或本站相关文章)。
正如预置的两个脚本一样,项目支持两种脚本形式,一种是 Calibre 的内置脚本,脚本名称存放在 recipe_list.text 文件中,另一种是扩展名为 .recipe 的脚本文件,存放在项目根目录中。
如果你想要自定义封面或 CSS 样式,除了在脚本中指定外,也可以将封面图片存放在项目的 covers 文件夹中,将 CSS 文件放在项目的 styles 文件夹中。图片和样式的文件名要与脚本名称一致,必须是 PNG 格式。这里的封面和样式优先级高于脚本指定的封面和样式。
你可以使用 GitHub 的在线上传文件功能添加脚本,也可以使用 Git 工具提交要添加的脚本。在添加新脚本前,强烈建议先在本地对其充分测试,确保运行时不会出现任何错误。
四、修改定时
项目的工作流默认会在 UTC 时间每天 00:00 运行。如果想要修改定时,需要修改项目中如下所示的文件,找到 - cron: '0 0 * * *'
这一行,并按照自己的实际需求修改。
.github/workflows/calibre-news.yml
时间格式同 crontab(任务时间表),具体说明可参考 GitHub 的 schedule 文档,也可以利用更容易理解的工具 crontab.guru 来自动生成时间。比如,如果你的时区是 UTC+8,想让新闻每天早上 6 点投递,则需要将其中的时间修改为 0 22 * * *
,即 UTC 时间的前一天晚上 22:00(本地时间转 UTC 的公式:本地时间 − 所在时区偏移量
,当出现负数时 + 24)。
五、下载文件
每次转换的电子书文件会被打包并存放到 GitHub Actions 的 Artifacts 中。你可以在工作流详情页面中的任务详情页面下载这些文件。每个文件自生成开始算起最长可保存 90 天。
保存天数可以自定义。你可以在项目的 Actions 设置页面中找到“Artifact and log retention”这一项并按照自己喜好修改电子书的保存天数。你也可以通过修改环境变量来设置保存天数。
注意,超过邮箱附件限制的文件无法通过 SMTP 发送,你需要从 Artifacts 中手动下载获取。
六、关闭推送
如果你想要临时关闭推送,可依次点击项目导航【Settings → Actions → General 】,并在页面找到“Actions permissions”这一栏,选择“Disable actions”并保存即可。
如果你想永久弃用项目,可依次点击项目导航【Settings → General】,滚动到页面底部点击【Delete this repository】按钮并按照提示删除整个项目即可。
七、注意事项
书伴的 Calibre News Delivery 项目仅为测试 Recipe 脚本之用。在按照文中所述内容进行操作之前,请确保你会遵守 GitHub Actions 用户服务条款,并自行承担因滥用而产生的任何后果。
注意,条款所说的“滥用”是指将 Actions 项目用于商业目的或对 GitHub 造成了过重的负担。对于个人使用、每天工作流运行时间仅数分钟或数十分钟的项目来说,则完全无需担心此风险。
© 「书伴」原创文章,转载请注明出处及原文链接:https://bookfere.com/post/1107.html
“Calibre教程”相关阅读
- Calibre 发布 3.0 版本(附常用功能梳理)
- Calibre 使用教程之为电子书添加更换字体
- Calibre使用教程之为电子书添加或修改封面
- Calibre 使用教程之电子书繁体字转简体字
- Calibre 使用教程之通过邮箱一键推送 Kindle 电子书
- Calibre 转换 TXT 文件出现 Errno 21 错误的解决方法
- 如何解决 Kindle 电子书无法更换字体的问题
- Calibre 使用教程之通过 WiFi 向 Kindle 传输电子书
- Calibre 使用教程之为 Kindle 电子书添加页码
- Calibre 常用命令行工具详解之 ebook-meta
- 英文电子书使用字典查词时选中整段的解决方法
- Calibre 使用教程之转换电子书格式
- 把 TXT 文档转换成带目录的 MOBI 格式电子书
- 解决 Calibre 推送“500 Error: bad syntax”错误
- 如何修复用 Calibre 通过 USB 导入 Kindle 的电子书封面
请问您有意愿分享一下值得推荐的高质量订阅源吗?Calibre项目内置的订阅源有点太多太繁杂了,不知道怎么去选择。
用smtp.gmail.com,Action运行成功后被Amazon要求二次确认了
请问这种情况应该怎么解决啊?
这个问题和用 SMTP 发邮件没太大关系,而是 Kindle 邮箱自身的问题。亚马逊在邮件中给出了解决方法:
想要跳过该验证,需要去亚马逊官网“管理你的内容和设备”页面的“偏好设置”编辑 Send-to-Kindle 电子邮箱地址,然后确保发送邮箱地址添加到了信任邮箱列表。
你可以先修改 Kindle 邮箱,然后手动用 Gmail 推送测试,没问题再放到 Actions 里用。
嗯嗯,谢谢。我发现问题是因为kindle邮箱和gmail邮箱的前缀名恰好一样,而亚马逊不允许这种情况
这个方案试用了几天,因为发送邮件太快而且每天都是同一个收件人,导致我微软帐号被当成垃圾邮件封了(唉)。不知道 Gmail 会不会有这种情况。
实际上只要验证手机号,帐号是能恢复的,但是微软客服告诉我如果能发送邮件有些间隔,就不那么容易封号。
Gmail 没有这个问题,因为 Google 大多会用技术解决问题,而微软通常选择让用户承担他们的技术负债。不只是使用 SMTP,使用其他功能比如转发等,同样会触发验证手机号的机制,这是为软自身的问题,和你的操作没关系。
非常感谢开发这个工具,请问这两个例子不能删除吗,我删了recipe_list.txt,就报错了。
另外,能否开发一个功能,就是不要推送,保留在云端,因为有些杂志文件有点大,推送可能失败。
例子可以删除,脚本文件直接删除即可,内置的需要清空 recipe_list.txt 里面的内容。不过考虑到在使用过程中有可能永远不需要内置 Recipe,我会更新一下让项目允许删除这个文件。
关于“保存在云端”,你想要把文件保存到什么地方?我想到的是,可能需要配合其他可以调用 API 的云存储服务(如 Google Drive)。已支持临时存放云端,请参考文中“下载文件”一节。我也有这种需求,有些报纸往往转换成epub后超过50m的邮箱附件上限,导致推送失败。
如果可以增加生成epub后,通过webdav协议上传epub到指定地址就更好了。
或者这个方案也可以考虑,压缩新闻报纸的jpg图片,如减少图片分辨率、降低jpg保存质量等方法,将epub文件整体压缩成50m以内再推送
在 Recipe 脚本里面添加一个属性
compress_news_images = True
可以有效的压缩图片大小。谢谢,但我使用的是calibre的内置recipe,请问如何设置压缩图片的参数开关呢?
可以去 Calibre 的 Recipe 脚本库下载下来,修改后再上传到项目里。
非常感谢,我就是从这个库里下载的,BBC和科学美国人是正常的,但是经济学人就不可以,the times mag看上去是文件尺寸的问题了。如果保存,是否可以就保存在github上吗,比如说保存一个月。
刚更新了一下项目,添加了临时保存电子书的功能,最长可存放 90 天,你可以在工作流详情中找到“Artifacts”下载打包好的文件。文中也更新了相关内容以供参考。
在Recipe中增加compress_news_images = True后,目前都正常了,我再学习一下,万分感谢。
下载文件这个功能,需要重新配置一次吗,之前的有配置过吗?另外,如果是双周刊,时间上怎么设?谢谢!
还有一个就是The Economist看上去很不稳定,其它几个都正常,不知道是什么原因。
如果你用的是 Fork 方式同步一下就可以,如果是用的是复制模板的方式,需要手动更新一下相关文件。如果想要半个月推送一次可以用
0 22 */14 * *
。如果脚本与预期不符,建议在本地测试没问题后再上传。谢谢这个项目,可以轻松愉快地推送外国报纸学英语了。
39
smtplib.SMTPAuthenticationError: (535, b’5.7.8 Username and Password not accepted. For more information, go to\n5.7.8 https://support.google.com/mail/?p=BadCredentials 6a1803df08f44-6ac162ef6d8sm21378366d6.103 – gsmtp’),部署时出现这个错误,请问该如何处理,我用的邮箱是我的gmail,为什么会提示邮箱和密码不对呢?
安全起见 Gmail 已经禁止直接将登录密码用于 SMTP 了。你要去 Google 账户的安全页面开启两步验证,然后生成一个 APP 密码。
有点没看明白,测试运行成功了。第三步是在哪操作?脚本放在哪?
你可以用 GitHub 的在线上传功能,即你的项目库文件列表右上角的【Add file → Upload files】,把脚本文件上传到项目根目录。也可以用 Git 工具提交。
推送的报刊杂志里分别有日刊、周刊、月刊,推送时间能分开设置吗?
可以创建多个项目,然后修改每个项目的定时。
很棒,已经部署成功,感谢作者。
有个期望不知道是否能实现,每个推送都相当于一本书,有什么办法能设置时间定时删除推送的新闻吗?否则越来越多,而且新闻也没有必要留存。
如果不想存档,登录亚马逊网站进入“管理内容和设备”的偏好页面,找到个人文档设置的存档功能并将其关闭即可(发送的邮件都会存到邮件的发件箱,也没必要存档)。不过 Kindle 没有定时删除电子书的功能,除非你的 Kindle 已经越狱,否则没有办法“自动”删除推送的电子书。
明白了,看来只能看完手动删除了。谢谢站长回复
想起了以前的狗耳朵
卧槽,这个网站不在了把,以前的老朋友了
有没有中文报纸的脚本啊?看到脚本全英文的,想看经观报有脚本吗?
内置的中文目前有以下几种。如果没有,并且你要看的内容是开放的,可以自己写脚本。
费了很大劲终于写个recipe,因为我要抓的网站大多数内容是用JS更新的,目前只能抓少许简讯数据,对JS更新的网站没什么好办法吧?还有recipe_list.txt要取消掉,只在calibre-news.yml找到一行done < recipe_list.txt,取消要注释掉多少代码能说下?
对,抓取 JS 生成的内容需要用额外的技术实现。不需要内置脚本,清空 recipe_list.txt 里面的内容即可。
感谢楼主思路,写 Recipe 后有点感想,对本文作些补充。
基本上网站分 HTML 和 JS 动态两种,HTML 难写点,而 JS 动态我碰到的直接是 JSON,反而更方便了,下面我提供下 JSON 解析思路,需要一些基础知识,不负责教会。
首先:Chrome 浏览器访问网站按 F12 键,右侧点【 Network → JS 】,按 F5 刷新一下找到 JSON 网址,用浏览器访问确认一下,基本上 JSON 是包含在
{}
中的数据结构,可以拷到 https://jsonlint.com 验证 JSON 数据结构。然后,编写 Recipe,大约有下面代码思路,不细写,能看懂就看懂
剩下的参考 Recipe 标准模板写,Python 注意代码缩进对齐,感觉比爬 HTML 代码更简洁。
随便用几个 JSON 就生成了 500 页电子书,有的看了。
感谢,成功部署。提一点建议:推送过来的文章,里面的字体不是很好看,影响体验….能不能优化一下。
电子书中的文本样式可通过 Recipe 脚本自定义。比如你想要设置字体,可修改脚本中的
extra_css
属性:其实通过 Recipe 脚本可以非常精细的按照自己的需要优化电子书的排版,具体可参考其 API 文档。同样,还是建议在本地测试好后在上传到项目中。
但是这个方法对内置脚本来说有点麻烦。为解决这个问题,项目会添加一个为所有脚本附加 CSS 的功能,和封面一样,可以把与 Recipe 同名的 CSS 文件放到 styles 文件夹中。
需要注意的是,通过 Send to Kindle 推送到 Kindle 的电子书好像不保留字体样式,你需要通过 Kindle 的字体设置功能才能更改字体。