Files
my-daily/README.md
T

287 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 🪖 军事科技每日摘要系统 V3
完整的军事科技 RSS 抓取 + AI 智能分析 + 增量缓存 + 运行监控系统
## ✨ 完整功能
### 📥 数据抓取
- 🔗 可配置 RSS 源直抓(rss_feeds.txt 管理,支持 100+ 源)
- ⏰ 24 小时时间窗口过滤
- 🔄 同源标题去重(保留跨源对同一事件的不同报道)
- ⚡ ThreadPoolExecutor 并发抓取,内置失败重试
### 🗄️ 增量缓存
- 💾 SQLite 本地缓存:文章翻译/AI分析结果持久化
- 📰 网摘文本缓存:再次运行零 token 消耗
- 🏷️ 分类介绍缓存:按日期+分类独立存储
- 🧹 自动过期清理(7天)+ 表结构自动迁移
### 🌐 智能翻译
- 🔍 自动识别外文文章
- 📝 分步翻译:先标题 → 再正文(仅通过筛选的文章)
- ⚡ 并发翻译(ThreadPoolExecutor
### 🔑 关键词筛选
- 🎯 44 个军事科技专业关键词库
- 📊 命中数排序,文章 >15 篇时自动过滤
### 🤖 AI 智能分析
- ⭐ 多维度评分(技术35% + 战略30% + 信息20% + 时效15%
- 📋 自动分类:今日必看 / 装备动态 / 地区冲突 / 战略政策
- ✍️ 每篇文章 AI 智能摘要(80-120字)
- 🔮 分类深度洞察分析(每类50字综述)
- 🏆 TOP3 必看深度分析
- ⚡ 批量并发评分 + 分类
### 🖼️ 图片生成
- 📄 3800px 超长网摘图片
- 🎨 军事主题视觉设计
- 📊 包含TOP3完整内容
- 💾 自动保存PNG文件
### 📊 运行监控
- ⏱ 各阶段耗时统计,自动输出结构化报表
- 🤖 API 调用量/token 按用途和模型分组统计
- 📰 源抓取成功/失败率一目了然
- 📡 文章统计 + 缓存命中率
## 🚀 快速开始
### 方式一:本地直接运行(推荐)
```bash
# 1. 安装依赖
pip install -r requirements.txt
# 2. 配置环境
cp config/.env.example config/.env
vim config/.env
# 编辑 OPENAI_API_KEY
# 3. 运行
make local
```
### 方式二:Docker 部署
```bash
# 1. 克隆或解压
cd military-digest-v3
# 2. 配置环境
cp config/.env.example config/.env
vim config/.env
# 编辑 OPENAI_API_KEY
# 3. 构建镜像
make build
# 4. 测试运行
make run-once
# 5. 安装定时任务
make install-cron
```
## 📁 目录结构
```
military-digest-v3/
├── scripts/
│ ├── military_daily_report_v3.py # 主入口 — 流程编排
│ └── modules/ # 功能模块包
│ ├── __init__.py # 包初始化 + 统一导出
│ ├── config.py # 配置模块:常量 + AI配置加载
│ ├── utils.py # 工具函数:语言检测/HTML清洗/AI调用/换行
│ ├── rss_fetcher.py # RSS抓取:12源 × 6线程并发
│ ├── translator.py # 翻译处理:中英分离 + 并发翻译
│ ├── keyword_filter.py # 关键词筛选:49词命中排序
│ │ ├── ai_analyzer.py # AI分析:评分/分类/摘要/洞察/网摘生成
│ │ ├── cache.py # SQLite缓存:文章/网摘/分类介绍增量缓存
│ │ ├── monitor.py # 运行监控:阶段耗时/API/AI token调用统计
│ │ ├── pusher.py # 推送模块:企业微信/飞书 webhook 推送
│ │ ├── image_generator.py # 图片生成:TOP3合并3800px长图
│ └── get_chinese_font.py # 字体模块:跨系统中文字体适配
├── config/
│ ├── config.json # 系统配置
│ └── .env.example # 环境变量示例
├── output/ # 输出目录
│ ├── military_report_YYYYMMDD.md # 完整报告(Markdown格式,支持链接、样式)
│ ├── military_webzine_YYYYMMDD.txt # TOP3网摘文本
│ └── military_webzine_YYYYMMDD.png # TOP3网摘合并长图
├── logs/ # 日志目录
├── Dockerfile
├── docker-compose.yml
├── Makefile
└── README.md
```
## 🧩 模块架构
```
military_daily_report_v3.py ← 主入口(流程编排)
├── config.py ← 配置常量,零依赖
├── logger.py ← 统一日志模块
├── cache.py ← SQLite增量缓存,自动迁移
├── monitor.py ← 运行监控统计
├── pusher.py ← 企业微信/飞书推送
├── rss_fetcher.py ← 依赖 config + utils + monitor
├── translator.py ← 依赖 utils
├── keyword_filter.py ← 依赖 config
├── ai_analyzer.py ← 依赖 config + utils
├── image_generator.py ← 依赖 utils + get_chinese_font
└── get_chinese_font.py ← 零依赖
```
### 各模块职责
| 模块 | 行数 | 职责 | 对外导出 |
|------|------|------|----------|
| `config.py` | 90 | RSS源、关键词库、评分维度、分类定义、AI配置加载 | `RSS_FEEDS`, `WECHAT_SOURCES`, `KEYWORDS`, `SCORE_DIMENSIONS`, `CATEGORIES`, `load_ai_config()` |
| `utils.py` | 130+ | 语言检测、HTML清理、时间解析、AI API封装(含监控钩子)、文本换行 | `is_chinese()`, `clean_html()`, `extract_content()`, `parse_pub_time()`, `call_ai()`, `wrap_text()` |
| `rss_fetcher.py` | 100+ | 多线程并行抓取RSS源(MAX_THREADS并发,含2次重试+监控上报) | `fetch_all_feeds()` |
| `translator.py` | 150+ | 中英文分离 + 标题/正文分步AI并发翻译 | `batch_translate_titles()`, `batch_translate_contents()` |
| `keyword_filter.py` | 23 | 44关键词命中计数 → 排序 → Top15筛选 | `keyword_filter()` |
| `ai_analyzer.py` | 240+ | 四维度评分、智能分类、中文摘要、分类洞察、《参考消息》风格网摘生成 | `score_and_classify_article()`, `calculate_weighted_score()`, `generate_category_overview()`, `generate_webzine_for_article()`, `batch_score_and_classify_articles()` |
| `cache.py` | 310+ | SQLite增量缓存:文章处理结果+网摘+分类介绍,支持自动迁移+过期清理+断点续跑 | `get_cache()`, `get_article()`, `save_article()`, `save_article_webzine()`, `get_category_summary()`, `save_category_summary()` |
| `monitor.py` | 160+ | 运行时监控:阶段耗时/AI API调用量+token/源成功率/缓存命中率,结束自动输出报表 | `get_monitor()`, `monitor.stage()`, `monitor.report()` |
| `pusher.py` | 130+ | 企业微信文本/图片/Markdown推送 + 飞书文本推送,主流程末自动触发,失败优雅降级 | `send_daily_push()`, `push_wechat_text()`, `push_wechat_image()`, `push_feishu_text()` |
| `image_generator.py` | 220 | 网摘文本渲染为PNG图片(单篇 + TOP3合并长图) | `create_webzine_image()`, `create_combined_webzine_image()` |
| `get_chinese_font.py` | 50 | 跨系统中文字体自动匹配,支持Windows/Linux/macOS,内置开源字体可选 | `get_chinese_font(size, bold)` |
## ⚙️ 配置说明
### 环境变量 (.env)
| 配置项 | 说明 | 默认值 |
|--------|------|--------|
| OPENAI_API_KEY | OpenAI API 密钥 | - |
| OPENAI_API_BASE | API 地址 | https://api.openai.com/v1 |
| OPENAI_MODEL | AI 分析模型 | gpt-4o-mini |
| WEBZINE_MODEL | 网摘专用模型 | deepseek-v3.2-250518 |
### config.json 配置项
| 配置项 | 说明 | 默认值 |
|--------|------|--------|
| time_window_hours | 时间窗口(小时) | 12 |
| max_articles | 最多保留文章数 | 15 |
| top3_count | TOP3 必看文章数 | 3 |
| wechat_target | 微信接收者ID | - |
| wechat_account | 微信机器人账号 | - |
| enable_wechat_push | 开启微信推送 | true |
| enable_feishu_push | 开启飞书推送 | false |
| enable_image_gen | 开启图片生成 | true |
| enable_txt_gen | 开启TXT文件生成 | true |
### rss_feeds.txt 订阅源配置
所有RSS源都在`config/rss_feeds.txt`文件中管理,不需要修改代码即可增删订阅源:
- 格式:每行 `源名称|RSS地址`
-`#`开头的行是注释,会自动忽略
- 空行会自动跳过
- 修改后直接运行程序,无需重启或改代码
- ✅ 容错保障:文件不存在、为空或格式错误时,自动回退使用内置的12个默认源,不会影响程序运行
- 支持所有标准RSS/Atom格式,中英文源无需区分,系统自动识别翻译
## ⏰ 定时任务
### 方式一:宿主机 crontab
```bash
make install-cron
# 或手动添加
crontab -e
# 加入:0 8 * * * cd /path/to/military-digest-v3 && python3 scripts/military_daily_report_v3.py >> logs/cron.log 2>&1
```
### 方式二:Docker Cron
```bash
docker-compose --profile cron up -d
```
## 🔍 RSS 源列表
1. Defense One - 美国防务新闻
2. NEWUAS - 无人机系统新闻
3. Seapower - 海军力量杂志
4. The War Zone - 战区军事分析
5. 国防科技要闻
6. 战略前沿技术
7. 无人机邦
8. 浮空飞行器
9. 海鹰资讯
10. 渊亭防务
11. 电波之矛
12. 龙牙的一座山
## 📊 输出示例
```
🪖 军事科技每日摘要
📅 2026年05月12日 | 共收录 12 篇
====================
🔥 今日必看 TOP3
====================
1.【美军MQ-9无人机测试发射激光制导火箭弹】
⭐ 综合评分:9.2/10
📰 来源:The War Zone
📝 摘要:美国通用原子公司联合美空军在内华达测试场完成...
🔮 深度洞察:低成本改装令察打无人机获得反无人机能力...
🔗 阅读原文:...
...
```
## 🔄 数据流程
```
main()
├── Step 1: RSS 并行抓取(ThreadPoolExecutor × MAX_THREADS 并发,内置重试)
├── Step 2: 24小时时间窗口过滤
├── Step 3: 同源标题去重
├── Step 4: SQLite 缓存查询(分离已处理/待处理文章)
├── Step 5: 外文标题并发翻译(ThreadPoolExecutor × AI_CONCURRENCY
├── Step 6: 关键词筛选(仅当 >15篇)
├── Step 7: 外文正文并发翻译(仅筛选通过的文章,大幅省 token)
├── Step 8: 批量 AI 评分 + 分类 + 摘要(并发)
├── Step 9: 新处理文章写入 SQLite 缓存
├── Step 10: 合并缓存+新文章,按评分降序
├── Step 11: TOP3 网摘生成(优先缓存命中,支持字数重试,TXT+PNG)
├── Step 12: 四分类整理 + 深度洞察生成(优先缓存命中)
├── Step 13: Markdown 报告输出(全缓存+文件已存在则跳过)
├── Step 14: 多渠道推送(企业微信/飞书 webhook,失败优雅降级)
└── 监控报告输出(阶段耗时/API+token统计/源成功率/缓存命中率)
```
## ✅ 系统要求
- Python 3.8+ 或 Docker
- OpenAI API Key(或兼容API,如火山引擎、DeepSeek等)
- 内存 ≥ 512MB
- 磁盘 ≥ 1GB
## ❓ 常见问题
### 生成的图片中文字体乱码怎么办?
无需额外配置,代码已自动适配所有主流系统的自带中文字体:
- Windows: 自动匹配宋体/黑体/微软雅黑
- Linux: 自动匹配NotoSansCJK/文泉驿微米黑
- macOS: 自动匹配PingFang/黑体
如果需要完全不依赖系统字体,可以下载开源无版权的NotoSansCJK字体放到`scripts/modules/assets/fonts/`目录下:
- 粗体:`NotoSansCJK-Bold.ttc`
- 常规:`NotoSansCJK-Regular.ttc`
### 日志输出在哪里?
日志默认输出到标准错误流,包含INFO/WARNING/ERROR三个级别,运行时会实时打印到控制台,也可以重定向到日志文件:
```bash
python scripts/military_daily_report_v3.py >> logs/runtime.log 2>&1
```
---
*V3 版本 - 全流程重构 + 模块化拆分 + 跨系统字体适配 + 日志标准化 + Markdown报告输出,2026年5月发布*