基于 CNB 云原生构建平台打造的科技资讯自动化推送系统,每天早上8点自动抓取过去24小时的科技资讯并推送到微信。
| 特性 | 说明 |
|---|---|
| 🌐 多源聚合 | 整合12个国内外顶级科技媒体源 |
| 🔄 智能去重 | 基于文章内容的MD5去重机制 |
| ⏰ 时间过滤 | 仅抓取过去24小时内的新文章 |
| 💾 本地缓存 | 利用CNB的volume功能实现持久化缓存 |
| 🚀 定时触发 | 支持每天固定时间和手动触发 |
| 📦 任务分离 | 抓取和推送任务独立,便于维护 |
24hNews/ ├── .cnb.yml # CNB 工作流配置文件(核心) ├── scripts/ │ ├── fetch_tech_news.py # 资讯抓取脚本 │ └── push_to_wechat.py # 微信推送脚本 ├── README.md # 项目文档 └── PROJECT_BLOG.md # 项目博客
访问 sct.ftqq.com 微信扫码登录,获取你的 SendKey
在 CNB 平台创建密钥仓库,添加环境变量配置文件:
# serverchan_key.yml
SERVERCHAN_SENDKEY: "你的SendKey"
修改 .cnb.yml 中的导入路径:
imports:
- cnb.cool/你的用户名/你的仓库名/-/blob/main/secrets/serverchan_key.yml
git add .
git commit -m "Add CNB tech news workflow"
git push origin main
就这么简单!✨
| 方式 | 说明 |
|---|---|
| 🕐 定时触发 | 每天早上8点自动执行(推荐) |
| 📤 代码推送 | 推送到 main 分支触发 |
| 👆 手动触发 | 在 CNB 平台点击"手动触发" |
编辑 .cnb.yml 中的 cron 表达式:
schedule:
- cron: "0 8 * * *" # 每天早上8点
# 改为每天早上9点
- cron: "0 9 * * *"
在 .cnb.yml 中修改环境变量:
stages:
- name: 抓取科技资讯
env:
HOURS_TO_FETCH: 24 # 抓取过去24小时
MAX_ARTICLES_PER_FEED: 8 # 每个源最多8篇
MAX_ARTICLES_TO_PUSH: 20 # 总共推送20篇
编辑 scripts/fetch_tech_news.py:
RSS_FEEDS = [
"https://36kr.com/feed",
"https://your-new-feed.com/feed", # 添加新源
# ... 其他源
]
| 特性 | CNB | GitHub Actions |
|---|---|---|
| 配置文件 | 单文件 .cnb.yml | 多文件 workflows |
| 运行环境 | Docker 容器 | 虚拟机/容器 |
| 本地缓存 | volumes 原生支持 | 需要 actions/cache |
| 密钥管理 | 独立密钥仓库 | Repository Secrets |
| 资源限制 | 可自定义 CPU/内存 | 固定规格 |
┌─────────────────────────────────────────┐ │ CNB 触发器 (08:00) │ └────────────────┬────────────────────────┘ ↓ ┌─────────────────────────────────────────┐ │ Pull 代码仓库 │ └────────────────┬────────────────────────┘ ↓ ┌─────────────────────────────────────────┐ │ Docker 容器 (python:3.11-slim) │ └────────────────┬────────────────────────┘ ↓ ┌─────────────────────────────────────────┐ │ 阶段1: 安装依赖 │ └────────────────┬────────────────────────┘ ↓ ┌─────────────────────────────────────────┐ │ 阶段2: 抓取资讯 │ │ ├─ 从RSS源获取文章 │ │ ├─ 时间过滤(24小时内) │ │ ├─ 去重处理(本地缓存) │ │ └─ 保存到临时JSON文件 │ └────────────────┬────────────────────────┘ ↓ ┌─────────────────────────────────────────┐ │ 阶段3: 推送到微信 │ │ ├─ 读取临时JSON文件 │ │ ├─ 智能翻译(非中文内容) │ │ ├─ 生成Markdown摘要 │ │ └─ 通过Server酱推送到微信 │ └────────────────┬────────────────────────┘ ↓ ┌─────────────────────────────────────────┐ │ 工作流完成 ✅ │ └─────────────────────────────────────────┘
1. 持久化缓存
runner:
volumes:
- /cache/tech_news # CNB volume 功能
用于存储已推送文章的哈希值,避免重复推送。
2. 环境变量隔离
imports:
- cnb.cool/tech-news-config/-/blob/main/secrets/serverchan_key.yml
密钥与代码分离,提高安全性。
3. 任务解耦
stages:
- name: 抓取科技资讯
script: python scripts/fetch_tech_news.py
- name: 推送到微信
script: python scripts/push_to_wechat.py
抓取和推送分离,便于独立调试和扩展。
| 项目 | 说明 |
|---|---|
| 原因 | 密钥仓库配置错误或路径不正确 |
| 解决 | 检查 .cnb.yml 中的 imports 路径,确认密钥仓库中存在 serverchan_key.yml,验证 SendKey 是否有效 |
可能原因:
解决方案:
/cache/tech_news/pushed_articles.json 中的历史记录| 项目 | 说明 |
|---|---|
| 原因 | 缓存机制失效 |
| 解决 | 检查 volume 路径配置是否正确,清空缓存重新运行,查看文章哈希生成逻辑是否正常 |
创建不同的密钥配置:
# 生产环境 - serverchan_key_prod.yml
SERVERCHAN_SENDKEY: "生产环境Key"
# 测试环境 - serverchan_key_test.yml
SERVERCHAN_SENDKEY: "测试环境Key"
在 .cnb.yml 中根据分支选择配置:
main:
push:
imports:
- cnb.cool/config/-/blob/main/prod/serverchan_key.yml
staging:
push:
imports:
- cnb.cool/config/-/blob/main/test/serverchan_key.yml
修改 scripts/push_to_wechat.py,添加其他推送方式:
def push_to_multiple_platforms(title: str, content: str):
# 微信推送
send_to_wechat(title, content, sendkey)
# 钉钉推送
send_to_dingtalk(title, content, webhook)
# 邮件推送
send_to_email(title, content, email)
# 1. 安装依赖
pip install feedparser requests schedule
# 2. 设置环境变量
export SERVERCHAN_SENDKEY="你的SendKey"
# 3. 测试抓取
python scripts/fetch_tech_news.py
# 4. 测试推送
python scripts/push_to_wechat.py
使用多线程加速 RSS 抓取:
import concurrent.futures
def fetch_all_feeds_concurrently():
with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
futures = [executor.submit(parse_rss_feed, url) for url in RSS_FEEDS]
results = [f.result() for f in futures]
return results
在 .cnb.yml 中添加缓存配置:
stages:
- name: 构建缓存
type: docker:cache
options:
dockerfile: cache.dockerfile
by:
- requirements.txt
| 类型 | 建议 |
|---|---|
| 🔑 密钥管理 | 永远不要将 SendKey 提交到代码仓库,定期轮换密钥,使用独立的密钥仓库 |
| 🛡️ 访问控制 | 限制 CNB 平台的访问权限,为不同环境设置不同的密钥 |
| 📝 日志脱敏 | 避免在日志中输出密钥信息,对敏感信息进行脱敏处理 |
欢迎提交 Issue 和 Pull Request!
MIT License
如有问题,请在 CNB 平台 或 GitHub Issues 中反馈。
Made with ❤️ by HunLi
2026年寒假