返回博客

AstrBot / RSS / Automation

RSS Forwarder 的 cron 聚合推送整理

一次围绕 cron 触发、批量聚合、动态标题、本地图卡和降级摘要的整理记录。

Synthetic RSS digest card with grouped entries and local media placeholders.

RSS Forwarder 上周已经把日报图卡和普通媒体发送稳定下来。本周的重点转向另一类阅读场景:不是每条 RSS 更新都立即提醒,而是在固定时间把一批新内容整理成一条可浏览的聚合消息。

这类功能适合个人阅读、兴趣频道和低打扰的信息流。它保留 RSS 的自动收集能力,同时把发送节奏从“源更新时立即出现”改为“按时间窗口集中整理”。

项目概览

插件公开维护在 RhoninSeiei/astrbot_plugin_rss_forwarder。当前配置仍以 feedstargetsjobsdaily_digests 为核心,但 jobs 现在可以使用 5 段 cron 表达式作为触发方式。

代码结构中,scheduler.py 负责解析 cron 并计算下一次触发时间,dispatcher.py 保留目标级确认和发送逻辑,pipeline.py 生成聚合标题与分段摘要,aggregate_card_image.py 使用本地 Pillow 生成聚合图卡。测试集中在配置解析、cron 调度、LLM JSON 解析、降级摘要和图卡字段保留。

Cron 触发

jobs[].cron 现在正式支持 分 时 日 月 周 五段表达式,例如 0 9,18 * * * 表示每天 09:00 和 18:00 触发。同一个任务同时配置 croninterval_seconds 时,调度循环优先按 cron 触发,间隔字段只作为兼容配置保留。

这让同一个插件既能处理高频提醒,也能处理固定时间的摘要整理。对于个人阅读来说,早晚各一次的聚合消息通常比几十条即时推送更容易处理。

聚合推送

新增的 jobs[].aggregate_enabled 会让轮询任务把本批次通过过滤的新条目交给聚合流程,而不是逐条发送。进入聚合前,条目仍会经过历史过滤、精确去重、目标级确认和语义重复判定。

聚合模型需要返回一个短标题和若干段落摘要。提示词会要求页眉标题保持短而清楚,段落标题与摘要使用简体中文,并尽量避免标题中出现冒号式的冗余前缀。这样生成内容更接近卡片标题,而不是模型的分析报告。

如果 LLM 不可用、超时或返回无效 JSON,插件会回退为本地编号列表。后续补丁还让降级摘要可以先走翻译增强,避免聚合失败时突然混回原文标题和原文摘要。

聚合图卡

jobs[].aggregate_render_mode=image 会使用本地 Pillow 生成 PNG 图卡。图卡保留标题、来源摘要、条目数量、分段标题和摘要。开启 aggregate_include_images 时,插件会尝试把条目配图缓存到本地,再渲染进对应段落。

这套图卡和日报图卡的价值相似:它把多条内容压缩成一个可浏览对象。不同之处在于,日报偏向一天一份的窗口整理,cron 聚合则更适合“每几小时看一次”的节奏。

维护心得

这次更新把 RSS Forwarder 从“单条推送工具”进一步推向“轻量信息整理工具”。cron 负责节奏,聚合负责表达,目标级确认负责多目标稳定性,本地图卡负责展示形态。

对于个人兴趣记录站来说,这类改动值得单独记录。它不是简单增加一个配置项,而是把源读取、去重、摘要、图像渲染和发送确认重新组合成更适合日常阅读的使用方式。