首页
/ 用 AutoGPT 的 Read RSS Feed 块将 RSS/Atom 订阅流接入自动化工作流:参数解析、轮询机制与源码级实现详解

用 AutoGPT 的 Read RSS Feed 块将 RSS/Atom 订阅流接入自动化工作流:参数解析、轮询机制与源码级实现详解

2026-09-07 11:46:57作者:魏侃纯Zoe

Read RSS Feed 是 AutoGPT Platform(autogpt_platform)内置的一个 Input 类数据块,用于从任意 RSS 订阅地址拉取条目、按时间窗口过滤并按条/批量输出。本文结合其官方文档(rss.md)与后端实现(rss.py)展开,读完你将掌握该块的每个输入输出字段、默认值与运行语义,能把它用作"新闻/博客/行业资讯监听触发器",并理解它与下游 AI 处理块如何串成可复用的自动化 Agent。

一、块是什么:一句话定义与平台定位

按官方文档的定义,Read RSS Feed 是"A block that retrieves and processes entries from an RSS feed",即:读取并处理来自 RSS feed 的条目。

在 AutoGPT Platform 的块生态中,它通过 categories={BlockCategory.INPUT}(见 rss.py)被归入 Input 类别——这类块负责"把外部世界的数据送入 Agent 图",与 Output(向外部输出)、AI、Logic、COMMUNICATION 等类别并列(类别枚举定义见 _base.py)。因此,当你需要"让 Agent 感知外部订阅源的实时变化"时,它会出现在 Builder 画布的输入类块面板中。

二、块做什么:功能目标

原文档给出了三条功能描述,可归纳为:

  1. 读取:根据调用者提供的 RSS URL 获取 feed 内容;
  2. 过滤:仅保留发布时间落在"指定回看时间段"内的条目;
  3. 逐条输出:把符合条件的每个条目逐个送出,供下游节点即到即处理。

也就是说,它把一个"时刻变化的订阅流"折叠成一个可编程的数据源:时间窗口决定了"我要多新的内容",逐条输出决定了"我可以对每一条新内容单独做处理"。该块同时支持 RSS 与 Atom 两类标准格式(代码基于 feedparser 统一解析,见下文),源码描述与扩展文档(misc.md#read-rss-feed)都明确了这一点。

三、它如何工作:从 URL 到结构化输出的调用链

原文档描述了宏观流程,而源码给出了精确细节。整个块的核心实现在 rss.py 的两个方法中:

1)抓取与解析阶段(静态异步方法 parse_feed

  • 使用平台封装的 Requests(raise_for_status=True).get(url) 异步下载 feed 内容;
  • 内存保护:设定 MAX_FEED_SIZE = 10 * 1024 * 1024(10MB)上限,先后校验响应头 Content-Length 与实际下载内容长度,超限直接抛 ValueError
  • 解析交给 feedparser.parse(该库内置针对 XML 实体攻击的防护,代码注释特别说明这是一项安全修复);
  • 一旦网络或解析异常,块不抛错而是记录 warning 日志并返回空 feed{"entries": []}),保证上游图不因单个数据源抖动而崩溃。

