NewsAPI DeepSeek Markdown Playwright 最后更新:

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 转换内容为图文卡片发送

系统架构

  1. 配置加载:config_loader.py 读取 config/digest.json 与 config/subscribers.json,验证字段并应用默认值。
  2. 新闻采集:digest_utils.collect_articles 根据 news_queries 递归执行 top-headlines/everything 请求并去重语种/发布时间。
  3. 摘要生成:summarize_articles 调用 DeepSeek,返回 JSON 结构的双语摘要、要点与术语说明。
  4. Markdown & 邮件:write_digest 保存 digests/,mailer.send_digest_via_email 负责 Markdown→HTML、Playwright 截图、SMTP 发送与 Dry Run 跳过。
  5. 状态与调度: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

**简体中文摘要**

示例摘要正文...

邮件示例

DailyNews 邮件示例
DailyNews 通过 Playwright 将 Markdown 转为图文卡片,嵌入邮件正文。

开发进程

  • ✅ 配置驱动的 digest 与订阅者定义
  • ✅ NewsAPI + OpenAI/DeepSeek 的双语摘要
  • ✅ Markdown 输出 & Playwright 图文卡片
  • ✅ SMTP 邮件(支持 Dry Run 且记录日志)

项目文档