🔍 如何让你的 AI,帮你盯着热点新闻
你有没有遇到过——让 AI 去看看某个网站发了什么,结果对方根本「不给看」。其实那些网站给机器留了条专用通道,叫 RSS。这篇拆解一份 RSS 阅读技能,看看它是怎么走这条通道把资讯拿回来的,看完摘要就能让 AI 帮你打开原文。
你有没有想过,让 AI 帮你盯着关注的那些网站,有新内容了就把摘要整理好放在你面前——你跟它说一句”打开第三篇”,浏览器就自动弹出来,直接跳到原文。 也不用每天自己去刷,微信里就能收到定时推送的最新资讯,通勤路上扫一眼,到了工位再挑感兴趣的让 AI 打开细读。
你可能会想:这能行吗?AI 访问网页经常被反爬虫拦得死死的。
确实,直接去爬基本没戏。但突破口在于:大部分网站同时提供 RSS 订阅链接——一种专门给机器读的、结构化的信息接口,几乎不会被反爬机制拦截。
所以我写了一份 RSS 阅读技能,让 AI 不走正门爬网页,而是通过 RSS 这条”官方通道”拿信息。这篇就来拆解这份技能——不只讲它长什么样,更想聊聊每个设计决策背后踩了什么坑、解决了什么问题。
📚 什么是技能?(简短回顾)
技能(Skill)就是给 AI 配的一本专项操作手册——规定了遇到特定任务时该怎么思考、用什么工具、遵守哪些规则。
如果你对技能的概念还不太熟悉,可以先看看我之前写的《别再复制粘贴提示词了!AI Agent Skill 到底是什么?》。
RSS Reader 技能就是专门处理信息订阅那本手册。 只要你跟 Claude 提到”获取 RSS”“看最新资讯”“最近有什么更新”之类的需求,它就会翻开这本手册,按上面的流程来做事。
🗂️ 这个技能长什么样
RSS Reader 非常精简——就三个文件:
1
2
3
4
rss-reader/
├── SKILL.md ← 主入口,Claude 第一个读的文件
├── reader.py ← 核心脚本,负责抓取和过滤
└── sources.md ← 预设的订阅源清单
没有拆包打包的流水线、没有复杂的并行处理逻辑。简单本身也是设计的一部分:信息获取这件事不需要花哨的架构,关键在于怎么把”稳定抓取、正确过滤、清晰呈现”这三件事做扎实。
📋 SKILL.md:总控文件写了什么
SKILL.md 是整个技能的指挥中心。它不是代码,而是一份写给 AI 看的说明书——规定了遇到什么情况该怎么判断、该跑哪个命令、有哪些坑要躲。
路由判断:先搞清楚用户要什么
手册开篇就是一张决策表:
- 用户给了一个 URL → 直接去抓,不用多想
- 用户给了一个名字(比如”少数派”“Hacker News”)→ 去
sources.md里查对应地址 - 用户说“看我所有订阅” → 把
sources.md里所有源都跑一遍
信息获取本质上只有一种任务——拿数据、过滤、输出。不需要分两条完全不同的流水线。
参数系统:像给助理下指令一样精确
手册里列了六个参数,每个都是解决一个具体需求:
| 你想干什么 | 用什么参数 |
|---|---|
| 只看最近三天的 | --days 3 |
| 只看最近 12 小时的 | --hours 12 |
| 只要最新 5 篇,不管时间 | --top 5 |
| 每个源最多取几条 | --max N |
| 只要标题和链接,不要摘要 | --no-content |
| 输出给程序用的 JSON 格式 | --json |
打个比方:这就跟你给助理下指令差不多——”帮我把最近三天所有科技博客的新文章找出来,每个来源最多 5 篇,只要标题和链接就行。”参数的组合,就是在翻译这样的自然语言意图。
错误处理:一个源挂了,不影响全局
手册里有专门一节讲异常处理,规矩写得很具体:
单个源抓取失败,不影响其他源继续跑;默认超时 15 秒;失败了就标
[Fetch failed]写上原因,继续处理下一个。
这个设计跟现实里收集信息一模一样——某个网站打不开了,你不会因此放下手里所有事,而是标记一下”这个暂时看不了”,接着往下走。稳健比完美重要,这在信息聚合场景里尤其如此。
🐍 reader.py:藏在脚本里的设计思考
这是整个技能里唯一一份代码(259 行),用的是 Python。但比代码本身更值得聊的,是它背后几个设计细节——每一个都是踩过坑之后补上去的。
Windows 兼容:输出不乱码的第一道防线
脚本开头干的第一件事,不是抓数据,是检查系统平台:
1
2
if sys.platform == "win32":
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8", errors="replace")
Windows 的命令行默认编码不能正确显示中文和特殊字符。如果不做这一步,RSS 源里的中文标题、em dash、特殊符号输出之后全是乱码。这个细节普通用户完全不会注意到——但没有它,整个技能的实用性就大打折扣。
把踩过的坑提前写进去,让 AI 不会在同一个地方摔倒。
编码检测:不同服务器的字符集不一样
抓取 RSS 源时,服务器返回的内容可能用各种编码——UTF-8、ISO-8859-1、GB2312,甚至不声明。脚本的做法是从 HTTP 响应头的 Content-Type 里检测 charset,检测不到就默认 UTF-8,解码时用 errors="replace" 兜底——能读多少算多少,至少不崩。
类比一下:这就像收到一份外文材料,先看看封面写的什么语言,再选对应的词典来翻译。如果封面没写,就当英文处理,遇到不认识的字先跳过。
摘要清理:从 HTML 到干净文本
RSS 源返回的摘要里经常夹带 HTML 标签、多余空白、大段无关内容。脚本的处理流水线是:
- 正则去掉所有 HTML 标签
- 把连续空白合并成单个空格
- 超过 200 个字符就截断,加省略号
这跟助理帮你整理信息的方式一样——不会把整篇文章复制过来,而是提炼出最核心的一段话。
时区归一化:统一用 UTC 对表
这是过滤逻辑里最容易出 bug 的一环。不同 RSS 源的时区不统一——有的用 UTC,有的用本地时间,有的干脆不写时区。如果你直接比较时间戳,一个北京时间 10 点的文章和一个 UTC 10 点的文章,看起来”一样”,实际差了 8 个小时。
脚本的做法是:把所有日期都统一转成 UTC 的 datetime 对象,然后再比较。没日期的条目排在最末尾,不会被过滤掉也不会排错位置。
两种输出格式:给人看的 vs 给程序看的
脚本支持 Markdown 和 JSON 两种输出。Markdown 模式层级清晰、带格式、适合直接阅读;JSON 模式结构化、可被程序消费、适合自动化工作流。
这个设计意味着 RSS Reader 不只是一个人工查询的工具——它同时也是一个可以被其他脚本调用的数据管道。 你可以在自动化流程里用它来采集信息,再用其他工具做二次处理。
📡 sources.md:订阅源的”通讯录”
这个文件看起来只是一份表格,但它的设计里有两点值得注意。
不止给 URL,还给了 RSSHub 路由模板
sources.md 预设了 20 多个源,按 8 个类别组织——AI 与机器学习、编程、安全、中文科技媒体、新闻、设计、随笔,还有一个专门的”RSSHub 动态路由”板块。
这个 RSSHub 板块是关键。很多平台(Bilibili、微博、Telegram)没有原生 RSS,但通过 RSSHub 可以动态生成订阅链接。手册里不只列了几个固定 URL,还给了路由模板:
1
2
3
4
5
6
7
8
# GitHub releases
https://rsshub.app/github/releases/<owner>/<repo>
# Bilibili 用户视频
https://rsshub.app/bilibili/user/video/<uid>
# 微博用户
https://rsshub.app/weibo/user/<uid>
用户照着模板替换掉 <owner>、<uid> 这些占位符,就能生成自己想要的订阅源。这相当于不仅给了菜单,还给了菜谱——你可以按自己的口味做调整。
“入职测试”:新源必须先验证再入库
手册里有一条硬性规定:添加新源之前,必须先跑一次测试:
1
python reader.py <新URL> --top 1
能抓到内容,才追加到 sources.md 对应的分类下面。抓不到,就告诉用户这个 URL 不是有效的 RSS/Atom 源。
这个规矩防止了”僵尸源”混进列表。 你关注的信息源列表跟代码库一样——如果不及时清理和维护,慢慢就会变成一锅谁也分不清哪些还活着的乱炖。与其事后清理,不如在入口就把关。
🔄 三种典型使用场景
前面拆完了每个模块干什么、为什么这样设计,这里用三个具体例子把它们串起来,看看实际使用中的完整流转。
场景一:定向查询
“帮我看看最近 3 天少数派和 Hacker News 有什么新内容”
Claude 翻开 SKILL.md → 查 sources.md 找到两个源对应的 URL → 执行 reader.py <URL1> <URL2> --days 3 → Markdown 格式输出,按源分组、按时间排列,每个条目带标题、链接、200 字摘要。
场景二:全量巡检
“把我所有订阅源的最新 5 篇都拉出来”
Claude 遍历 sources.md 的所有 URL → 对每个源执行 --top 5 → 聚合输出。中途某个源挂了也不影响——标一个 [Fetch failed],继续跑下一个。
场景三:新增订阅
“把阮一峰的博客加到我的订阅列表里”
Claude 先用 --top 1 测试这个 URL 能不能抓到内容 → 成功了,追加到 sources.md 的对应分类下;失败了,告诉你”这个 URL 不是有效的 RSS 源”。
不止于看:看完摘要,直接打开原文
上面的三个场景有一个共同的”下一步”:看到摘要里某篇文章感兴趣,想读全文。
这时候不用自己去复制链接、打开浏览器、粘贴地址——直接跟 AI 说”帮我把第 3 篇打开”,它就会调起系统浏览器,直接跳转到那篇文章的页面。
这个功能看似小,但它补上了信息获取链条里最后一块拼图:
RSS 获取摘要 → 筛选感兴趣的 → 一键打开原文
整个过程你始终在对话界面里做决策,AI 负责跑腿。而且用浏览器打开比让 AI 直接去抓取页面内容要可靠得多——不存在反爬拦截的问题。
💡 写到最后
回头看,这篇文章想说的其实就一件事:
RSS Reader 技能教给 AI 的,不是”怎么解析 RSS”——feedparser 库谁都会用,犯不着专门写一份操作手册。真正有价值的是那一整套”怎么做才算靠谱”的规矩。
乱码了怎么办?时区不一致怎么比?摘要太长怎么截?一个源挂了要不要停下来?新加源怎么验证它是不是活的?这些问题的答案没有一个写在 feedparser 的文档里——它们来自实际使用中一次次踩坑之后补上去的经验。
工具能不能做出专业的东西,关键不在于它”聪不聪明”,而在于有没有人把经验变成它做事时会遵守的规矩。
如果需要这篇文章里拆解的 RSS Reader 技能文件,在公众号后台回复 rss-reader 即可获取。

