【踩坑系列1】每天推送的 AI 资讯,全是假的!我扒了 OpenClaw 的底
大家好,我是测试员周周,这是【踩坑】系列的第一篇:每天推送的 AI 资讯,全是假的!我扒了 OpenClaw 的底,后续会把我真实踩坑经历陆续分享
导读:每天定时推送的技术资讯,连续几天内容一模一样?我深入排查,发现 OpenClaw 生成的脚本全是硬编码的假数据。本文完整记录从发现问题到彻底解决的全过程。
📖 开篇:一个 suspicious 的发现
事情要从几天前说起。
我每天早上都会收到 Hermes 定时推送的技术资讯,从 6:30 到 9:10,一共 12 个时段,涵盖 7 种不同类型的内容:
-
类型 A:技术趋势预警
-
类型 B:完整资讯汇总
-
类型 C:行业赋能专题
-
类型 D:市场洞察分析
-
类型 E:海外动态追踪
-
类型 F:职业发展机会
-
类型 G:大厂工具速递
看起来非常完善,对吧?
直到有一天,我突然发现:这已经是连续第 3 天收到一模一样的内容了。
TEXT复制
❌ 第 1 天:项目 X Stars 133,440
❌ 第 2 天:项目 X Stars 133,440 (没变?)
❌ 第 3 天:项目 X Stars 133,440 (还是没变?)
作为一个测试老兵,我的职业敏感度告诉我:这不对劲。
GitHub 的 Stars 数怎么可能 3 天一动不动?而且每天推送的论文标题也完全一样。
只有一个可能:这些数据是假的。
🔍 第一步:定位脚本位置
我首先找到了这些定时任务的脚本位置:
BASH复制
/home/zhou/morning_ai/
├── 630_type_a.sh
├── 700_type_b.sh
├── 715_type_c.sh
├── 725_type_d.sh
├── 740_type_e.sh
├── 800_type_f.sh
├── 810_type_g.sh
├── 815_type_c_2.sh
├── 825_type_d_2.sh
├── 840_type_e_2.sh
├── 900_type_f_2.sh
└── 910_type_g_2.sh
一共 12 个脚本,对应 12 个时段、7 种不同类型的推送(部分类型有早晚两个时段)。
🔬 第二步:分析脚本内容
我让Hermes打开了其中一个脚本(8点25的),想看看它是怎么抓取数据的。
然后我震惊了。
BASH复制
#!/bin/bash
<h1>7:40 - 类型 E 内容</h1>
<h1>Auto-generated by OpenClaw for morning tech news automation</h1>
export PATH="/home/zhou/.npm-global/bin:$PATH"
<h1>Output the 7:40 content directly to stdout</h1>
cat << 'EOF'
🕐 <strong>7:40 - 类型 E 内容</strong>
<h2>🔥 热门技术追踪</h2>
<h3><strong>项目 A</strong> ⭐ NEW!</h3>
<ul>
<li><strong>简介</strong>: 新兴开源框架</li>
<li><strong>热度</strong>: GitHub Trending 前列,社区讨论活跃</li>
<li><strong>特点</strong>: 技术创新明显</li>
</ul>
<h3><strong>项目 B</strong> ⭐ HOT!</h3>
<ul>
<li><strong>简介</strong>: 多智能体框架</li>
<li><strong>热度</strong>: GitHub Star 快速增长</li>
</ul>
...(省略)
EOF

