用 GitHub Actions 让 Calibre 定时推送新闻到 Kindle

“Calibre教程”相关阅读

给这篇文章写一条留言

提示:带 * 标记的是必填项。您填写的邮箱地址将会被保密。首次留言将会在通过人工审核后显示。如果是提出问题,请务必提供尽可能多信息,这有助于他人更好地理解你所提出的问题。

小伙伴们写下了 37 条留言

  1. 请问您有意愿分享一下值得推荐的高质量订阅源吗?Calibre项目内置的订阅源有点太多太繁杂了,不知道怎么去选择。

  2. 用smtp.gmail.com,Action运行成功后被Amazon要求二次确认了

    Verify your Send to Kindle document request

    Dear Customer,

    We received a request to deliver a document to your Kindle account at 03:14 AM on Fri, Oct 25, 2024 GMT.

    Click below within 48 hours to verify this request.

    Verify Request

    Why did I receive this email?

    Amazon takes your account security seriously. To help ensure you only receive documents from sources you trust, we have added an extra layer of protection to your account. Learn more.

    Prefer to skip this verification step next time?

    You may need to edit one or more of your Send-to-Kindle email addresses by visiting your Preferences in Manage Your Content and Devices. After editing, be sure to notify your approved senders to ensure uninterrupted delivery of your documents.

    To learn more, please visit our help page. By downloading or using Send to Kindle, you agree to the terms here.

    Regards,
    Amazon Kindle Support

    请问这种情况应该怎么解决啊?

    • 这个问题和用 SMTP 发邮件没太大关系,而是 Kindle 邮箱自身的问题。亚马逊在邮件中给出了解决方法:

      Prefer to skip this verification step next time?

      You may need to edit one or more of your Send-to-Kindle email addresses by visiting your Preferences in Manage Your Content and Devices. After editing, be sure to notify your approved senders to ensure uninterrupted delivery of your documents.

      想要跳过该验证,需要去亚马逊官网“管理你的内容和设备”页面的“偏好设置”编辑 Send-to-Kindle 电子邮箱地址,然后确保发送邮箱地址添加到了信任邮箱列表。

      你可以先修改 Kindle 邮箱,然后手动用 Gmail 推送测试,没问题再放到 Actions 里用。

      • 嗯嗯,谢谢。我发现问题是因为kindle邮箱和gmail邮箱的前缀名恰好一样,而亚马逊不允许这种情况

  3. 这个方案试用了几天,因为发送邮件太快而且每天都是同一个收件人,导致我微软帐号被当成垃圾邮件封了(唉)。不知道 Gmail 会不会有这种情况。
    实际上只要验证手机号,帐号是能恢复的,但是微软客服告诉我如果能发送邮件有些间隔,就不那么容易封号。

    • Gmail 没有这个问题,因为 Google 大多会用技术解决问题,而微软通常选择让用户承担他们的技术负债。不只是使用 SMTP,使用其他功能比如转发等,同样会触发验证手机号的机制,这是为软自身的问题,和你的操作没关系。

  4. 非常感谢开发这个工具,请问这两个例子不能删除吗,我删了recipe_list.txt,就报错了。
    另外,能否开发一个功能,就是不要推送,保留在云端,因为有些杂志文件有点大,推送可能失败。

    • 例子可以删除,脚本文件直接删除即可,内置的需要清空 recipe_list.txt 里面的内容。不过考虑到在使用过程中有可能永远不需要内置 Recipe,我会更新一下让项目允许删除这个文件。

      关于“保存在云端”,你想要把文件保存到什么地方?我想到的是,可能需要配合其他可以调用 API 的云存储服务(如 Google Drive)。已支持临时存放云端,请参考文中“下载文件”一节。

      • 我也有这种需求,有些报纸往往转换成epub后超过50m的邮箱附件上限,导致推送失败。
        如果可以增加生成epub后,通过webdav协议上传epub到指定地址就更好了。

      • 或者这个方案也可以考虑,压缩新闻报纸的jpg图片,如减少图片分辨率、降低jpg保存质量等方法,将epub文件整体压缩成50m以内再推送

          • 谢谢,但我使用的是calibre的内置recipe,请问如何设置压缩图片的参数开关呢?

              • 非常感谢,我就是从这个库里下载的,BBC和科学美国人是正常的,但是经济学人就不可以,the times mag看上去是文件尺寸的问题了。如果保存,是否可以就保存在github上吗,比如说保存一个月。

                • 刚更新了一下项目,添加了临时保存电子书的功能,最长可存放 90 天,你可以在工作流详情中找到“Artifacts”下载打包好的文件。文中也更新了相关内容以供参考。

                  • 在Recipe中增加compress_news_images = True后,目前都正常了,我再学习一下,万分感谢。

      • 下载文件这个功能,需要重新配置一次吗,之前的有配置过吗?另外,如果是双周刊,时间上怎么设?谢谢!
        还有一个就是The Economist看上去很不稳定,其它几个都正常,不知道是什么原因。

        • 如果你用的是 Fork 方式同步一下就可以,如果是用的是复制模板的方式,需要手动更新一下相关文件。如果想要半个月推送一次可以用 0 22 */14 * *。如果脚本与预期不符,建议在本地测试没问题后再上传。

  5. 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,为什么会提示邮箱和密码不对呢?

    • 你可以用 GitHub 的在线上传功能,即你的项目库文件列表右上角的【Add file → Upload files】,把脚本文件上传到项目根目录。也可以用 Git 工具提交。

  6. 很棒,已经部署成功,感谢作者。
    有个期望不知道是否能实现,每个推送都相当于一本书,有什么办法能设置时间定时删除推送的新闻吗?否则越来越多,而且新闻也没有必要留存。

    • 如果不想存档,登录亚马逊网站进入“管理内容和设备”的偏好页面,找到个人文档设置的存档功能并将其关闭即可(发送的邮件都会存到邮件的发件箱,也没必要存档)。不过 Kindle 没有定时删除电子书的功能,除非你的 Kindle 已经越狱,否则没有办法“自动”删除推送的电子书。

  7. 有没有中文报纸的脚本啊?看到脚本全英文的,想看经观报有脚本吗?

    • 内置的中文目前有以下几种。如果没有,并且你要看的内容是开放的,可以自己写脚本。

      • 中時電子報
      • 人民日报
      • 日本経済新聞(朝刊・夕刊)
      • 日経新聞電子版(Free, MAX)
      • 日経新聞電子版(MAX)
      • 星島日報 (香港)
      • 時事通信
      • 毎日新聞
      • 毎日新聞(Science)
      • 河北新報
      • 联合早报网 zaobao.com
      • 聯合新聞網
      • 自由電子報
      • 蘋果日報 (台灣)
      • 蘋果日報 (香港)
      • 费了很大劲终于写个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,大约有下面代码思路,不细写,能看懂就看懂

      import urllib
      import json
      
      url="your json address"
      news = json.loads(urllib.urlopen(url).read())['data']  # 我示例网站把数据组放在data名下,可在jsonlint中看出数据结构名称
      for new in news:
      url=new['m_url']  # jsonlint中找出URL地址
      title=new['title']  # jsonlint中找出新闻标题

      剩下的参考 Recipe 标准模板写,Python 注意代码缩进对齐,感觉比爬 HTML 代码更简洁。

      随便用几个 JSON 就生成了 500 页电子书,有的看了。

  8. 感谢,成功部署。提一点建议:推送过来的文章,里面的字体不是很好看,影响体验….能不能优化一下。

    • 电子书中的文本样式可通过 Recipe 脚本自定义。比如你想要设置字体,可修改脚本中的 extra_css 属性:

      extra_css = 'p { font-family: serif; }'

      其实通过 Recipe 脚本可以非常精细的按照自己的需要优化电子书的排版,具体可参考其 API 文档。同样,还是建议在本地测试好后在上传到项目中。

      但是这个方法对内置脚本来说有点麻烦。为解决这个问题,项目会添加一个为所有脚本附加 CSS 的功能,和封面一样,可以把与 Recipe 同名的 CSS 文件放到 styles 文件夹中。

      需要注意的是,通过 Send to Kindle 推送到 Kindle 的电子书好像不保留字体样式,你需要通过 Kindle 的字体设置功能才能更改字体。