
早上打开手机一条整理好的资讯摘要已经等在通知栏里。这种体验我持续了快一个月靠的是一个用 OpenClaw 搭起来的 AI 定时资讯推送助手。以前我也试过用脚本定时拉 RSS但脚本只能把原文链接堆在一起真正值得看的还是淹没在几十条标题里每天上午照样要花半小时人工过滤。后来换成 OpenClaw 做了一版自动化抓取、去重、摘要、推送到微信和邮箱一条龙搞定每天早上八点准时送达。这篇文章就把这套从 0 到 1 的搭建过程完整写出来。不管你手上是 Windows 还是 Ubuntu只要愿意折腾一个周末都能复刻一套属于自己的 AI 定时资讯推送助手。我会把设计思路、环境配置、Skill 编写、定时调度、推送渠道、常见坑位全部拆开讲尽量做到你照着做就能跑通。1. 项目拆解这个资讯推送助手到底在做什么1.1 需求分析为什么现成 RSS 阅读器满足不了你很多人第一反应是订阅资讯用 Feedly、Inoreader 不就行了吗确实传统 RSS 阅读器能聚合订阅源、标记已读、打标签但这些工具本质上是把“选择读什么”的责任继续留给你。它们的首页只是按时间排序的标题流没有跨源去重没有内容质量判断更不会把十篇文章合并成三段话的晨报。我最初的需求其实很具体每天早晨通勤的十五分钟里能知道行业里发生了什么并且不用刷十几个网站。这意味着系统需要做到三件事——定时抓取多个信源、用大模型做摘要和过滤、把结果推到手机上。市面上的阅读器做不到自己从零写一个爬虫加 NLP 摘要又太繁琐。所以最后选择了 OpenClaw把它当成一个带定时触发能力的 AI Agent 框架来用。1.2 为什么选 OpenClaw 而不是自己写脚本如果只做一次性脚本用 Python 写个requests抓 RSS再调一下大模型 API最后用requests发 webhook也不是不行。但一旦跑起来你就会发现还需要处理这些事定时任务谁来触发抓取失败要不要重试摘要生成超时怎么办推送渠道怎么统一管理多信源去重的逻辑放哪里这些脏活累活OpenClaw 提供了统一框架我只需要关心“今天要做什么”而不是“任务怎么被调度起来”。OpenClaw 的核心概念是 Skill你可以把一次具体的自动化任务封装成一个 Skill它可以包含提示词模板、脚本代码、依赖声明。配合内置的 schedule 配置能直接写 cron 表达式触发配合 notifier 配置能对接消息推送。另外它支持接入 Ollama、OpenAI 兼容接口等模型后端所以我可以先用本地小模型把链路跑通成本几乎为零。当然如果你是那种喜欢完全掌控每一行代码的人用 cron Python 也能做。但如果你更看重迭代速度和维护成本OpenClaw 这种“把常用功能做成标准件”的思路会舒服很多。1.3 整体架构与数据流整个项目的架构可以概括成一条清晰的数据流资讯源 → 定时触发 → 抓取清洗 → 大模型摘要 → 格式化 → 推送。下面的表格是我最终采用的组件选型和理由你可以根据自己的情况替换。环节我用的方案备选方案选择理由资讯源RSS / RSSHub直接爬网页RSS 结构稳定不易触发反爬抓取解析Python feedparserNode.js rss-parser生态成熟写起来快AI 摘要Ollama Qwen2.5-3BOpenAI 兼容 API本地运行免费隐私安全定时调度OpenClaw 内置 cron系统 crontab配置统一便于管理推送渠道企业微信机器人 / Server酱Telegram Bot / 邮件国内网络环境友好配置简单存储SQLite 做去重Redis / 内存集合轻量重启不丢状态这套架构的巧妙之处在于每个环节都可以独立替换。比如你不想用本地模型把config.yaml里的 model provider 改成云端 API 就行不想用企业微信换一个 webhook 地址就行。后面我会逐个讲配置细节先把框架放在这里你脑子里始终有一张地图。2. 环境准备把 OpenClaw 跑起来2.1 需要准备哪些依赖在动手之前先把环境捋清楚。我用的是一台 Windows 笔记本为了省事开了 WSL2 跑 Ubuntu 子系统如果你直接用 Linux 服务器或者 Ubuntu 桌面那可以跳过 WSL 的部分。下面是基础依赖清单操作系统Ubuntu 20.04 或更高版本Windows 10/11 建议搭配 WSL2。Node.js 18OpenClaw 的运行时依赖很多内置工具链都跑在 Node 生态里。Python 3.9用于编写自定义 Skill 脚本以及运行 feedparser 等抓取库。Git拉取仓库和更新版本用。Ollama用来本地运行大模型如果你打算用云端 API 可以跳过这一步。OpenClaw 本体社区版发布包或者从仓库拉源码编译。依赖看着多但真正需要手动下载的其实只有 Node.js、Python 和 Ollama其余都可以用包管理器搞定。有一点要提醒OpenClaw 版本迭代很快不同版本命令可能略有差异。我写这篇文章基于 0.5.x 的社区版如果你拿到的是更新的版本个别命令可能变了但整体思路不变。2.2 安装 OpenClawWindows / Ubuntu先说 Ubuntu 下的标准流程。我习惯把 OpenClaw 放在用户目录下的openclaw文件夹里干净且不需要 root 权限cd ~ # 从官方仓库下载发布包这里以 linux-x64 为例 wget openclaw-release-linux-x64.tar.gz tar -xzf openclaw-release-linux-x64.tar.gz mv openclaw-release-linux-x64 ~/openclaw解压完成后把bin目录加进 PATH方便全局调用echo export PATH$HOME/openclaw/bin:$PATH ~/.bashrc source ~/.bashrc然后初始化工作目录openclaw init --dir ~/openclaw-workspace cd ~/openclaw-workspace初始化会在当前目录生成config.yaml、skills/、data/等基本结构。你可以用openclaw doctor检查环境是否完整它会提示缺哪些依赖。Windows 下我推荐走 WSL2原因是很多 Skill 脚本预设的是 Linux 环境在原生 Windows 上跑会遇到路径分隔符、shell 命令兼容性等各种问题。打开 PowerShell先用wsl --status确认 WSL 环境状态。如果提示 WSL2 不是默认版本或者内核版本太老执行wsl --update wsl --set-default-version 2进入 Ubuntu 子系统后安装步骤和 Linux 完全一样。如果你实在不想用 WSLOpenClaw 也有 Windows 原生安装包和 Companion 组件用来桥接本地命令和 Windows 系统调用。原生安装完成后记得额外运行一次openclaw windows-companion install这个组件主要解决部分 Skill 需要执行 PowerShell 命令时的权限和路径问题。但说实话如果不是有特殊需求直接用 WSL2 最省心。2.3 配置本地 AI 模型Ollama Qwen2.5-3B环境跑通之后接下来要解决的是“AI 大脑”。我选了 Ollama 跑本地模型主要原因是免费、无需联网、数据不出本机。先安装 Ollamacurl -fsSL https://ollama.com/install.sh | sh然后拉取 Qwen2.5 的 3B 模型。这个模型参数量适中做资讯摘要足够对内存的占用也友好——实测拉下来大概 2GB 左右8GB 内存的机器跑起来不费劲。ollama pull qwen2.5:3b接下来把模型接入 OpenClaw。编辑工作目录下的config.yaml找到模型相关配置model: provider: ollama base_url: http://localhost:11434 name: qwen2.5:3b temperature: 0.3 keep_alive: 5mtemperature我调低了摘要任务不需要太多随机性稳定比有趣更重要keep_alive让模型在内存里保留 5 分钟避免每次请求重新加载模型导致响应慢。配置保存后用一条简单的对话测试连通性openclaw chat 你好请回复模型已连接如果返回正常说明 OpenClaw 已经能调用本地模型了。这一步是整个项目的基础后面所有 Skill 的摘要能力都依赖它。3. 核心实现定时抓取、AI摘要与推送3.1 定义资讯源现在开始写真正的业务逻辑。第一步是确定资讯来源。我用的是 RSS因为它足够结构化解析方便而且对目标站点压力小。在 OpenClaw 工作目录下新建一个sources.yaml用来维护订阅源列表sources: - name: 少数派 url: https://sspai.com/feed category: 效率工具 - name: 阮一峰的网络日志 url: https://www.ruanyifeng.com/blog/atom.xml category: 技术 - name: 36氪 url: https://36kr.com/feed category: 商业科技如果你发现某些站点没有提供 RSS可以用 RSSHub 这种工具把网页生成 RSS。不过我不建议一上来就搞十几个源先用两三个稳定源跑通全流程等熟悉了再扩展。RSS 源本身也可能失效所以我在代码里加了超时设置和异常捕获后面第 4 节会专门讲排查。3.2 编写抓取与摘要 SkillOpenClaw 的 Skill 目录结构一般长这样skills/ daily-news/ SKILL.md run.py requirements.txtSKILL.md是给 OpenClaw 看的技能描述里面写了这个 Skill 叫什么、能干什么、运行入口是什么。run.py是实际执行脚本我以 Python 为例。先看SKILL.md的示例内容--- name: daily-news description: 抓取 sources.yaml 中的 RSS 源生成每日资讯摘要并推送 entrypoint: run.py ---然后是run.py。核心逻辑分四步读配置、抓 RSS、调用本地模型摘要、返回结果给 OpenClaw 做后续推送。抓取部分用 feedparser 非常方便import os import yaml import feedparser def load_sources(pathsources.yaml): with open(path, r, encodingutf-8) as f: data yaml.safe_load(f) return data[sources] def fetch_entries(source, limit10): feed feedparser.parse(source[url]) entries [] for entry in feed.entries[:limit]: entries.append({ title: entry.get(title, ), link: entry.get(link, ), summary: entry.get(summary, )[:200], source: source[name] }) return entries摘要部分我直接通过 HTTP 调用 Ollama 的接口这样不依赖特定版本的 OpenClaw API通用性更强。请求/api/generate接口把多篇文章的标题和摘要拼进 promptimport requests def summarize(entries): text_blocks [] for i, item in enumerate(entries, 1): text_blocks.append(f{i}. {item[title]}\n{item[summary]}) prompt ( 你是一名资讯编辑。请阅读以下资讯列表筛选出最重要的3-5条 用简洁的中文分点概括每条不超过50字保留原文链接。\n\n \n\n.join(text_blocks) ) resp requests.post( http://localhost:11434/api/generate, json{ model: qwen2.5:3b, prompt: prompt, stream: False, temperature: 0.3, keep_alive: 5m }, timeout120, ) return resp.json()[response]这里有一个很容易踩的坑如果你把所有原文都塞进 prompt本地小模型很容易被超长文本带偏导致输出摘要质量下降。实测下来每条 RSS 只取标题和开头的 200 字摘要就够了链接保底真正的深度阅读留给你自己点开看。去重逻辑我放在后面单独说因为它直接影响推送体验。3.3 设置定时调度让任务每天自动跑这一步做完你已经可以手动跑一次完整流程了。但资讯推送助手必须有“定时”能力。OpenClaw 支持在config.yaml里直接配置 scheduleschedule: - name: morning-news cron: 0 8 * * * skill: daily-news timezone: Asia/Shanghaicron 表达式0 8 * * *表示每天早上 8 点整执行。如果你只熟悉 Windows 任务计划程序这里简单解释一下 cron 的五个字段分钟、小时、日、月、星期。0 8 * * *就是“8 点 0 分不管几号、不管星期几”。想换时间就改前两个数字比如30 7 * * 1-5是工作日早上 7 点半。内置 schedule 的局限在于 OpenClaw 进程必须常驻。如果电脑半夜断电重启进程没了任务就不跑了。所以我更推荐在 Linux 服务器上用 systemd 守护或者干脆用系统 crontab 直接调用crontab -e加入一行0 8 * * * /home/user/openclaw/bin/openclaw run daily-news /var/log/openclaw-daily.log 21这样做的好处是即使 OpenClaw 主进程没有一直运行到点了系统也会拉起来执行一次。我的建议是本地开发用内置 schedule 调试正式跑定时任务还是走 crontab 或 systemd更稳定。3.4 推送渠道配置与测试资讯摘要生成之后最后一步是推到手机上。我推荐两个渠道企业微信机器人或者 Server酱。它们都是通过 webhook 推送配置成本极低。在config.yaml中找到 notifier 配置notifier: - type: webhook name: work-wechat url: https://qyapi.weixin.qq.com/cgi-bin/webhook/send?keyYOUR_KEY format: markdown企业微信机器人的 setup 流程是在目标群聊中添加一个机器人复制 webhook 地址。注意机器人有关键词限制你必须在推送内容里包含至少一个在机器人配置里设置的关键词比如“每日资讯”否则消息会被丢弃。这是一个特别容易踩的坑后面排查篇再细说。配置好后先手动测试推送openclaw notify --channel work-wechat --message 每日资讯测试消息如果你在手机企业微信里收到了消息说明通道打通了。Server酱的原理类似注册后拿到一个 SendKey把 webhook 地址填进去即可。邮件推送也可以配置 SMTP 就行但我个人觉得对早间简报来说微信/企业微信的触达效率最高。3.5 完整运行链路与验证到这里所有零件都齐全了。先把整个链路手动跑一遍openclaw run daily-news观察命令行输出如果一切正常你应该会看到加载 sources → 抓取 RSS → 调用 Ollama → 生成摘要 → 触发 notifier 推送。第一次跑通后把 schedule 加上第二天早上就能收到推送了。这里强调一下“最小闭环”原则第一次调试千万不要接很多源就留一个 RSS 源手动跑通后再加第二个。因为这中间任何一步出错都会影响你判断到底是抓取问题、摘要问题还是推送问题。把链路收窄到最小范围排查起来会非常快。4. 常见问题与排查实录4.1 WSL2 环境校验与修复如果你是 Windows 用户大概率会遇到 OpenClaw 提示 WSL 环境无法安全验证的问题。这个提示的意思通常是系统当前 WSL 版本不是 2或者内核太旧。按提示在 PowerShell 里运行wsl --status如果输出显示默认版本是 1或者没有默认版本执行wsl --set-default-version 2 wsl --update如果之前安装的发行版还是 WSL1需要单独转换wsl --set-version Ubuntu 2转换完成后再启动 OpenClaw问题基本就消失了。这个问题排查起来不复杂但很容易让人误以为是 OpenClaw 安装有问题白白折腾半天。4.2 定时任务总是不触发内置 schedule 没触发先看三件事进程有没有常驻、时区配置对不对、cron 表达式有没有写反。检查日志是最直接的openclaw logs --tail 50如果日志里根本没有 schedule 相关记录多半是配置文件没生效或者 cron 表达式用的五段格式不对。另外注意timezone一定要显式配置有些服务器默认是 UTC 时间你写0 8 * * *就会变成北京时间下午四点推送。如果是系统 crontab 方式注意执行路径。crontab 里的环境变量和你手动登录 shell 不一样openclaw可能不在 PATH 里一定要写绝对路径。日志中如果出现command not found就是这个原因。我习惯把命令写成/home/user/openclaw/bin/openclaw run daily-news并把日志重定向到文件方便排查。4.3 模型摘要结果不稳定或乱码本地小模型的通病是prompt 写得不清楚时输出格式容易飘。一会儿输出“1. 2. 3.”一会儿输出“-”甚至可能夹带英文。我的解决办法是两招一是降低 temperature 到 0.2-0.3二是给 prompt 加明确的输出约束和示例。prompt ( 请把下面的资讯整理成简短晨报严格按以下格式输出\n 【要点1】...\n 【要点2】...\n 最多5条不要多余解释不要英语。\n\n )如果还出现乱码检查 Ollama 返回的 response 是否完整。Qwen2.5 默认输出中文没问题但有些白话模型可能在长输出后半段变得混乱。这时候可以限制摘要条数或者把每篇文章的截断长度从 200 字降到 150 字输入更短输出更稳。4.4 推送失败或消息被拦截推送失败的原因千奇百怪但最常见的其实是 webhook 鉴权问题。企业微信机器人需要在机器人配置里加关键词如果你的摘要里没有“每日资讯”之类的词消息会被微信服务端直接丢弃但 webhook 接口返回的却是成功这是最坑的地方。排查方式很简单先用固定文本测试curl -X POST webhook地址 \ -H Content-Type: application/json \ -d {msgtype: markdown, markdown: {content: 每日资讯测试}}如果返回errcode: 0说明通道是通的。接下来缩小范围大概率是消息格式或关键词问题。另外注意 webhook 地址泄露会被人滥用配置好之后不要把config.yaml提交到公开仓库。4.5 RSS 抓取失败或内容为空RSS 源抓不到内容常见原因有三个目标站点超时或者有反爬、feed 结构不标准、网络环境不通。第一个问题可以在请求时加User-Agent头和超时时间第二个问题可以用feedparser的容错能力但有些源只返回text/xml却不符合标准需要换源。import urllib.request req urllib.request.Request(url, headers{User-Agent: Mozilla/5.0}) with urllib.request.urlopen(req, timeout15) as resp: data resp.read().decode(utf-8)如果 RSS 源来自国外站点且连接不稳我的建议是换用国内可访问的 RSSHub 实例做聚合转换或者改订阅那些响应快的源。不要把所有希望寄托在单一源上多配一个备用源是更务实的做法。5. 我的心得与建议5.1 先跑通最小闭环再堆功能这是我在做这个项目的过程中最大的体会。最开始我也想象得很复杂想同时接十个 RSS 源、做分类摘要、生成日报存数据库。后来发现这样根本跑不动一会儿是 RSS 源有问题一会儿是模型输出格式不对问题一堆叠加在一起很难定位。后来我砍到只留一个源手动跑通再逐步加源顺利很多。做自动化项目最忌讳“一步到位”先把最小链路跑通再谈优化和扩展。5.2 给模型输出的质量定好边界本地小模型不是万能的你越依赖它输出“高质量深度分析”就越容易失望。我的定位很清楚它只做信息筛选和简单摘要真正对内容的判断和深度解读还是由我自己完成。这其实是 AI 工具的正确用法——让模型帮你省掉“找资讯、看标题、判断是否相关”的时间而不是替你做全部决策。把这条边界想清楚你对输出质量的预期会合理很多。5.3 后续可以怎么扩展这套基础框架的可扩展性相当强。现在做的是早间资讯改一下 cron 表达式和 prompt就能变成晚间复盘、周报总结。同理把 RSS 源换成论文预印本、专利公开信息、商品价格页面它就是一套通用的“定时 AI 监控助手”。我也在考虑下一步把摘要结果存进 SQLite方便月底回顾。最后再分享一个小技巧如果要长期稳定运行建议把 OpenClaw 工作目录整体纳入 Git 管理哪怕是本地仓库也好。每次改配置、改 Skill 之前先提交一版出了问题能快速回滚。这个习惯救过我很多次希望你也能用上。