个人新闻 Agent:按 keywords.md 里描述的主题,每周从 RSS / Google News / RSSHub 拉新闻,
用 DeepSeek 做相关性打分和中文摘要,通过 PushPlus 推送到微信。
sources.py → 拉 RSS / Google News / RSSHub,统一成 Article
state.py → 用 state/sent.json 去重已推过的 URL hash
filter.py → DeepSeek 批量打分 + 写 top N 中文摘要
push.py → PushPlus markdown 推送
main.py → 编排 + 命令行入口
webhook.py → PushPlus 微信回调,用户发关键词触发对应板块推送
每周固定日期推送对应板块,非排期日不运行:
| 星期 | 板块 | 说明 |
|---|---|---|
| 周一 | governance | AI 治理 |
| 周二 | 微信公众号精选 | |
| 周三 | data | AI 数据 |
| 周四 | 微信公众号精选 | |
| 周五 | industry | AI 行业落地 |
| 周日 | agent | AI Agent 动态 |
排期表在 config.yaml 的 schedule.weekday_category 中配置。
周二/周四走的是微信公众号 + 官网流程:抓
WeChat and website list.md里维护的来源—— 微信公众号取近 48 小时、官网链接取近 24 小时内发布的文章,不做相关性打分, 直接用 DeepSeek 写摘要后推送。详见下方「微信公众号 + 官网订阅」。
# 1. 装依赖
pip install -r requirements.txt
# 2. 配两个环境变量(密钥)
export DEEPSEEK_API_KEY=sk-...
export PUSHPLUS_TOKEN=... # https://www.pushplus.plus 扫码登录后拿
# 3. 干跑(不实际推送,只打印 markdown 到控制台)
python -m news_agent.main --dry-run
# 4. 正式跑一次(会真的推到你的微信)
python -m news_agent.main
# 5. 手动指定板块(忽略 weekday 排期)
python -m news_agent.main --category governance
# 6. 模拟某个 weekday(0=周一..6=周日)
python -m news_agent.main --weekday 0
# 7. 只测试推送是否畅通(不抓新闻、不调 DeepSeek)
python -m news_agent.main --test-push除了定时推送,还支持在微信「推送加」公众号里发关键词触发:
# 启动 webhook 服务
python -m news_agent.webhook # 默认监听 0.0.0.0:8088
python -m news_agent.webhook --port 9000 # 自定义端口在 PushPlus 后台 → 功能设置 → 消息回调,填入 http://你的服务器IP:8088/。
支持的关键词:AI治理、AI数据、AI行业、AI Agent、微信公众号、帮助。
- 把仓库推到 GitHub(public 或 private 都行,Actions 都免费够用)
- 在 GitHub 仓库 → Settings → Secrets and variables → Actions → New repository secret,加两个:
DEEPSEEK_API_KEYPUSHPLUS_TOKEN
- 默认每周一/三/五/日 UTC 00:00(北京时间 08:00)自动运行,触发延迟 5-15 分钟正常
- 想改时间编辑
.github/workflows/daily.yml里的cron - 手动触发:仓库 → Actions → Daily News Push → Run workflow(可选指定板块或测试推送)
跑完 workflow 会自动 commit state/sent.json 和 output/ 回仓库,保证下次跑能去重。
关注主题描述。DeepSeek 读这份做打分。这是你最常编辑的文件。 建议写得详细一点,多举例子,越具体打分越准。
周二/周四要自动阅读的来源,分两个小节,各用不同时间窗口:
- 「## 微信公众号」→ 取近 48h(
wechat.max_age_hours) - 「## 官网」→ 取近 24h(
wechat.website_max_age_hours)
每行 名称 或 名称 | 地址:http 开头是 RSS feed(抓多篇,最推荐)或普通网页(当单页文章抓);
/ 开头是 RSSHub 路由;只写名称则经 OPML 自动解析。改某条窗口,把它在两个小节间移动即可。
默认严格模式 wechat.require_published: true:丢弃无发布时间的条目(官网首页/微信链接等单页抓取),
确保推送的都是"窗口内确有发布时间"的文章。
微信公众号没有官方 API,名称→地址要靠 OPML 这类映射中转。默认 OPML 是 wechat2rss 公共合集, 只含约 326 个安全类公众号,量子位/机器之心等 AI 媒体不在其中。要订阅任意公众号: 自建 wechat2rss / werss / wewe-rss,把你的 OPML 加到
wechat.resolver.opml_urls, 或对个别号在清单里写名称 | RSS地址手动兜底。微信自家链接(mp.weixin.qq.com)抓不到(返回验证页)。
schedule.weekday_category:每周排期(哪天跑哪个板块)push.max_articles/push.min_score:每次最多推几条 / 相关度阈值wechat.max_articles:微信公众号+官网板块每次最多推几条(按发布时间取最新,不打分)wechat.max_age_hours:微信公众号时间窗口(默认 48 小时)wechat.website_max_age_hours:官网链接时间窗口(默认 24 小时)wechat.require_published:严格模式,丢弃无发布时间的条目(默认 true)wechat.resolver.opml_urls:名称→RSS 地址的 OPML 映射源(自建服务后填自己的 OPML)deepseek.scorer_model/summarizer_model:换模型在这里改google_news_queries:Google News 搜索关键词(按板块分组)rss_feeds:直接订阅的 RSS 源(新增源加这里)rsshub.routes:X 推主、微信公众号通过 RSSHub 包装的路由sources.max_age_hours:文章时间窗口(默认 168h = 7 天)
自动维护的去重表,不用手动编辑。30 天前的记录会自动清理。
- 觉得推得太少 / 太多 → 调
min_score(5.5 宽松,7.0 严格) - 推的内容偏题 → 编辑
keywords.md把"过滤规则"写得更清楚 - 要加 X / 微信公众号 → 在
rsshub.routes加路由,查 RSSHub 文档
直接在 config.yaml 的 rss_feeds 加一项:
rss_feeds:
- name: "你的源名称"
url: "https://example.com/feed"- Google News RSS 没有官方 API,遇到风控可能短暂返回空。脚本会自动跳过失败源。
- RSSHub 公共实例
rsshub.app不稳定。如果重度用 X / 公众号,建议自部署。 - PushPlus 免费版每天 200 条配额,正常使用够。