)
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_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 入口是 https://taotoken.net/api 。你需要先去控制台创建一个 API Key地址是 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite 创建完在 API Keys 页面复制出来地址是 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 。拿到 Key 之后把它写进 OpenClaw 的 settings.json 或者环境变量里。我推荐用环境变量注入不要硬编码在 SKILL.md 里。具体配置片段在下一节展开。如果你还没决定用哪个模型可以先去模型对话页面试一下效果地址是 https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewrite 确认摘要质量符合预期再往下走。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/ 放可执行脚本执行而不读入上下文省 Tokenassets/ 放输出用的模板文件。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_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 了解额度配置适合每天定时跑日报这种高频场景。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 feeds6.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_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 。接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 里面有完整的 API 参数说明和错误码对照。6.5 安全提醒Skill 不应包含密钥引用环境变量即可。安装第三方 Skill 前先读它的 SKILL.md确认它请求的权限是必要的。OpenClaw 和 VirusTotal 合作提供安全扫描ClawHub 上每个 Skill 页面都能看到扫描报告。如果你的 Skill 会把数据发送到外部服务在 SKILL.md 里加一段 Trust Privacy Notice 声明清楚。先跑通再用一周根据实际使用中暴露的问题迭代最后再考虑发布。这是我自己走下来最稳的路径。