1. 为什么我要给 OpenClaw 写一个 RSS 智能日报 Skill
如果你用过 OpenClaw 一段时间,大概率经历过这个循环:让它帮你干一件事,效果不错;换个说法再让它干,步骤完全不一样,甚至直接崩掉。这不是模型变笨了,而是它每次都在“即兴发挥”。Skill 就是来解决这个问题的——它把一套固定的操作流程写成 Markdown 指令,让 Agent 每次都按同样的步骤执行。
我这次要做的,是一个 RSS 智能日报 Skill:从配置好的 RSS 源里拉取最近 24 小时的文章,用模型给每篇生成一句话摘要,按分类整理成 Markdown 日报,保存到本地目录。适合谁?适合每天要刷十几个技术博客、又不想一个个点开的人;也适合想学 OpenClaw Skill 开发但不知道从哪下手的同学。
整篇会按“骨架 → 配置 → 触发 → 排障 → 发布”的顺序走,每一步都有可复制的代码和配置。你跟着做,最后能跑通一个真正能用的自定义 Skill。
2. 前置准备:TaoToken 统一 Key 与 API 通道
在写 Skill 之前,先把模型调用这条链路打通。OpenClaw 的 Skill 本身不绑定具体模型供应商,但摘要生成这一步需要调用大模型。我用的方式是 TaoToken 统一 Key,一个 Key 走通所有模型调用,省得在多个平台之间来回切换。
TaoToken 的定位是统一 API 通道,官网在 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 入口是 https://taotoken.net/api 。你需要先去控制台创建一个 API Key,地址是 https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite ,创建完在 API Keys 页面复制出来,地址是 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite 。
拿到 Key 之后,把它写进 OpenClaw 的 settings.json 或者环境变量里。我推荐用环境变量注入,不要硬编码在 SKILL.md 里。具体配置片段在下一节展开。
如果你还没决定用哪个模型,可以先去模型对话页面试一下效果,地址是 https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_content=models&utm_campaign=rewrite ,确认摘要质量符合预期再往下走。
3. 可复制配置:SKILL.md 骨架与 settings.json 接入
3.1 目录结构
先在 managed skills 目录下创建 Skill 文件夹:
mkdir -p ~/.openclaw/skills/rss-daily-digest/{scripts,references,assets} cd ~/.openclaw/skills/rss-daily-digest目录约定是这样的:SKILL.md 是唯一必需的文件,references/ 放 Agent 按需读取的文档,scripts/ 放可执行脚本(执行而不读入上下文,省 Token),assets/ 放输出用的模板文件。
3.2 SKILL.md 完整骨架
--- name: rss-daily-digest description: >- Fetch RSS feeds, parse articles, generate AI summaries, and compile a daily digest report in Markdown. Use when user asks for RSS summary, news digest, daily briefing, feed reader, or tech news roundup. version: 1.0.0 homepage: https://github.com/yourname/rss-daily-digest user-invocable: true metadata: {"openclaw":{"emoji":"📰","requires":{"bins":["python3","curl"],"env":["RSS_FEEDS_CONFIG"]},"primaryEnv":"RSS_FEEDS_CONFIG"}} --- # RSS Daily Digest Generate a structured daily news digest from configured RSS feeds. ## Prerequisites - Python 3 with `feedparser` module - Feed sources configured in `{baseDir}/references/feed-sources.md` - Output directory: `~/openclaw-output/digests/` ## Workflow When the user asks for a daily digest or RSS summary: 1. **Read feed sources**: Read `{baseDir}/references/feed-sources.md` to get the list of RSS feed URLs and their categories. 2. **Fetch and parse feeds**: Run: python3 {baseDir}/scripts/fetch_feeds.py \ --feeds-file {baseDir}/references/feed-sources.md --hours 24 3. **Summarize articles**: For each article in the JSON output, generate a one-sentence summary (max 30 words) in the same language as the article. 4. **Format the digest**: Run: python3 {baseDir}/scripts/format_digest.py \ --input /tmp/openclaw-rss-articles.json 5. **Save the report**: Save as `~/openclaw-output/digests/digest-YYYY-MM-DD.md` 6. **Report to user**: Confirm total articles, per-category count, and file path. ## Error Handling - If a feed returns HTTP error or times out (>10s), skip and note it - If `feedparser` is not installed, run: `pip3 install feedparser` - If zero articles found, inform user and suggest expanding timeframe - Never silently fail — always report which feeds succeeded ## Rules - Never fabricate article titles or URLs - Always preserve the original article URL - Maximum 50 articles per digest几个关键点:{baseDir}是 OpenClaw 提供的变量,指向 Skill 目录本身;metadata必须是单行 JSON,多行会解析失败,这是最常见的坑;description是触发器不是说明书,要包含用户实际会说的词,比如 “RSS summary”“news digest”“daily briefing”。
3.3 settings.json 接入 TaoToken
在 OpenClaw 的 settings.json 里配置模型通道和 Skill 环境变量:
{ "models": { "default": "claude-sonnet-4-20250514", "provider": { "baseUrl": "https://taotoken.net/api", "apiKey": "${TAOTOKEN_API_KEY}" } }, "skills": { "load": { "watch": true, "watchDebounceMs": 250 }, "entries": { "rss-daily-digest": { "enabled": true, "env": { "RSS_FEEDS_CONFIG": "/home/user/.openclaw/skills/rss-daily-digest/references/feed-sources.md" } } } } }TAOTOKEN_API_KEY从环境变量读取,不要写死在文件里。如果你用的是 Coding Plan 长期编码方案,可以在 https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite 了解额度配置,适合每天定时跑日报这种高频场景。
3.4 RSS 源配置
创建references/feed-sources.md:
# RSS Feed Sources ## Tech - https://hnrss.org/frontpage — Hacker News Front Page - https://www.ruanyifeng.com/blog/atom.xml — 阮一峰的网络日志 ## AI - https://buttondown.com/ainews/rss — AI News Newsletter ## World - https://feeds.bbci.co.uk/news/world/rss.xml — BBC World News格式是- URL — 描述,脚本会按##分类标题自动归类。
4. 验证请求:本地触发 Skill 并检查输出
4.1 安装依赖并赋权
pip3 install feedparser chmod +x ~/.openclaw/skills/rss-daily-digest/scripts/*.py4.2 单独测试抓取脚本
先不经过 Agent,直接跑脚本确认 RSS 抓取正常:
python3 ~/.openclaw/skills/rss-daily-digest/scripts/fetch_feeds.py \ --feeds-file ~/.openclaw/skills/rss-daily-digest/references/feed-sources.md \ --hours 24正常输出是一段 JSON,包含articles数组和errors数组。如果articles为空但errors有内容,说明网络或源地址有问题;如果两个都为空,检查--hours是不是设得太小。
4.3 通过斜杠命令触发
在 OpenClaw 聊天窗口输入:
/rss-daily-digest或者用自然语言:
帮我生成今天的 RSS 日报Agent 会读取 SKILL.md,按 Workflow 逐步执行。执行完成后,检查输出文件:
ls -la ~/openclaw-output/digests/ cat ~/openclaw-output/digests/digest-$(date +%Y-%m-%d).md你应该能看到一份按分类整理的 Markdown 日报,每篇文章带标题、链接、一句话摘要和来源。
4.4 确认 Skill 已加载
openclaw skills list --eligible openclaw skills list --verbose--verbose会显示缺失的依赖和平台限制,排查时很有用。
5. 本篇常见错误排查
5.1 Skill 不出现在列表里
最常见的原因是metadata用了多行 YAML。它必须是单行 JSON 字符串,写成这样:
metadata: {"openclaw":{"emoji":"📰","requires":{"bins":["python3"]}}}而不是:
metadata: openclaw: emoji: 📰后者会静默解析失败,Skill 直接不加载。
5.2 Skill 列出但状态是 ineligible
说明门控条件没满足。用openclaw skills list --verbose看缺什么。常见的是requires.bins里的命令不在 PATH 中,或者requires.env里的环境变量没设置。
5.3 说了匹配的词但没触发
description写得太模糊,或者和其他 Skill 的 description 重叠。解决办法是把 description 收紧,包含用户实际会说的具体词,必要时设disable-model-invocation: true只允许手动触发。
5.4 脚本执行失败
检查工具策略是否阻止了 exec。如果 Agent 运行在沙箱中,requires.bins在宿主机检查通过,但容器内没装,也会失败。需要在沙箱配置里通过 setupCommand 安装依赖。
5.5 修改 SKILL.md 后没生效
改动在下一个新会话才生效。如果开了skills.load.watch: true,文件变化会触发刷新,但刷新后的列表也是在下一个 Agent 回合才采用。开个新会话最稳妥。
5.6 一个万能调试 Prompt
实在搞不定时,直接问 Agent:
我创建了一个名为 rss-daily-digest 的 Skill。 请帮我检查: 1. 它是否在你的 Skills 列表中? 2. 如果不在,请读取 ~/.openclaw/skills/rss-daily-digest/SKILL.md 并告诉我 frontmatter 是否有语法错误 3. 如果在,请尝试执行它并报告每一步的结果6. 发布到 ClawHub 与长期使用建议
6.1 发布前检查
python3 -c " import yaml with open('SKILL.md') as f: content = f.read() parts = content.split('---') if len(parts) >= 3: fm = yaml.safe_load(parts[1]) print('Frontmatter valid') print(f' Name: {fm.get(\"name\")}') print(f' Version: {fm.get(\"version\")}') else: print('Cannot find frontmatter') "确认metadata命名空间正确、requires.env字段名正确(不是requires.envs)、homepage已填写。
6.2 发布命令
npm install -g clawhub clawhub login clawhub publish ~/.openclaw/skills/rss-daily-digest \ --slug rss-daily-digest \ --name "RSS Daily Digest" \ --version 1.0.0 \ --changelog "Initial release: fetch, summarize, format RSS feeds"6.3 定时执行
openclaw cron add \ --name "morning-digest" \ --cron "0 8 * * *" \ --message "请运行 RSS 日报 Skill,生成今天的科技和 AI 新闻摘要,保存到文件。"6.4 长期编码场景
如果你打算把这个 Skill 作为日常工具长期跑,每天定时触发、还要迭代摘要质量,建议用 Coding Plan 方案,地址是 https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite 。接入文档在 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite ,里面有完整的 API 参数说明和错误码对照。
6.5 安全提醒
Skill 不应包含密钥,引用环境变量即可。安装第三方 Skill 前先读它的 SKILL.md,确认它请求的权限是必要的。OpenClaw 和 VirusTotal 合作提供安全扫描,ClawHub 上每个 Skill 页面都能看到扫描报告。如果你的 Skill 会把数据发送到外部服务,在 SKILL.md 里加一段 Trust & Privacy Notice 声明清楚。
先跑通,再用一周,根据实际使用中暴露的问题迭代,最后再考虑发布。这是我自己走下来最稳的路径。