Nek1yZakhar/MIB-OSINT-Aggregator
GitHub: Nek1yZakhar/MIB-OSINT-Aggregator
一个利用混合AI管道从219个信息源中自动采集、过滤并发布国际信息安全新闻摘要的OSINT监控系统。
Stars: 2 | Forks: 0
# 🛡️ OSINT Aggregator MIB
[](#)
[](#)
[](#)
[](#)
## 📌 目录
- [🛡️ 项目概述](#️-суть-проекта)
- [🏗️ 系统流程图](#️-блок-схема-системы)
- [🛠️ 技术栈](#️-технологический-стек)
- [📊 当前指标](#-текущие-метрики)
- [📚 文档导航](#-навигация-по-документации)
- [🚀 快速开始](#-быстрый-старт)
- [🌐 生产环境](#-production)
- [🌐 配套仓库:展示台](#-companion-репозиторий-витрина)
- [📁 项目结构](#-структура-проекта)
- [⚠️ 已知限制](#️-известные-ограничения)
## 🛡️ 项目概述
自动化收集、AI 过滤并发布国际信息安全的新闻系统:219 个信息源 → 每日 Telegram TOP-50 简报。
## 🏗️ 系统流程图
```
[ VPS: Cron 05:00 МСК ]
│
▼
[ src/parser.py ] ──(RPC upsert)──▶ [ Supabase DB ]
CascadeExtractor (Playwright + Camoufox + Nodriver)
Concurrency: 5 / asyncio │
│
[ src/digest_v2.py ] ◀─(subprocess)
E5-large + LLM Scoring
qwen3-235b + deepseek
Перевод → title_ru
│
▼
[ Telegram Канал ]
```
详细的架构、LLM pipeline 和数据库结构 → [docs/ARCHITECTURE.md](file:///C:/Users/Admin/Desktop/Parser/docs/ARCHITECTURE.md)
## 🛠️ 技术栈
| 层级 | 技术 |
|---|---|
| Core | Python 3.12 · Playwright · Camoufox (WAF Bypass) · Nodriver · BeautifulSoup4 · lxml · httpx (支持 HTTP/2) |
| Embeddings | `intfloat/multilingual-e5-large` (本地,CPU) |
| 编排 | Cron → parser.py → digest_v2.py (subprocess) |
| 数据库 | Supabase (PostgreSQL) |
| LLM | `qwen/qwen3-235b-a22b` · `deepseek/deepseek-chat-v3.1` (OpenRouter) |
| LLM 结构化输出 | `instructor` (Mode.MD_JSON) + Pydantic |
| Bot LLM | `llama-3.3-70b-versatile` (Groq) |
| 监控 | Telegram Sentinel Bot |
## 📊 当前指标
| 指标 | 数值 |
|---|---|
| **活跃信息源** | 219 (133 WEB / 86 RSS) |
| **数据库中共收录文章** | 3939 |
| **简报中发布的文章数** | 307 |
| **成功发布的简报期数** | 31 |
| **发布的平均重要性 (avg_importance)** | 3.78 |
| **因不相关被拒绝** | 2057 |
| **URL 黑名单 (rejections)** | 1870 |
| **数据库中的解析器 checkpoint** | 15204 |
| **解析器会话总启动次数** | 78 |
## 📚 文档导航
| 文档 | 适合人群 | 内容 |
|---|---|---|
| [README.md](file:///C:/Users/Admin/Desktop/Parser/README.md) | 所有人员 | 概述、技术栈、快速开始 |
| [docs/ARCHITECTURE.md](file:///C:/Users/Admin/Desktop/Parser/docs/ARCHITECTURE.md) | 开发人员 | 组件、数据库、LLM pipeline、基础设施 |
| [docs/reference/SYSTEM_OVERVIEW.md](file:///C:/Users/Admin/Desktop/Parser/docs/reference/SYSTEM_OVERVIEW.md) | HR / CTO | 面向雇主的项目描述 |
## 🚀 快速开始
### 1. 环境安装
```
python -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
pip install -r requirements.txt
playwright install chromium
python -m camoufox fetch # Скачивание бинарников браузера Camoufox
```
### 2. 配置设定
基于示例创建 `.env` 文件:
```
cp .env.example .env
```
填写环境变量:
| 变量 | 用途 |
|---|---|
| `SUPABASE_URL` | Supabase 实例的 URL |
| `SUPABASE_SERVICE_ROLE_KEY` | Supabase 服务密钥(解析器/绕过 RLS 必需) |
| `OPENROUTER_API_KEY` | 用于 LLM pipeline 的 OpenRouter API 密钥 |
| `TELEGRAM_BOT_TOKEN` | 用于发送简报的主 Telegram Bot token |
| `TELEGRAM_CHAT_ID` | 用于发布内容的目标 Telegram 频道 ID |
| `MONITOR_BOT_TOKEN` | 用于监控告警的 Telegram Bot(独立) |
| `MONITOR_CHAT_ID` | 接收 Monitor Bot 告警的 Chat ID |
| `CAMOUFOX_ENABLED` | 启用 CamoufoxExtractor 以绕过 Cloudflare/WAF (`true`/`false`) |
| `GITHUB_TOKEN` | (可选)加载 GeoIP 时用于绕过 API 限制的 GitHub Token |
### 3. 运行组件
```
# 新闻采集 (parser)
python src/parser.py # Полный боевой прогон
python src/parser.py --dry-run --sources js_only # Тест группы источников js_only
python src/parser.py --dry-run --sources cloudflare # Тест группы источников cloudflare
python src/parser.py --dry-run --sources rss # Тест всех RSS-источников
# 摘要生成 (AI 逻辑)
python src/digest_v2.py --dry-run # Сухой прогон дайджеста (без записи в БД)
python src/digest_v2.py # Боевой прогон дайджеста
# 反馈 / 交互式 Telegram bot
python src/hybrid_polling.py # Запуск бота
# 回顾分析 / 数据恢复
python scripts/retro_verify.py --date 2026-06-12 --dry-run # Сухой ретро-прогон за день
python scripts/retro_verify.py --date 2026-06-12 # Боевой ретро-прогон за день
python scripts/retro_verify.py --all # Прогон всей истории
```
### 4. 运行测试
```
python -m unittest tests/test_similarity.py
python tests/test_clustering_scoring.py
python tests/test_title_ru.py # Smoke-тест перевода заголовков
```
## 🌐 生产环境
| 参数 | 数值 |
|---|---|
| Host | `your-vps-ip` |
| venv | `/root/Parser/venv` (Python 3.12) |
| Bot (PM2) | `pm2 status hybrid_polling` |
| Bot 日志 | `pm2 logs hybrid_polling` |
| 简报日志 | `pm2 logs digest-v2-dryrun` |
| Cron | `crontab -l` (05:00 MSK — 解析器;周日 03:00 MSK — 清理 Docker) |
| SSH 访问 | MCP server `vps-ssh` |
| VPS 剩余磁盘 | ~10 GB 可用(共 47 GB,已用 79%) |
| VPS 内存 (RAM) | 3 GB RAM(总计 2.9 GB,~2.4 GB 可用)+ 2 GB Swap(1.9 GB 可用) |
| VPS 处理器 | 1 vCPU |
### 部署
部署通过 GitHub Actions (`.github/workflows/deploy.yml`) 完全自动化。
流程:本地 `git push origin main` → GitHub Actions 通过 SCP 将文件复制到 VPS,从 `ENV_FILE` secret 更新 `.env`,重启 PM2 并运行 Docker 镜像构建。
### 安全性
- 所有服务器进程均使用 `SUPABASE_SERVICE_ROLE_KEY`(绕过 RLS)。
- 生产环境中不使用 `anon` 密钥。
- 对所有系统表(`parser_checkpoint`, `parser_runs`, `rejected_urls`, `analytical_drafts`)启用 RLS。
## 🌐 配套仓库:展示台
公开的展示台(带动画的 SPA 站点)已移至单独的仓库 [mib-osint](https://github.com/Nek1yZakhar/mib-osint)。
用于向用户展示简报,支持归档、动态渲染和缓存。
## 📁 项目结构
```
├── src/
│ ├── parser.py # Единый движок парсинга (CascadeExtractor L0-L4)
│ ├── digest_v2.py # ✅ АКТИВНЫЙ генератор дайджестов (E5 + LLM hybrid)
│ ├── digest.py # Устаревший v1 (депрецирован, перемещен в backups в git)
│ └── hybrid_polling.py # Telegram-бот (Deep Links + Groq LLM)
├── docs/
│ ├── ARCHITECTURE.md # Архитектура и потоки данных
│ ├── SYSTEM_OVERVIEW.md # Технический обзор МИБ-системы
│ └── TECH_ANALYSIS.md # Анализ инженерных решений
├── data/
│ └── mib_anchors.json # Якорные фразы для SIMILARITY FILTER (~35 pos, 10 neg)
├── database/ # SQL-схема базы данных и миграции
├── scripts/ # Вспомогательные утилиты
│ ├── dead_sources_audit.json # Аудит 87 мёртвых источников (category, http_status, note)
│ ├── recheck_dead_results.json # Сырые результаты VPS-прогона (DEBT-01e)
│ ├── migrate_db_v2.py # Скрипт миграции схемы БД
│ └── retro_verify.py # Ретроспективный анализ истории (E5 CPU-оптимизированный)
├── tests/
│ ├── test_similarity.py # Unit: якоря, graduated depth, пороги
│ ├── test_clustering_scoring.py # Integration: полный пайплайн
│ ├── test_parallel.py # Integration: параллельный парсинг
│ ├── test_dedup.py # Unit: SimHash-дедупликация
│ └── test_title_ru.py # Smoke: перевод заголовков через LLM (BUG-01)
├── backups/ # Архивы устаревших скриптов и шаблонов
├── .env.example
└── .github/workflows/deploy.yml
```
## ⚠️ 已知限制
| 限制 | 状态 | 描述 / 临时解决方案 |
|---|---|---|
| VPS RAM 2GB — 浏览器 | 🟡 活跃 | 限制抓取并发 (`concurrency: 5`),在 Supabase 中记录 checkpoint,回收浏览器进程。 |
| 语言障碍:仅限 RU/EN | 🟡 设计使然 | CJK 过滤器剔除非拉丁字符(阿拉伯语、中文等);AI 将原始标题翻译为俄语 (`title_ru`)。 |
已解决问题和事件的完整记录 → [docs/reference/INCIDENTS_LOG.md](file:///C:/Users/Admin/Desktop/Parser/docs/reference/INCIDENTS_LOG.md)
标签:AI数据处理, ESC4, GitHub, OSINT, 威胁情报, 实时处理, 开发者工具, 数据泄露, 数据聚合, 测试用例, 特征检测, 网络安全监控, 自动化信息收集, 运行时操纵, 驱动开发