ZMonster's Blog 巧者劳而智者忧,无能者无所求,饱食而遨游,泛若不系之舟

用 Huginn 为高频 RSS 生成每日摘要并输出新的 RSS

我订阅了一些资讯类的 RSS,但是这种 RSS 通常更新频率都较高,好一点的一天十来篇文章,烦一点几十篇都有可能。但其实我订阅这些 RSS,只是想要对相关的领域(如时事、游戏)保持一定的关注度,更希望是定期(比如每天)整体扫一眼看有没有关心的内容,而不是在一天的各个时间段内连续不断地收到更新。

基于这个想法,我就想找个现成的工具为这种 RSS 生成一个每日摘要,但是只能找到从 RSS 生成摘要邮件的一些方法,而在邮件里看资讯并不是我习惯的方式,还是得自己动手啊。

思考尝试了下,这个问题有两种解决方法:

  1. 先用 Email Digest 工具(如IFTTT)将 RSS 转成摘要邮件,然后再将邮件转成 RSS,最后这一步可以用 Zapier
  2. 直接上 Huginn,RSS Agent + Digest Agent + Delay Agent + Data Output Agent 一套搞定

第一个方案我虽然也能操作,但是始终要在邮箱里过一遍,我还是嫌麻烦,而 Huginn 是我非常熟悉的工具,于是就选用了第二套方案。花了几天验证效果,调整之后的 Scenario 如下图所示:

digest-scenario.png

机核的 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"
    }
    

这样我每天早上六点就能收到一个前一天的汇总列表了,效果如下:

digest-rss-item.png

除了机核,当然还会有其他资讯类 RSS 想做这个转换,每次都在 Huginn 上手动创建一个个 agent 也不是个事,就顺手在我的个人脚本仓库里加了一个脚本,还是以机核为例,只要执行下面的命令就会生成一个 Huginn 的 Scenario 文件,然后到 Huginn 上直接导入就好了:

zs-rss gen-daily-scenario --feed-url "https://www.gcores.com/rss" -n 机核 -o gcore.json

目前制作了两个这样的每日摘要 RSS,分别是:

输出的 RSS 里只有原始 RSS 里文章的标题和链接,文章内容被我丢掉了,之后考虑改一下把内容加上(如果有的话)。