# 🪖 军事科技每日摘要系统 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月发布*