2)过滤与输出阶段(异步生成器 run

start_time = now(UTC) − time_period 分钟
循环:
    解析 feed
    对每个条目:若 pub_date > start_time,则构建 RSSEntry 并 yield(单条端口)
    最后 yield 全部命中条目组成的列表(批量端口)
    sleep(polling_rate) 后进入下一轮

值得注意的是运行语义上的几个细节,它们会直接影响你的工作流设计:

  • 时间窗基准start_time 在块启动时一次性计算,time_period 的语义是"相对块运行开始时刻往前回看 N 分钟"(例如设为 60,即回看最近一小时)。如果你在真实工程中用 1440(默认值),意味着获取最近 24 小时的条目。
  • 轮询与持续运行的配合:默认 run_continuously=True,配合 polling_rate 可让块无限轮询,实现"订阅源监听";当关闭持续运行开关时,循环体只执行一轮即结束。
  • 单次运行末尾也会 sleep:即使 run_continuously=False,循环体尾部仍会执行一次 asyncio.sleep(polling_rate),然后才因循环条件退出——从源码结构看,这意味着单轮执行的节点会额外延迟一个轮询周期才完成,涉及链式依赖时建议关注此延迟。
  • 可能重复输出:持续轮询时,只要条目仍落在时间窗口内,每一轮都会把它再次 yield 出去。代码本身不做"去重/游标"追踪,因此若用作触发器且不允许重复消费,需要在图里额外做去重(例如与记忆/存储块配合记录已见条目标识)。

四、输入参数详解(含默认值与约束)

原文档给出的 4 个输入,结合 rss.py 的字段声明与 misc.md#read-rss-feed 的类型标注,完整清单如下:

输入字段 类型 是否必填 默认值 / 占位提示 说明
rss_url str 占位符 https://example.com/rss 要读取的 RSS feed 完整 URL
time_period int 默认 1440(分钟),占位符同为 1440 回看时间窗:只输出发布时刻晚于"块运行时刻减去该分钟数"的条目;设 60 即最近一小时
polling_rate int 占位符 300(秒) 每两轮抓取之间的等待秒数;持续模式下决定了"探测新条目的频率"
run_continuously bool 默认 true true 表示无限循环轮询;false 表示只抓取一次

工程上的配置建议:

  • 持续监听模式(默认开启)下,polling_rate 至少要大于上游 feed 的更新频率,避免对源站造成过密请求;5 分钟(300 秒)是比较礼貌的起点,官方占位符也以 300 为例。
  • 只跑一次模式:适合"手动/定时执行一次拉取并归档"的场景,例如由调度器每 6 小时触发一次,time_period 设为 360。
  • rss_url 指向的地址必须能被后端服务直接访问;若目标源要求鉴权或位于内网,需要先确认平台网络策略。

五、输出数据模型与两种输出端口

块有两个输出端口,对应源码中 Output 声明的两个字段(rss.py):

输出端口 类型 语义
entry RSSEntry 逐条输出:每个命中的条目触发一次输出,适合链到"逐条处理"的下游块
entries list[RSSEntry] 整批输出:本轮所有命中条目作为列表一次性送出,适合批量归档/分析

RSSEntry 是与该块配套的 Pydantic 模型(rss.py),共 6 个字段,正好对应原文档 Outputs 表中列出的条目信息:

RSSEntry 字段 类型 来源 说明
title str 条目 title 标题 / 名称
link str 条目 link 原文所在的完整网址
description str 条目的 summary(缺失时为 "" 摘要或节选
pub_date datetime published_parsed 前 6 个元素,按 UTC 构造 发布时间
author str 条目的 author(缺失时为 "" 作者
categories list[str] 条目 tags 列表中的每个 term 主题 / 分类标签

两个字段级细节值得留意,它们会在你往下游接线时体现价值:

  • 空值安全descriptionauthorentry.get(key, "") 兜底为字符串;categories 在无标签时是空列表。因此下游无需再处理"字段缺失"异常,但要注意 description/author 可能为空串、categories 可能为空数组。
  • 时区统一pub_date 统一按 timezone.utc 构造,跨时区比较可直接使用。

六、典型实战场景与接线建议

原文档以"新闻聚合器"为示例,扩展文档(misc.md#read-rss-feed)进一步补全了三种代表性用法,本文一并汇总:

1. 新闻 / 行业资讯监控 持续监听多个新闻源的 RSS,对每条 entry 交给下游 AI 摘要块做提炼、按 categories 分类、按 pub_date 排序后展示。原文档的经典用例:新闻聚合应用可用多个该块同时监听不同来源,把最新条目按主题归类并按发布时间排序呈现给用户。

2. 内容聚合与 Newsletter 把多个订阅源(如技术博客、竞品公告)的输出汇聚成一个待处理队列,驱动摘要、翻译与排版发布链路,产出每日 digest。此时更推荐接 entries 批量端口做整体处理。

3. 博客 / 竞品更新触发器 持续轮询某个站点的 feed,一旦出现新的 entry 就触发下游"分析文章→写入总结→通知"的链路。此时应接 entry 单条端口,并如前文所述自行处理重复条目(因为同一篇文章在时间窗口内会跨多轮重复输出)。

七、为什么这样设计:生成器与逐条语义的源码依据

若你打开 rss.py 观察 run 方法,会发现它的签名是 async def run(...) -> BlockOutput,内部大量使用 yield。这意味着该块是异步生成器驱动的流式数据源:符合条件的条目在解析完成后立即 yield 出去,不必等整个 feed 处理完,后续节点即可并行开工;而每轮末尾统一 yield "entries", all_entries 提供批量视角,一个块同时覆盖"流式逐条"与"集合批量"两种消费模式。

这种"先逐条、后整批"的输出顺序在块内预置了测试样例作为行为契约:test_input 会注入一个示例 URL、极大时间窗(10,000,000 分钟)与 1 秒轮询并关闭持续运行,期望 test_output 依次产出 1 个 entry 和 1 个 entries(见 rss.py)。这意味着你在 Builder 中拖入该块后可以立即用自带测试数据验证接线,再替换成真实订阅源。

八、使用它构建 Agent 的简明流程

  1. 在 AutoGPT Platform Builder 中新建 Agent,从输入/数据源类面板拖入 Read RSS Feed 块;
  2. 将真实订阅源 URL 填入 rss_url(可用 rss.md 描述的公开新闻 feed 试跑);
  3. 按需求设定 time_period(默认 1440 即 24 小时);单次触发可关掉 run_continuously,持续监听则保留开启并设好 polling_rate
  4. entryentries 连接到下游处理节点(AI 摘要、文本分类、通知、HTTP 推送等);
  5. 运行验证:检查输出的 title/link/pub_date 是否符合预期,再按需增加去重与错误分支。

参考:本文涉及的仓库资料

登录后查看全文
热门项目推荐
相关项目推荐