用 Huginn 为高频 RSS 生成每日摘要并输出新的 RSS
2020-10-24我订阅了一些资讯类的 RSS,但是这种 RSS 通常更新频率都较高,好一点的一天十来篇文章,烦一点几十篇都有可能。但其实我订阅这些 RSS,只是想要对相关的领域(如时事、游戏)保持一定的关注度,更希望是定期(比如每天)整体扫一眼看有没有关心的内容,而不是在一天的各个时间段内连续不断地收到更新。
基于这个想法,我就想找个现成的工具为这种 RSS 生成一个每日摘要,但是只能找到从 RSS 生成摘要邮件的一些方法,而在邮件里看资讯并不是我习惯的方式,还是得自己动手啊。
思考尝试了下,这个问题有两种解决方法:
- 先用 Email Digest 工具(如IFTTT)将 RSS 转成摘要邮件,然后再将邮件转成 RSS,最后这一步可以用 Zapier;
- 直接上 Huginn,RSS Agent + Digest Agent + Delay Agent + Data Output Agent 一套搞定
第一个方案我虽然也能操作,但是始终要在邮箱里过一遍,我还是嫌麻烦,而 Huginn 是我非常熟悉的工具,于是就选用了第二套方案。花了几天验证效果,调整之后的 Scenario 如下图所示:
以机核的 RSS 为例,从上到下五个 Agent 分别是:
RSS Agent:负责监听原始的 RSS 源,接收更新生成 event
{ "expected_update_period_in_days": "5", "clean": "false", "url": "https://www.gcores.com/rss" }
Digest Aget:负责聚合一定时间 RSS Agent 输出的 event 产生一个新的 event,我设定为每天凌晨 1 点执行,这样能把前一天所有的 RSS 更新聚合起来
{ "message": "<ul>{% for event in events %}<li><a href={{ event.url }}>{{ event.title }}<\/a><\/li>{% endfor %}<\/ul>", "expected_receive_period_in_days": "2", "retained_events": "0" }
Event Formatting Agent:给 Digest Agent 产生的 event 添加一个标题
{ "instructions": { "content": "{{ message }}", "title": "机核{% assign current_date = 'now' | date: '%s' | minus: 86400 %} {{current_date | date: \"%Y-%m-%d\" }} 摘要" }, "matchers": [ ], "mode": "clean" }
Delay Agent:延迟一定时间后将 Event Formatting Agent 的输出再传递给最后的 Data Output Agent,我设置为延迟到早上六点
{ "expected_receive_period_in_days": "3", "max_events": "100", "keep": "newest", "max_emitted_events": "1" }
Data Output Agent:将最终结果输出为新的 RSS
{ "secrets": [ "gcore-daily" ], "expected_receive_period_in_days": 2, "template": { "title": "机核-每日摘要", "description": "机核每日消息汇总", "item": { "title": "{{ title }}", "description": "{{ content }}", "link": "https://www.gcores.com/" } }, "ns_media": "true" }
这样我每天早上六点就能收到一个前一天的汇总列表了,效果如下:
除了机核,当然还会有其他资讯类 RSS 想做这个转换,每次都在 Huginn 上手动创建一个个 agent 也不是个事,就顺手在我的个人脚本仓库里加了一个脚本,还是以机核为例,只要执行下面的命令就会生成一个 Huginn 的 Scenario 文件,然后到 Huginn 上直接导入就好了:
zs-rss gen-daily-scenario --feed-url "https://www.gcores.com/rss" -n 机核 -o gcore.json
目前制作了两个这样的每日摘要 RSS,分别是:
- 机核: https://feedpress.me/gcore-daily
- Engadget 中国版: https://feedpress.me/engadget-cn-daily
输出的 RSS 里只有原始 RSS 里文章的标题和链接,文章内容被我丢掉了,之后考虑改一下把内容加上(如果有的话)。