1. 为什么我要用 OpenClaw 抓 36Kr 做每日 AI 早报
每天手动刷 36Kr 快讯、筛选 AI 相关条目、再整理成一段能看的早报,这件事我坚持了不到一周就放弃了。不是内容不好,而是重复动作太碎:打开网页、滚动、判断哪条算 AI、复制标题、归类、排版。单次五分钟,一个月就是两个多小时,而且状态差的时候还会漏掉重要条目。
OpenClaw 的 browser 能力正好切中这个场景。它不是简单地把网页正文丢给模型总结,而是能真正接管一个受管浏览器:打开指定 URL、等待页面稳定、读取可交互快照、按你的规则提取条目。再配合一个轻量 skill 做清洗和排版,整条链路就能从“看网页”变成“交结果”。
这篇适合三类人:一是刚接触 OpenClaw、想找一个真实可复现案例的;二是已经在用大模型但还没把浏览器自动化跑通的;三是想给自己或团队做一份每日 AI 早报、又不想搭一整套工程系统的。我试过把方案压到最轻:不建 Python 项目、不接数据库、不做复杂调度,全部在 OpenClaw 内完成,需要代码的地方只封装成一个 skill。
核心检索词先摆出来:OpenClaw 是什么、能做什么、适合谁。它是一个支持 browser 受管配置和 skill 扩展的 Agent 运行环境,能打开网页、读取快照、执行多步任务;适合想把浏览器操作自动化、又希望快速看到结果的人。下面从环境准备一路写到手动触发验证。
2. TaoToken 前置:统一 Key 与 API 通道接入
OpenClaw 在跑浏览器任务时,背后仍然要调用大模型来完成“判断哪条是 AI 热点”“按四类整理”“输出日报格式”这些语义工作。如果每个 skill 各自配一套 Key,后面排障会非常痛苦。我的做法是统一走 TaoToken 的 API 通道,一个 Key 覆盖模型对话和后续可能的 coding 场景。
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 地址后面不加 UTM 参数,直接用它作为 base_url 即可。
你需要先拿到 Key。进入控制台创建 API Key,地址是 https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite ,Key 管理页在 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite 。创建后复制那串 sk- 开头的字符串,只显示一次,先存到本地环境变量里。
export TAOTOKEN_API_KEY="sk-你的Key" export TAOTOKEN_BASE_URL="https://taotoken.net/api"如果你后面要长期跑编码类或 Agent 类任务,可以了解 Coding Plan,入口是 https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite 。模型对话的调试入口在 https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_content=models&utm_campaign=rewrite ,接入文档在 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite 。ClaudeCodeAnthropic 相关配置参考 https://taotoken.net/claude-code-anthropic?utm_source=taotoken_aicg_blog_end&utm_content=claude-code-anthropic&utm_campaign=rewrite 。
注意:Key 不要写进 skill 配置文件后提交到公开仓库。用环境变量注入,skill 里只读变量。
3. 可复制配置:OpenClaw browser 与 skill 骨架
3.1 先确认浏览器链路
写 skill 之前,第一件事永远是确认浏览器能不能跑。执行:
openclaw browser status如果显示未启动,就起一个受管浏览器,指定独立 profile:
openclaw browser start --browser-profile openclaw不要一上来就用你日常的浏览器 profile,也不要先折腾复杂配置。受管 profile 的好处是排障轻,出问题直接重启这个 profile 就行。
3.2 手动验证 36Kr 快讯页
浏览器起来后,先手动打开一次,确认页面能读:
openclaw browser --browser-profile openclaw open https://m.36kr.com/newsflashes等页面内容稳定后,看可交互快照:
openclaw browser --browser-profile openclaw snapshot --interactive这一步真正要确认的不是“页面打开了”,而是 OpenClaw 能不能读到有效内容。如果快照里已经能看到快讯标题和摘要,后面就好走。
3.3 skill 配置骨架
下面是一个可复制的 skill 骨架,放在 OpenClaw 的 skills 目录下,文件名用daily_ai_brief.yaml。它做三件事:声明 browser 依赖、定义提取规则、调用模型做归类和排版。
name: daily_ai_brief description: 打开 36Kr 快讯页,提取 AI 相关条目并生成每日早报 version: 1.0.0 browser: profile: openclaw url: https://m.36kr.com/newsflashes wait_until: networkidle snapshot: interactive extract: max_items: 12 min_items: 8 ignore_keywords: - 登录 - 广告 - 下载 App - 评论 - 分享 categories: - AI - 科技公司 - 芯片算力 - 其他 model: provider: taotoken base_url: ${TAOTOKEN_BASE_URL} api_key: ${TAOTOKEN_API_KEY} prompt: | 你是科技早报编辑。基于下面的页面文本,完成: 1. 提取 8 到 12 条最值得关注的科技热点 2. 忽略登录、广告、下载 App、评论、分享等无关内容 3. 按 AI、科技公司、芯片算力、其他 四类整理 4. 输出一份简短日报,包含:今日判断、热点列表、建议关注 页面文本: {{snapshot_text}} output: format: markdown title: 今日科技热点日报这里的关键是prompt里把任务边界写死:抓多少条、过滤什么、怎么归类、输出什么结构。不要写“帮我看看今天有什么热点”这种泛提示,泛提示会让结果每次都不一样。
3.4 接入片段说明
model段里的base_url和api_key都从环境变量读,这样 skill 文件本身可以安全地放进版本管理。如果你用的是 OpenClaw 的全局模型配置,也可以把这段抽到全局 config 里,skill 只引用 provider 名。两种方式都行,我倾向后者,改一处全局生效。
4. 验证请求:手动触发一次抓取与早报输出
配置写完后,先手动触发一次,不要急着加定时任务。
openclaw skill run daily_ai_brief --browser-profile openclaw执行后你会看到几个阶段:browser 打开页面、等待 networkidle、抓取 interactive 快照、把快照文本传给模型、模型返回日报。如果一切正常,终端会输出类似下面的结果:
# 今日科技热点日报 ## 今日判断 今天的热点主要集中在 AI、科技公司动态和芯片算力三个方向。 ## 热点列表 1. AI Agent 相关产品热度继续提升 2. 大模型商业化落地讨论增多 3. 芯片与算力仍然是产业关注重点 4. 科技公司融资、并购和组织调整消息密集 ## 建议关注 - 做 AI 应用的,优先看 AI 类热点 - 做基础设施的,重点看芯片和算力 - 做产品和运营的,重点看行业趋势与公司动作如果输出结构对但条目偏少,先把min_items调到 8 再跑一次;如果条目里混进了广告或登录提示,把对应关键词补进ignore_keywords。这一步就是调参,不用改代码。
验证通过后,再加定时任务。在 OpenClaw 的计划任务里加一条:每天早 8 点执行daily_ai_brief,输出到 Web UI 对话框。如果想推到飞书等即时通信工具,在已配置好的工具对话里创建这个任务即可。
5. 本篇常见错排查
5.1 browser status 显示未启动
最常见的原因是 profile 名写错。openclaw browser start --browser-profile openclaw里的 profile 名要和后续命令里的完全一致。如果之前起过别的 profile,先openclaw browser stop --browser-profile 旧名再起新的。
5.2 snapshot 抓不到内容
页面可能还没稳定。把wait_until从networkidle改成显式等待,或者在 skill 里加一个wait_for_selector,等快讯列表的容器出现再抓。另外确认你打开的是m.36kr.com/newsflashes而不是首页,快讯页信息密度更高、噪音更少。
5.3 模型返回 401 或鉴权失败
先检查环境变量有没有真正注入到 OpenClaw 的运行环境里。echo $TAOTOKEN_API_KEY能打印出来不代表 skill 进程能读到,尤其是用 systemd 或容器跑的时候。把变量写进对应的 env 文件,或者用 OpenClaw 的 secrets 机制注入。base_url 确认是https://taotoken.net/api,不要多加路径。
5.4 输出格式每次都不一样
prompt 里的结构约束不够硬。把“包含今日判断、热点列表、建议关注”改成明确的 Markdown 模板,并在 prompt 末尾加一句“严格按上述三级标题输出,不要增删章节”。模型对格式的服从度会明显提升。
5.5 定时任务没触发
先确认计划任务里的 skill 名和实际注册名一致,再确认执行时间用的是本地时区。如果任务执行了但没看到输出,检查输出目标是不是当前 Web UI 会话;换个会话或推到飞书再试。
6. 把这条链路用起来
跑通一次之后,这条链路的扩展方向很自然:把url换成多个站点就是多平台热点监控;把prompt改成选题角度就是内容生产流水线;把输出推到飞书就是团队早报。但第一步永远是先让最小闭环稳定跑起来。
如果你在接入阶段卡在 Key 或 base_url 上,直接看接入文档 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite ,Key 在 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite 创建。想先验证模型返回是否正常,用模型对话入口 https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_content=models&utm_campaign=rewrite 发一条测试消息。长期跑编码或 Agent 任务的话,Coding Plan 在 https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite 。
最后留一个我踩过的坑:skill 里的max_items不要设太大。12 条是快讯页一屏能覆盖的量,设到 30 条模型会开始编造或重复。宁可少而准,也不要多而乱。