DailyNews · 你的新闻助手
DailyNews 以 config/digest.json、config/subscribers.json 以及环境变量为核心,自动拉取 NewsAPI 的头条与主题文章,用 DeepSeek 生成中英文摘要,再把 Markdown 转为 图文卡片通过 邮件 发送。
核心管线:调度配置 → NewsAPI 请求 → digest_utils 结构化摘要 → Markdown 输出 + Playwright 截图 → mailer.py
发送邮件,同时写入 logs/ 与 config/run_state.json 支持增量。
项目概览
DailyNews 以 config/digest.json 与 config/subscribers.json 定义 digest、语言和订阅者,结合环境变量控制 NewsAPI、DeepSeek 与 SMTP,持续生成 Markdown + 图文邮件,保持可配置、可审计。
Why - 解决的问题
- 需要可靠的 NewsAPI/主题配置与状态管理
- 不同订阅者关注不同话题,希望在不同投递时间收到邮件
- 转换为图片发送邮件更易于分享阅读
What - 核心功能
- 🌍 collect_articles 支持 top-headlines 与 everything 多语言查询
- 📝 config/subscribers.json 为订阅者个性化
- 📮 mailer.send_digest_via_email 转换内容为图文卡片发送
系统架构
- 配置加载:config_loader.py 读取 config/digest.json 与 config/subscribers.json,验证字段并应用默认值。
- 新闻采集:digest_utils.collect_articles 根据 news_queries 递归执行 top-headlines/everything 请求并去重语种/发布时间。
- 摘要生成:summarize_articles 调用 DeepSeek,返回 JSON 结构的双语摘要、要点与术语说明。
- Markdown & 邮件:write_digest 保存 digests/,mailer.send_digest_via_email 负责 Markdown→HTML、Playwright 截图、SMTP 发送与 Dry Run 跳过。
- 状态与调度:config/run_state.json 记录 last_run,main.py/headline.py/topic.py 与 scripts/*.sh 可由 cron 调度,logs/news_digest.log 追踪上下游信息。
设计理念:各模块职责明确:配置与订阅者驱动运行,摘要逻辑封装在 digest_utils,邮件和日志独立,方便未来拓展更多查询、输出或 UI。
技术栈与工具
核心依赖
- 🐍 Python 3.12+
- 🌐 httpx(NewsAPI 请求)
- 🧠 openai / DeepSeek(摘要生成)
- 📄 markdown + beautifulsoup4(Markdown→HTML)
- 📷 playwright(Story 卡片截图,嵌入邮件)
框架与工具
- 📦 uv(依赖管理与 CLI 运行)
- 🚪 smtplib + ssl(QQ SMTP 默认,环境变量可覆盖)
- 🗂️ pathlib / json(配置与状态读写)
- 🧾 logging(logs/news_digest.log)
配置示例
每个 digest 在 config/digest.json 中声明 ID、mode、摘要模板与多组 news_queries:
{
"digests": [
{
"id": "ai",
"mode": "topic",
"display_name": "Artificial Intelligence",
"news_queries": [
{
"endpoint": "everything",
"q": "(\"人工智能\" OR \"AI\" OR \"大模型\")",
"language": "zh",
"pageSize": 20,
"sortBy": "publishedAt"
},
{
"endpoint": "everything",
"q": "(\"artificial intelligence\" OR \"AI\" OR \"LLM\")",
"language": "en",
"pageSize": 20,
"sortBy": "publishedAt"
}
],
"email": {
"subject_template": "AI Briefing - {local_dt:%Y-%m-%d %H:%M}"
},
"output": {
"filename_prefix": "ai-briefing"
}
}
]
}
同一 digest 可包含多条 news_queries(不同语言、endpoint、关键词),config/subscribers.json 决定谁会收到该 digest,config/run_state.json 跟踪 last_run,避免重复。
命令示例
通过 uv 运行入口脚本即可生成 digest,借助脚本可定时执行:
基础流程
uv sync
python -m playwright install chromium
uv run main.py
专项执行
uv run main.py headlines
uv run main.py topics
scripts/run_daily_headlines.sh
scripts/run_topics.sh
运行后会在 digests/ 生成 Markdown,并通过 mailer.send_digest_via_email 发送至 config/subscribers.json 中的订阅者或 DAILYNEWS_EMAIL_TO。
Markdown 示例
# 头条简报 - 2024-11-09 08:00
## Stories
### 某事件标题 — The Global Times
- Published: 2024-11-09T07:45:00Z
- Language: English
- Endpoint: top-headlines
- Original: https://example.com/article
**Key Takeaways**
- 要点 1
**简体中文摘要**
示例摘要正文...
邮件示例
开发进程
- ✅ 配置驱动的 digest 与订阅者定义
- ✅ NewsAPI + OpenAI/DeepSeek 的双语摘要
- ✅ Markdown 输出 & Playwright 图文卡片
- ✅ SMTP 邮件(支持 Dry Run 且记录日志)