早上八点,我打开Telegram,里面躺着一份刚生成好的Reddit摘要:r/selfhosted昨天最值得读的六个帖子,每个都配了链接、一句话点评,还标出了哪个帖子讨论最热烈。这不是什么付费订阅,而是我前一天晚上用OpenClaw搭的一个Daily Reddit Digest用例自动跑出来的。这篇文章,就是我在复现这个用例过程中记下来的完整笔记——从部署OpenClaw、接上本地小模型,到把摘要写进Obsidian、推送到通知工具,中间踩过的坑、调过的Prompt、改过的时间参数,全都放在里面。
如果你正在学OpenClaw,或者想给自己的Agent加一个"每天早上自动看资讯"的实用流程,这份笔记可以直接抄作业。我不会只贴配置,还会把每个设计决定背后的原因讲清楚,毕竟用例能不能长期稳定跑,关键不在第一天的惊喜,而在后面一个月的细节。
1. 拆开 Daily Reddit Digest 这盘菜:这个用例到底在做什么
先说清楚这个用例的"是什么":它让你每天定时访问Reddit上指定版块(比如r/selfhosted、r/technology、r/sysadmin),抓取当天的高热度帖子,把标题、链接、评热度、正文摘要整理成结构化数据,交给大语言模型筛选和改写,产出一份适合快速阅读的"每日文摘",最后推送到你习惯的地方——邮件、Telegram、企业微信机器人,或者存成本地Markdown文件。
1.1 切成四块:定时触发、页面采集、LLM总结、结果投递
我第一次看这个用例的时候,以为重点在"怎么抓Reddit",真正跑起来才发现它其实是标准的数据管线:触发层、采集层、加工层、投递层。
- 触发层:一个Cron定时器,决定每天早上几点开始干活。难点在时区,不是随便填个"8点"就完事。
- 采集层:通过浏览器自动化打开Reddit页面,滚动、等待、提取帖子卡片。为什么不用普通HTTP请求?Reddit这类站点前端逻辑复杂,很多内容由JavaScript动态渲染,直接用requests库拿到的基本是空壳页面。OpenClaw的浏览器扩展就是干这个的。
- 加工层:把采集到的原始帖子列表交给LLM,让它按"信息密度高、可读性强的编辑标准"筛选和总结。这里有个容易被忽略的关键——LLM不应该凭空生成内容,它只应该对抓回来的事实做改写和排序,这是防止幻觉的基本功。
- 投递层:把生成的Digest写到Obsidian笔记、发送通知、归档日志。看你想怎么消费这份摘要,这一步配置最灵活。
1.2 为什么我建议拿它当OpenClaw的入门练习
很多人上手Agent框架会先跑Hello World,但Hello World只能证明"能通",不能证明"有用"。Daily Reddit Digest这个用例恰好卡在中间:它足够小,一个早上能跑通;又足够完整,把OpenClaw最核心的几种能力全覆盖了。
而且它的输出质量可以直观验证——摘要好不好,你一眼就能看出来,不需要什么量化指标。相比之下,让Agent去操作API、写代码,错了往往要查半天日志才发现是模型问题还是步骤问题。内容摘要类任务反馈链路很短,适合作为学习框架的第一站。
我原来以为这种用例适合用Python脚本一把梭:requests抓页面、OpenAI接口做摘要、cron定时,三个文件搞定。但真实用下来,脚本方案有几个硬伤:页面结构一变,提取逻辑就崩;摘要逻辑想调整,得改代码重跑;想加一个新功能点,比如"顺便抓一下Hacker News",等于重写一遍。而OpenClaw的玩法是把流程写成Agent的"任务描述",采集和总结由框架调度,你想让浏览器先滚动两屏再抓取,直接在任务里写一句话就行,不用动底层代码。
1.3 先明确:你要的是"众包筛选"还是"深度阅读"
跑这个用例之前,得想明白消费场景。我的需求是每天早上快速扫一眼技术圈在聊什么,所以摘要不需要很长,但要覆盖足够宽的版块。你的情况如果是在做某个垂直领域盯梢,比如只关注r/docker的发布帖,那就应该把筛选标准写成"只保留版本更新和重大变更",而不是泛泛的热点汇总。
这个设计差异最后会体现在Prompt里。所以我不建议一上来就抄别人现成的Prompt——先想清楚输出给谁看、看多细、需要什么颗粒度的信息,再动手写配置。
2. 先把OpenClaw端起来:部署、WSL环境、浏览器扩展和模型接入
我在装OpenClaw这一步卡了一整个晚上,后来发现大部分人搜"OpenClaw安装教程"踩的都是同一批坑。我把三者装法整理在一起,按顺序走基本不会出问题。
2.1 三种安装路线,先弄清楚你要哪种
OpenClaw的部署方式大致有三条路:官方安装脚本、Docker、npm全局安装。我实测下来的选择逻辑是这样的:
- 想最快体验、不想管依赖:用官方脚本安装,装完在终端敲
openclaw start就能跑起来。 - 要长期稳定跑、还打算放服务器上:用Docker Compose,环境隔离干净,升级也方便。
- 你本身是Node生态重度用户:用npm全局安装,包体积小,扩展开发最直接。
这里有个特别常见的误解值得提醒:好多人跑OpenClaw卡住之后,去Node.js官网重新下载Node——把"Node"和"OpenClaw"搞混了。OpenClaw虽然是基于Node写的,但它不是一个Node LTS发布包,你从Node官网下载的只是JavaScript运行时。正确做法是装好Node 18以上(包括npm)之后,再去执行OpenClaw官方指定的安装命令,两者是前后关系,不是同一件事。
我给Docker路线贴一下大致步骤,不同版本具体命令可能有出入,以你装的那个版本官方README为准:
# 拉取仓库 git clone https://github.com/openclaw/openclaw.git cd openclaw # 从模板创建环境变量文件 cp .env.example .env # 编辑.env,填入大模型接口信息(后面2.4节说细节) docker compose up -d # 查看运行状态 docker compose exec openclaw claw status2.2 "无法安全验证sl2环境":这个报错到底在说什么
我在Windows环境下跑安装脚本时遇到了那段很有名的报错,大意是"无法安全验证sl2环境,请在PowerShell中运行wsl -- status"。第一次看到以为是网络问题,甚至怀疑是杀毒软件拦截,折腾了半天才发现根本不是那回事。
原理是这样的:OpenClaw为了在Windows上安全地执行Linux沙箱命令,会先检查机器上的WSL(Windows Subsystem for Linux)状态,确认Linux子系统可用后,才把Agent的脚本任务放进沙箱执行。如果WSL没装好、内核版本太老,或者发行版处于"未初始化"状态,脚本就会给出这个报错。
正常排障顺序很简单,在PowerShell里执行:
wsl --status如果输出显示"默认版本:2"且内核正常,说明WSL本身没问题;如果只显示一堆"正在安装",那就需要先升级驱动和组件。常见的修复命令是:
wsl --update wsl --install -d Ubuntu wsl --set-default-version 2装完发行版之后再跑一次wsl --status,能正常输出版本信息,再回头执行OpenClaw安装脚本,问题就消失了。这个排障过程给我一个很大的教训:遇到Agent框架的报错,先分清它是"网络问题"还是"本机环境问题",大多数诡异的失败其实都和环境状态有关。
2.3 浏览器扩展:它不是可有可无的遥控器
OpenClaw要真正操作网页,需要一个配套的浏览器扩展,Chrome、Edge都能装。第一次用的时候我一度觉得这一步多余——现代Agent不是可以直接调浏览器内核吗?实际用下来,OpenClaw把浏览器扩展设计成"AI控制真实浏览器"的桥梁:扩展负责接收Agent的指令,执行打开标签页、滚动、点击、读取DOM这些动作,然后把页面内容送回去。
这个架构在抓Reddit时特别重要。Reddit这种动态页面,帖子列表是异步加载的,普通HTTP请求拿不到完整的帖子卡片;用无头浏览器又容易被识别为机器人。而通过扩展操纵一个真实浏览器实例,就相当于一个正常用户在看页面,登录态、Cookie、渲染结果都自然存在。
装扩展之后别忘了做配对:扩展图标点开,会显示一个配对码或链接,把它填到OpenClaw的配置里,两者才算建立信任关系。我见过有人装完扩展没配对,然后日志里全是"Browser not connected"。
2.4 让qwen2.5-3b这种本地小模型也能扛起摘要任务
OpenClaw的核心是把LLM当作"大脑",但大脑不一定非要用云端大模型。我选择先接本地模型:一台偶尔开机的台式机装了Ollama,拉了qwen2.5-3b这个3B参数量的模型。选它有两个原因:一是免费、离线可跑;二是Daily Reddit Digest的任务本质是"对已有文本做筛选和改写",不是复杂的推理题,小模型理论上够用。
在OpenClaw的环境变量里大致是这样配的(还是那句话,以你手上的版本schema为准):
LLM_PROVIDER=ollama OLLAMA_BASE_URL=http://localhost:11434 OLLAMA_MODEL=qwen2.5:3b再说明白一点:把3B模型和云端GPT-4比,代价很明显——小模型对复杂指令的遵循能力弱,输出偶尔脱线。所以后面写Prompt时要特别讲究:把任务拆成更小的子步骤、给明确的输出模板、尽量让模型只做"填空式改写"。这些调优思路在第3章展开。
3. 手把手复刻 Daily Reddit Digest 的配置与流程
跑通框架只是开始,接下来才是核心工作:把这个用例从"能跑"变成"像样"。我按我的使用场景完整走一遍配置过程,每一步都说说我为什么这么设计。
3.1 先定义清楚:这份Digest的输入、处理、输出分别是什么
我的场景很简单:每天早上看一眼自托管和技术圈发生的大事,不需要每帖都精读。于是我的定义是:
- 输入:r/selfhosted、r/technology、r/sysadmin三个版块昨天的热门帖,每版块取前10条。
- 处理:过滤掉纯情绪帖、广告、教程带货帖;保留有信息量的帖子;按主题分组;每个帖子生成不超过30字的一句话导读。
- 输出:一份Markdown格式的每日Digest文件,同时发送一份摘要到Telegram。
注意,我刻意把输出格式和长度都做了硬限制。原因是:Agent任务最怕边界模糊,你让LLM"总结一下",它会自由发挥;你给它一张必须填完的表,它才会稳定。这一点在后面Prompt里会体现得更彻底。
3.2 用任务清单向外描述,而不是写死脚本
OpenClaw里工具集和记忆是分开管的,可以把"日常信息采集"定义成一个可复用的Agent,然后给这个Agent写一份每天的例行任务清单。我用的这个版本,大致是这种结构:
{ "name": "daily-reddit-digest", "enabled": true, "schedule": { "cron": "0 8 * * *", "timezone": "Asia/Shanghai" }, "task": "执行每日Reddit摘要任务:打开指定三个子版块,读取热门帖子列表,按约定筛选,生成Markdown文件并发送摘要通知", "model": "qwen2.5:3b", "preconditions": [ "浏览器扩展已连接", "本地模型服务在线" ], "output": [ "保存到 /data/digests/yyyy-mm-dd.md", "推送消息到通知渠道" ] }这里有三个设计点值得说明:
- 用
schedule而不是手动触发,所以"昨天"的数据怎么表述?我让Agent在任务里自然语言指定"以当前日期前一天为统计范围",模型会自己想办法对齐。 - 为什么
timezone要显式写?因为服务器默认是UTC时间,如果你在Docker里跑,不写时区,cron表达式按宿主机时间走,容易造成"8点"或“16点”的混乱。 preconditions很实用,它相当于健康检查:浏览器断连了、模型服务挂了,就不执行后续流程,避免白跑一趟还浪费Token。
当然,上面是我用的版本大致的形态,OpenClaw版本迭代很快,字段名可能变。你以自己装好之后的配置示例为准。
3.3 写给LLM的提示词:让小模型不跑偏的写法
这是我调了一整天的地方。第一版Prompt我写得很随意:"帮忙总结一下这些Reddit帖子",结果3B模型生成的摘要又长又空,全是我能看到的大白话。后来我把Prompt重写成结构化表单,效果直接上一个台阶。
现在用的模板大概长这样:
你是一位Reddit社区编辑。下面是从Reddit抓取的帖子列表,每一条包含:标题、所属版块、得分、评论数、链接、正文摘要。 要求: 1. 剔除评分低于20的帖子;剔除正文少于50字、明显只有链接没有内容的帖子。 2. 将剩余帖子按主题分类:工具发布、经验教程、问题求助、行业新闻。 3. 每个帖子保留:标题、版块、得分、链接,外加一句不超过30字的中文导读。 4. 不要让导读变成"这篇文章介绍了……"这种废话,要写"这里值得注意的点是什么"。 5. 最后用三行总结今天最值得关注的趋势。这样设计基于一个关键认知:小模型的指令遵循能力弱,但它非常擅长"填空"。你给它一个带约束的表单,它会老老实实填;你给它开放性任务,它就自由发挥到失控。直接抓数据放在上下文里,让模型做"事实性压缩",不要在总结里引入它自己脑子里的Reddit知识。
3.4 盯住输出:写回Markdown、归档Obsidian、推上Telegram
Digest生成之后,怎么投递也值得讲究。我做三个输出:
第一,保存Markdown到本地目录,文件名带日期。我用的是:
/data/digests/2025-06-12.md第二,归档到Obsidian。这吸引我的一点是,Obsidian支持把本地Vault当作文件夹来读。直接让OpenClaw把生成的Markdown写进Vault目录,就能在Obsidian里形成连续日记。我顺手在文件头加了frontmatter:
--- date: 2025-06-12 tags: [reddit-digest, daily] source: reddit ---这样Obsidian能自动索引,按标签筛选也方便。
第三,通知推送。OpenClaw本身支持通过集成渠道发消息。我偏好Telegram,配置一个bot token和chat id就能用。这一层相当于"完成信号"——我不需要天天去翻文件夹,推送到了就知道今天的Digest好了。
4. 跑起来之后才发现的三个深坑和一条调优路径
配置跑通只是开始。真正用了两个星期,我撞上了一批"纸面上根本看不出来"的问题,逐个说。
4.1 页面结构一变,抓取逻辑就跟着崩
Reddit前端改版不会提前打招呼。某天早上我收到的摘要突然只剩两个帖子,打开日志一看,Agent在页面上找不到预想的帖子卡片元素。
原因很典型:浏览器扩展是按照"当前页面结构"去定位内容的。Reddit改版之后,帖子标题的CSS类名变了,提取规则就失效了。OpenClaw的Agent在任务描述里用的是"读取热门帖子列表"这种语义化指令,但底层还是需要DOM选择器支撑,选择器一旦不匹配,它就抓了个寂寞。
我的解决办法是双保险:一是把抓取规则写成"不依赖于具体的CSS类名,而是通过可访问性树/文本特征去找内容",OpenClaw的扩展支持按文本内容定位;二是在预处理器里加一步"验证抓取数量",如果抓到的帖子数低于某个阈值,直接判定任务失败并通知我,而不是闷头生成一份残缺摘要。现在每天早上就算抓取异常,我也能第一时间知道。
4.2 摘要越看越像AI写的:怎么把"编辑感"调出来
跑了一周之后,我发现摘要质量在下降——帖子类型单调化,导读语气雷同,越来越像AI说的话。后来想明白了一个很微妙的问题:LLM每次收到的输入都是"昨天的帖子",它没有记忆,也不知道昨天自己总结过什么。
这意味着它每天做的筛选标准完全独立,第一篇总结和第十一篇总结之间没有任何连续性。对读者来说就是"模板感"。
我的调法是把历史的Digest文件作为上下文的一部分传给Agent:
参考一下昨天的摘要,今天的主题分布不要和昨天完全一样。同时还加了多样性约束:同一个子版块的帖子,最多选三篇;正文内容高度相似的帖子,保留最有信息量的一篇即可。这样摘要就不会变成"某版块三连发"。
4.3 定时任务不按点跑:时区、Cron和Docker守护进程
前面说过时区,实际操作中它是最容易挖坑的地方。我第一周放在Docker里跑,宿主机是北京时间,容器默认是UTC。配置里写的"0 8 * * *"按容器时间算,实际执行成了北京时间下午四点。后来在配置里显式设置TZ=Asia/Shanghai才修好。
还有一个隐患:Cron任务长期跑,如果进程被占用或者Docker容器被重启,定时器不一定能自动恢复。我加了一个简单的心跳检查:每天早上推送的成功通知就是一盏绿灯,如果九点之前没收到通知,说明昨天夜里哪一环断了。这比半夜爬起来查日志靠谱。
4.4 让每天的内容有层次:除了爆款,还要看趋势
最后一条调优经验比较进阶:不要把Digest做成"每日爆款排行榜"。每天只看得分最高的帖子,很容易陷入评论区的情绪漩涡,忽略了真正值得长期跟踪的领域变化。
我现在让Agent每周五额外生成一份周报,把本周讨论度同比增长明显的主题挑出来。做法不复杂,就是让Agent读取一周的Digest存档,按主题词频统计,再对比本周和上周Top帖的主题重合度。这样"日报看当天,周报看趋势",信息消费层次一下子就清晰了。
5. 从"能用"到"好用":我后续一个月运维下来的体会
这个用例我已经连续跑了一个多月,现在聊聊那些让整个系统"不用人管"的关键经验。如果你也想长期跑,这部分比第一天的部署还重要。
5.1 一台云服务器让Digest永久在线
我的初始方案是放在自己电脑上,但电脑一关,定时任务就断了。后来干脆折腾了一遍云服务器部署。当时正好看到阿里云有免费试用活动,就研究了一下"openclaw配置阿里云服务器免费试用"相关的做法,实际流程不复杂:在控制台开一台2核4G的Linux实例,放行Docker需要的端口,然后把OpenClaw的Docker Compose配置传上去,启动即可。
这样部署有几个好处:一是24小时在线,定时任务稳定;二是日志集中,排查问题方便;三是以后想接其他Agent任务,都在同一台机器上管理。
值得提醒的是,云服务器部署要把安全组规则收敛好,不要把管理端口暴露到公网,密钥文件妥善保管。我见过有人图省事,把SSH密码设成纯数字,最后被暴力破解改面的例子。
5.2 日志和失败告警:Agent不干活时怎么发现
Agent框架最大的隐性成本是"异常时静默失败"。我遇到过好几次:模型服务刚好在重启,定时任务跑了一半,结果什么都没输出,也没有报错,因为OpenClaw把那次执行标记成了"完成"。
所以我养成了两个习惯:
- 每个任务执行完,都往日志文件追加一行结果摘要,包含抓到的帖子数、生成的摘要字数和投递状态。
- 异常路径写清晰:抓取数低于阈值要通知,模型超时要通知,投递失败也要通知。宁可多几条告警,也不能让问题攒三天才发现。
这个小习惯让系统真正变得"能托付",我不用每天都亲自检查。
5.3 把Daily Digest扩展成自己的资讯筛选体系
Daily Reddit Digest跑顺之后,我又加了两个变体:一个抓Hacker News的每日Top,一个抓本地新闻站点的标题列表。改动的成本比想象中低很多——只需要新建一个Agent任务,把输入源和Prompt里的版块名换掉,投递逻辑直接复用。
现在我早上打开Telegram,同时收到Reddit技术摘要、Hacker News导读、本地资讯三条消息,各自独立,又共享同一套配置体系。这种"一套框架、多个用例"的扩展方式,我觉得才是OpenClaw这类Agent框架最大的价值:你不需要为每个信息源写一套独立的脚本,而是统一在同一个Agent编排体系里管理。
回到开头那句话,这个用例我最初只是想解决"每天花半小时刷帖"的低效习惯,最后却把整个内容采集、总结、归档、通知的链路都走了一遍,也算搭了一套完全属于自己的资讯处理流水线。如果你也想搭,我的建议是先按第3章的配置原样跑通一遍,再根据自己的阅读习惯改Prompt和投递方式,最后才考虑上服务器做长期运维——顺序反了,很容易初期就陷进细节里放弃。