看到了吗?整个脚本就是用 cat << 'EOF' 输出的硬编码文本!
我立刻检查了其他 11 个脚本,结果让人大跌眼镜:
|
脚本 |
内容来源 |
是否有真实 API 调用 |
|---|---|---|
|
630_type_a.sh |
硬编码 |
❌ 无 |
|
700_type_b.sh |
硬编码 |
❌ 无 |
|
715_type_c.sh |
硬编码 |
❌ 无 |
|
725_type_d.sh |
硬编码 |
❌ 无 |
|
740_type_e.sh |
硬编码 |
❌ 无 |
|
800_type_f.sh |
硬编码 |
❌ 无 |
|
810_type_g.sh |
硬编码 |
❌ 无 |
|
815_type_c_2.sh |
硬编码 |
❌ 无 |
|
825_type_d_2.sh |
硬编码 |
❌ 无 |
|
840_type_e_2.sh |
硬编码 |
❌ 无 |
|
900_type_f_2.sh |
硬编码 |
❌ 无 |
|
910_type_g_2.sh |
硬编码 |
❌ 无 |
12 个脚本,全部是假的。
📊 第三步:验证假数据
为了确认我的判断,我让Hermes写了一个简单的 Python 脚本来验证:
import subprocess
<h1>检查所有脚本是否包含真实 API 调用</h1>
scripts = [
"/home/zhou/morning_ai/700_type_b.sh",
"/home/zhou/morning_ai/740_type_e.sh",
# ... 其他脚本
]
for script_path in scripts:
with open(script_path, 'r') as f:
content = f.read()
has_curl = 'curl' in content
has_wget = 'wget' in content
has_heredoc = "cat << 'EOF'" in content
print(f"{script_path}:")
print(f" - 硬编码内容:{'✅ 是' if has_heredoc else '❌ 否'}")
print(f" - curl 请求:{'✅ 是' if has_curl else '❌ 否'}")
运行结果:
TEXT复制
7am_full_ai_news.sh:
- 硬编码内容:✅ 是
- curl 请求:❌ 否
740_overseas_trending.sh:
- 硬编码内容:✅ 是
- curl 请求:❌ 否
...(所有脚本都是同样结果)
实锤了。这些脚本没有任何网络请求,全是写死的假内容。
🛠️ 第四步:重写真实脚本
既然发现了问题,那就解决它。
我的目标是:让每个脚本都真实抓取实时数据。
4.1 创建公共数据抓取模块
当然这一套全让Hermes干完了。
4.2 批量重写所有脚本
|
时段 |
新脚本 |
数据源 |
|---|---|---|
|
6:30 |
630_type_a.py |
GitHub API |
|
7:00 |
700_type_b.py |
ArXiv API + GitHub API |
|
7:15 |
715_type_c.py |
GitHub API |
|
7:25 |
725_type_d.py |
Hacker News + GitHub Issues |
|
7:40 |
740_type_e.py |
GitHub API |
|
8:00 |
800_type_f.py |
GitHub API + Hacker News |
|
8:10 |
810_type_g.py |
GitHub API |
|
8:15 |
815_type_c_2.py |
GitHub API |
|
8:25 |
825_type_d_2.py |
Hacker News |
|
8:40 |
840_type_e_2.py |
GitHub API |
|
9:00 |
900_type_f_2.py |
GitHub API |
|
9:10 |
910_type_g_2.py |
GitHub API |
🧪 第五步:测试验证
重写完成后,我立即测试了所有脚本:
这次的数据是真实的了!
📤 第六步:更新定时任务
脚本重写完成后,需要更新 Hermes 的 cronjob 配置,让它们指向新的 Python 脚本。
我更新了所有 12 个定时任务:
PYTHON复制
<h1>示例:更新 7:40 的 cronjob</h1>
cronjob(
action='update',
job_id='b20c2bd290a2',
prompt='执行 Python 脚本并原封不动转发完整输出到飞书。\n\n'
'脚本路径:/home/zhou/morning_ai/740_type_e.py\n\n'
'关键要求:\n'
'1. 执行 python3 /home/zhou/morning_ai/740_type_e.py\n'
'2. 禁止总结/截断 —— 完整展示脚本的全部 stdout 输出\n'
'3. 脚本会真实抓取 GitHub 实时数据\n\n'
'交付目标:origin'
)
🎯 最终测试:全部推送
最后,我执行了一次完整测试,把 12 个脚本全部运行并推送到飞书群:
PYTHON复制
scripts = [
("6:30", "/home/zhou/morning_ai/630_type_a.py"),
("7:00", "/home/zhou/morning_ai/700_type_b.py"),
# ... 其他 10 个脚本
]
for time_slot, script_path in scripts:
result = subprocess.run(['python3', script_path], ...)
send_to_feishu(result.stdout)
推送结果:
TEXT复制
6:30: ✅ 推送成功
7:00: ✅ 推送成功
7:15: ✅ 推送成功
7:25: ✅ 推送成功
7:40: ✅ 推送成功
8:00: ✅ 推送成功
8:10: ✅ 推送成功
8:15: ✅ 推送成功
8:25: ✅ 推送成功
8:40: ✅ 推送成功
9:00: ✅ 推送成功
9:10: ✅ 推送成功
总计:12/12 推送成功
📈 改造前后对比
|
项目 |
改造前 |
改造后 |
|---|---|---|
|
数据来源 |
❌ 硬编码假数据 |
✅ 实时 API 抓取 |
|
GitHub Stars |
❌ 编造的数字 |
✅ 真实 Stars 数 |
|
论文标题 |
❌ 编造的标题 |
✅ ArXiv 最新论文 |
|
更新时间 |
❌ 固定不变 |
✅ 每次执行都更新 |
|
网络请求 |
❌ 0 个 |
✅ 多次 API 调用 |
|
脚本语言 |
Bash |
Python |
💡 经验教训
1. 不要盲目相信自动化工具
OpenClaw 生成的脚本看起来非常完善,但实际上全是假数据。自动化可以提高效率,但不能替代人工验证。
2. 测试人员的职业敏感度很重要
如果不是我注意到"连续 3 天内容一样",这个假资讯系统可能还会继续运行很久。保持怀疑精神,是测试人员的核心素养。
3. 数据真实性是底线
对于资讯类应用,数据的真实性是生命线。宁可少推送,也不能推送假数据。
4. 重构要彻底
发现问题后,我没有选择"打补丁",而是彻底重写所有脚本。短期看工作量大了,但长期看避免了后续更多问题。
📢 下篇预告
下一篇,我会写《【踩坑系列2】删快照前必看!VirtualBox 报错 E_FAIL 的终极解决方案》,Hermes系列和评测系列明天会持续更新,这俩系列都是暂定10篇+,目前Hermes完成了6篇,评测系列完成了1篇;
喜欢这篇文章吗?欢迎点赞、转发、关注!
你的支持是我持续创作的动力 💪
作者:测试员周周testzhouzhou,14 年测试经验,专注 AI+ 测试实战
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)