Gstarmix/BotGSTAR-Showcase
GitHub: Gstarmix/BotGSTAR-Showcase
一套模块化 Discord 机器人生态系统,集成多平台视频 OSINT 采集、GPU 音频转录、AI 摘要和 RSS 情报聚合,实现从原始信息到结构化知识库的全自动流水线。
Stars: 0 | Forks: 0
# BotGSTAR — Discord 机器人生态系统
## 概述 (TL;DR)
**BotGSTAR** 是我独立开发并运行的**三个相互连接的 Discord 机器人生态系统**,基于 Python 3.12 + GPU CUDA 在我的个人机器上运行。该项目满足三个非常具体的需求:
1. **自动化我的课程跟踪**(ISTIC,雷恩第一大学)——包含音频转录 + AI 摘要 + 论坛发布的完整流程。
2. **构建政治论证库**——多平台(TikTok、Instagram、YouTube、X、Reddit、Threads)抓取、Whisper 转录、轮播图 OCR、Claude 摘要、Discord 索引。
3. **监测法国政治版图**——每日 RSS 聚合,覆盖 7 个以 USAGE 为导向的频道(actu-chaude、économie-veille、écologie-veille、international-veille、social-veille、débats-politiques、médias-veille),带有按关键词评分的功能和早间摘要。
整个系统在配备 RTX 2060 的 Windows 11 迷你主机上**24/7** 全天候运行,由定制的 Windows 托盘系统和自动重启机制进行监控。
**为什么这么做?** 为了证明政治参与不仅仅是一句口号:它是一项涉及分析、监测和归档的工作。并且,如果使用得当,计算机技术可以使得这种分析实现工业化。
## 我是谁
Gaylord ABOEKA,**26 岁**,雷恩人 (35000),**ISTIC(雷恩第一大学的计算机科学系)L1 计算机与电子学专业**在读。在重新回到硬科学领域的学业之前,我于 2021 年开始攻读计算机-电子学学士学位,随后在 **Buroscope 参加了数字预科班**,在那里我巩固了在 HTML/CSS/PHP/JS、Adobe 工具(Photoshop、Illustrator、Premiere Pro)以及 WordPress 工程方面的基础。
我在 René Descartes 高中获得的**理科文凭**为我打下了科学基础。但真正塑造了我的方法的是我多年来的**社区 Discord 服务器管理经验**(尤其是围绕 MMORPG NosTale 的社区),以及我的**志愿工作**(Union Étudiante pour l'Intégration,Bruz 的学校旅行)这些经历让我养成了这样的习惯:观察真实需求,提出工具解决方案,并长期维护它们。
除此之外:健身(Fitness Park Liberté)、极左翼政治参与,以及非常、非常、**非常**多的 Python 代码。
## BotGSTAR 存在的原因
### 教学契机
在 ISTIC 的第一年,我会缺课,我的同学们也会。课程内容散落在 Moodle、电子邮件、PPT 和我自己的笔记中。解决方案:一个能整理我的硬盘、转录我的 CM 音频、生成 LaTeX 摘要,并按科目将所有内容发布到 Discord 的机器人。**这就演变成了 Cog `cours_pipeline.py`** —— 8,353 行代码,24 条命令,一个实时文件监视器,一个 LaTeX → PDF 的处理流程,一个带有状态标签(`📄 仅题目`、`✍️ 包含答案` 等)的 Discord 论坛系统。
### 政治契机
第二个动力:**理解 LFI(不屈法国)而不陷入信息茧房**。我是 Insoumis(不屈者)的支持者,但我希望能够明智地回应反对者——而不是重复套话。我需要**有论据**、**有数据**、**有视频佐证**。
因此诞生了 **Arsenal Intelligence Unit**:一个能够吸收我在社交网络(TikTok、Insta、YouTube)上找到的政治视频的流水线,对其进行转录、OCR 识别、使用 Claude 进行总结,并将其索引到按主题分类的 Discord 论坛中。只要反对者一发言,我就能在 30 秒内找到对应的视频片段。
### 监测契机
第三个需求:**不错过任何新闻**。我创建了一个 Cog `veille_rss.py` 来聚合技术类 RSS 订阅源(网络安全/AI/开发/科技),用于我的学业。然后我将它派生为 **`veille_rss_politique.py`** 用于政治领域——9 个类别,45 个精选的法国新闻源,通过加权关键词(LFI、Mélenchon、退休、气候等)进行评分,并在早上 8:00 于相应的 Discord 频道发布早间摘要。
## 三个模块
### 模块 1 — `cours_pipeline.py`:教学自动化
**目标频道**:ISTIC L1 G2 的 Discord 服务器 (`ISTIC_GUILD_ID = 1466806132998672466`)。
**功能**:
- **Watchdog `_INBOX`** (60秒轮询):自动将存放在 `COURS/_INBOX/` 中的文件按照 `{TYPE}{NUM}_{MAT}_{DATE}.{txt|m4a|pdf|docx}` 的模式(例如:`CM7_AN1_1602.m4a`)进行归类。
- **完整的 CM 流程**:音频 + Whisper 转录 + LaTeX 摘要(通过订阅模式下的 Claude Code CLI 生成,免费) → 自动发布到 15 个文本频道(`cm-{audio,transcription,résumé}-{matière}`)。
- **答案论坛**:每个 TD/TP/CC(期末考试)对应 1 个帖子,第 1 帖为题目,后续帖子为答案(每题一帖),如果 MD5 发生变化会自动进行版本控制(删除旧消息 + 重新发布 `🔄 版本 N`)。
- **私人资料论坛**:`🔒 PERSONNEL` 类别(仅管理员可见),包含每个练习的口试脚本、幻灯片、训练视频。
- **24 条管理命令**(`!cours setup-channels`、`!cours publish`、`!cours backfill`、`!cours rapport [--deep]` 等)。
**值得注意的阶段 — 阶段 L(2026 年 4 月)**:在我的 Anthropic API 密钥耗尽后,我**将整个摘要系统切换到了 CLI `claude --print`**(带有 OAuth 订阅的子进程)。成本:0 欧元。上限:订阅配额。这与我为 Arsenal(Cog `arsenal_pipeline.py` 的 `step_summarize`)复制的切换方式完全相同。
### 模块 2 — `arsenal_pipeline.py` + `arsenal_publisher.py`:Arsenal Intelligence Unit
**目标频道**(自 2026 年 4 月起):ISTIC L1 G2 Discord 服务器 (`ISTIC_GUILD_ID = 1466806132998672466`),频道 `🔗・liens`(`QG` 类别下,公开只读,仅限管理员写入,以免泄露我的 token)用于投放 URL。
**5 步流水线**:
1. **Download(下载)** —— 专用脚本(`dl_tiktok.py`、`dl_instagram.py`)或通用的 `dl_generic.py`(yt-dlp)用于 YouTube/X/Reddit/Threads。
2. **Normalize(规范化)** —— 包含自动备份的 CSV 合并(`csv_normalize.py`)。
3. **Transcribe(转录)** —— 在 CUDA RTX 2060 GPU 上运行 Whisper large-v3(`faster-whisper`、`int8_float16`、VAD 阈值 0.35、beam 5)。
4. **Summarize(总结)** —— 通过 CLI(订阅)或 API 使用 Claude 进行摘要,取决于配置。
5. **Publish(发布)** —— 按类别(TikTok / IG / YT / 等)同步到 Discord 论坛。
**数据**:中央 CSV `suivi_global.csv`(25 列,1500+ 行),1300+ 个下载视频,1000+ 份转录。Instagram 轮播图通过 OCR easyocr(法语+英语,GPU)处理,将每张幻灯片的文本聚合到 `02_whisper_transcripts/_ocr.txt` 中。
**论坛架构**:每种内容类型都进入其专属论坛,并打上平台和主题(移民、退休、生态等)的标签。每当在 `#liens` 中投放 URL 时,机器人会:
- 自动检测平台(6 个平台的正则表达式)。
- 启动流水线并通过嵌入(embeds)在 `#logs` 中记录每个步骤(根据成功与否显示绿色/橙色/红色)。
- 将结果发布到相应的论坛中。
**鲁棒性**:我本月编写的 `whisper_supervisor.py` 会自动检测**导致 libav 挂起的视频**(这是 `faster-whisper` 处理某些损坏的 MP4 文件时的已知问题),终止进程,将文件隔离到 `_corrupted_videos/` 中,然后重启 Whisper。处理 500+ 个视频不需要任何一次手动干预。
在 Discord 方面,`arsenal_publisher` 有一个每小时运行的循环(`_auto_archive_loop`),当公会的活跃帖子数达到 **900/1000**(未增强的 Discord 服务器的限制)时,它会自动归档 `ANALYSES POLITIQUES` 中的旧帖子。这可以防止 `400 ... 160006: Maximum number of active threads reached` 错误阻止任何新内容的发布。归档的帖子在 Discord 中仍然可见,如果有人在其中发帖,它们会自动取消归档——没有内容丢失,只是释放了活跃配额。还提供了手动命令 `!archive_arsenal [target]` 用于按需触发。
### 模块 3 — `veille_rss.py` + `veille_rss_politique.py`:RSS 聚合
**两个双子 Cog**,两个目标服务器:
#### `veille_rss.py` —— 技术监测(ISTIC 服务器)
- 4 个类别:**cyber**(CERT-FR、Krebs、BleepingComputer、ZATAZ 等)、**ia**(Anthropic、OpenAI、HuggingFace、ActuIA)、**dev**(GitHub Blog...)、**tech**(Numerama)。
- 按关键词(`vulnérabilité critique`、`0-day`、`RCE`、`GPT-5`、`Claude` 等)进行评分 + 反广告黑名单。
- 巴黎时间早上 8:00 在 4 个专属频道发布早间摘要(Style A v3 Magazine —— 带有 730×1 透明间隔图像的嵌入,用于统一宽度)。
- 自动禁用持续报错的源(连续 5 次错误)。
#### `veille_rss_politique.py` —— 政治监测(自 2026-04-29 起在 ISTIC L1 G2 服务器上,并与 `📡 VEILLE` 中的技术监测合并)
- **7 个以 USAGE 为导向的类别**,**40 个经过验证的法国新闻源**(HTTP 200 + 条目 > 0)。
- 设计理念:**方案 C — Arsenal Intelligence Unit**。每个频道都回答一个具体的使用问题,而不是模糊的意识形态立场。没有专门的“右翼”或“极右翼”频道(这类频道很容易变成有毒的通讯录)——他们的言论通过 `arsenal-attaques`(支持 LFI 的分析)、`arsenal-medias`(媒体批评)以及 `actu-chaude` 的新闻核查(CheckNews,Décodeurs)进行过滤和批判。
| 类别 | 表情符号 | 使用问题 | 代表性新闻源 |
|---|---|---|---|
| **actu-chaude** | 🔥 | “今天早上发生了什么?” | Le Monde、Mediapart、Libération、France Info、Le Parisien |
| **économie-veille** | 💰 | “关于税收、退休和不平等,能用什么数据来反驳?” | Alt. Économiques、Contretemps、Frustration、Inégalités、Attac、RFI Éco |
| **écologie-veille** | 🌱 | “有什么气候/生态数据可以作为佐证?” | Reporterre、Bon Pote、Vert、Basta!、EcoloObs |
| **international-veille** | 🌍 | “巴勒斯坦、俄罗斯、萨赫勒地区……发生了什么?” | Le Monde Diplo、Courrier Int.、Le Monde Int.、France 24、RFI Monde |
| **social-veille** | ✊ | “哪些斗争/工会/动员活动有了新进展?” | L'Humanité、StreetPress、Regards、Lundi Matin、Révolution Permanente、Paris-luttes、Rebellyon、Contre Attaque |
| **débats-politiques** | 🎯 | “如何有理有据地反驳对方的观点?” | L'Insoumission、LVSL、Mélenchon Blog、LFI 官方、Libération Politique |
| **médias-veille** | 📺 | “谁说了什么,谁在撒谎,谁在批判主流叙事?” | Acrimed、Arrêt sur Images、CheckNews (Libé)、Décodeurs (Le Monde)、AOC |
- **评分机制**:新闻源优先级(1000-3000 分+ 时效性(在 1000 分钟内按比例递减,最高 1000 分)+ 关键词加权(每次匹配 +500 分)。一个高度匹配的优先级 2 文章可以击败没有匹配的优先级 1 文章。这是有意为之的:热门话题优先于来源层级。
- **按类别调整的时效窗口**:综合类报刊(Le Monde、Le Figaro)24 小时,小众来源(Lundi Matin、Contretemps)72 小时。
- **巴黎时间早上 8:00 自动发布摘要** + 如果机器人在 8:00 后重启则进行补偿追赶 + 30 天内基于 MD5 的去重。
- **9 条管理命令**(`!veille_pol setup-channels`、`!vp fetch-now`、`!vp trigger-now`、`!vp status`、`!vp reload`、`!vp sources list/add/remove/toggle/test`、`!vp keywords`)。
## 技术栈
| 层级 | 工具 |
|---|---|
| **OS** | Windows 11 Home(个人迷你主机,24/7 运行) |
| **Runtime** | Python 3.12 |
| **Discord** | discord.py(cogs/extensions 架构) |
| **GPU** | NVIDIA RTX 2060 (6 Go VRAM) — CUDA |
| **转录** | faster-whisper (large-v3, int8_float16, VAD) |
| **OCR** | easyocr (fr + en, GPU) |
| **LLM** | Anthropic Claude (API + 作为后备的 CLI 订阅) |
| **下载** | yt-dlp + Netscape cookies (Instagram, TikTok) |
| **RSS** | feedparser, aiohttp (并行抓取, ETag/If-Modified-Since) |
| **YAML** | ruamel.yaml (保留往返格式、注释 + 保持顺序) |
| **数据** | CSV utf-8-sig (兼容 Excel) + JSON atomic (`.tmp` + `os.replace`) |
| **监控** | 定制的 Windows 托盘程序 (`bot_tray.py` + `start_tray.vbs`),具有 10 秒自动重启、Tk 日志窗口、Windows 开机自启切换功能 |
| **日志** | 在 `#logs` 中显示颜色编码的 Discord 嵌入 + `_claude_logs/tasks/` 中的本地文件 |
## 架构(概览)
```
┌─────────────────────────────────────────────────────────────────┐
│ BotGSTAR (un seul Python process) │
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────────────┐ │
│ │ COURS │ │ Arsenal │ │ Veille RSS │ │
│ │ cours_ │ │ arsenal_ │ │ veille_rss + politique│ │
│ │ pipeline │ │ pipeline + │ │ (2 cogs jumeaux) │ │
│ │ │ │ publisher │ │ │ │
│ │ - INBOX │ │ - DL multi- │ │ - 4 cat tech │ │
│ │ - LaTeX │ │ plateforme │ │ - 9 cat politique │ │
│ │ - Forums │ │ - Whisper │ │ - Digest 8h00 Paris │ │
│ │ - 24 cmds │ │ - OCR │ └───────────────────────┘ │
│ └──────────────┘ │ - Claude │ │
│ │ - Forums │ │
│ └──────────────┘ │
└─────────────────────────────────────────────────────────────────┘
│ │ │
▼ ▼ ▼
Disque local GPU CUDA Discord API
(COURS/, datas/, (Whisper + (3 serveurs:
Arsenal_Arguments/) easyocr) ISTIC, Veille)
│
▼
┌─────────────────┐
│ whisper_ │ ← supervise Whisper, isole les corrompus
│ supervisor.py │ auto-restart sur stall (15 min)
└─────────────────┘
│
▼
┌─────────────────┐
│ post_whisper_ │ ← chaîne OCR + audit final après Whisper
│ orchestrator.py │
└─────────────────┘
│
▼
┌─────────────────┐
│ progress_ │ ← surveille les .txt produits, poste
│ monitor.py │ sur Discord avec embeds (1/file)
└─────────────────┘
```
## 仓库布局
```
BotGSTAR/
├── bot.py # Point d'entrée — charge 5 cogs
├── bot_tray.py # Tray Windows watchdog (auto-restart)
├── start_tray.vbs # Lanceur silencieux Windows
├── start_bot.bat # Mode debug (console visible)
├── extensions/ # 5 Cogs Discord
│ ├── cours_pipeline.py # COURS — 8353 lignes
│ ├── arsenal_pipeline.py # Arsenal — 1100+ lignes
│ ├── arsenal_publisher.py # Arsenal — publication Discord
│ ├── veille_rss.py # Veille tech ISTIC — 1654 lignes
│ └── veille_rss_politique.py # Veille politique — 700+ lignes
├── datas/ # État + config (atomic write)
│ ├── rss_sources.yaml # Sources veille tech
│ ├── rss_keywords.yaml # Mots-clés boost/blacklist tech
│ ├── rss_state.json # Tracking dédup + erreurs tech
│ ├── rss_sources_politique.yaml # Sources veille politique (45)
│ ├── rss_keywords_politique.yaml # Mots-clés politique (200+)
│ ├── rss_state_politique.json
│ ├── discord_published.json # Tracking corrections COURS (v2)
│ ├── discord_perso_published.json
│ └── _published.json # Tracking pipeline CM COURS
├── COURS/ # Disque local pédagogique
│ ├── _INBOX/ # Dépôt fichiers à ranger
│ ├── _scripts/ # Watcher publish queue
│ ├── _titres_threads.yaml # Mapping TD/TP → titre humain
│ └── {AN1,EN1,PRG2,PSI,ISE}/ # Une matière par dossier
└── Arsenal_Arguments/ # Pipeline politique
├── arsenal_config.py # Module centralisé chemins/CSV
├── dl_{tiktok,instagram,generic}.py
├── csv_normalize.py
├── summarize.py # Claude API + CLI fallback
├── ocr_carousels.py # easyocr GPU
├── arsenal_audit.py # Audit santé du pipeline
├── progress_monitor.py # Discord embeds par fichier traité
├── whisper_supervisor.py # Auto-restart + isolation corrompus
├── post_whisper_orchestrator.py # OCR + audit chaîné
├── whisper_engine.ps1 # Wrapper PowerShell Whisper
├── 01_raw_videos/ # Vidéos téléchargées (~1300)
├── 02_whisper_transcripts/ # Transcriptions (~1000)
├── 03_ai_summaries/ # Résumés Claude
├── _corrupted_videos/ # Isolés par supervisor
├── _claude_logs/ # Traçabilité de mes sessions Claude Code
│ ├── session_YYYY-MM-DD.md
│ └── tasks/ # Stdout/stderr des bg tasks
└── suivi_global.csv # Source de vérité (25 colonnes)
```
## 演示与具体场景
### 场景 1 — 我错过了一节 CM 课
1. 我的同学录制了音频 (`.m4a`) 并发给我。
2. 我将它拖放到 `COURS/_INBOX/CM7_AN1_1602.m4a` 中。
3. 监视器检测到 → 将其归类到 `COURS/AN1/CM/` 中。
4. 自动流水线:音频发布到 `#cm-audio-an1`,Whisper 转录 → `#cm-transcription-an1`,LaTeX 摘要 → `#cm-résumé-an1`(通过 `summarize.py` 生成 PDF)。
5. 在我还没来得及去泡咖啡之前,所有内容都已经上传到 Discord 了。
### 场景 2 — 我在 TikTok 上发现了一段反对派的有趣视频
1. 我将 URL 复制粘贴到 `#liens` 中。
2. 机器人通过正则表达式检测,以 🔄 反应,并加入队列。
3. 流水线:`dl_tiktok.py` → `csv_normalize.py` → Whisper → `summarize.py --use-claude-code` → 发布到主题论坛。
4. 每个步骤都在 `#logs` 中生成嵌入:✅ Download (3.2s) · ✅ Normalize · ✅ Whisper (12s) · ✅ Résumé · ✅ Publication。
5. 如果 Summarize 步骤失败(例如:API 密钥耗尽),我会在 `#logs` 中看到红色,并知道在哪里进行干预。
### 场景 3 — 我想为一场辩论寻找经济方面的论据
1. 我在 8:05 查看 `#💰・économie-veille`。
2. 我看到了 10 篇文章:Alt. Économiques 关于财富不平等的文章,Frustration 关于亿万富翁的文章,Inégalités.fr 关于最低工资与管理层对比的文章,Contretemps 关于通货膨胀的马克思主义分析等。
3. 我点击我感兴趣的那篇(在 Discord 嵌入中可点击的标题)。
4. 如果我想深入研究某个特定主题,我输入 `!vp keywords` 来查看加权关键词并进行调整。
### 场景 4 — 某个 RSS 源出现故障
1. CERT-FR 连续出现 5 次 HTTP 错误。
2. 机器人自动将其禁用。
3. `#logs` 中出现橙色嵌入:“在连续 5 次错误后,新闻源 `cert-fr` 已被禁用。”
4. 第二天的早间摘要提到了出现故障的新闻源。
5. 我去查看 YAML 文件,修改 URL,输入 `!veille reload`,一切恢复正常。
### 场景 6 — 我打开 GUI,一眼就能看到流水线的完整状态
`summarize` GUI 的 `📥 Drops récents (#liens)` 框架显示了最近的 10 次投放,每次都包含:来源 ID、平台、每个步骤的表情符号
(DL ✅,Summarize ⏳,Sync ❌),时间戳。通过直接读取 CSV 每隔 30 秒刷新一次。如果我在 DL 或 Sync 上看到红色的 ❌ 标记,我就能立刻知道该去 `📋・logs` 中查看什么。
结合 `📊 Quota Pro Max` 框架,我可以在一个屏幕上看到:实时配额
+ 完整的 Arsenal 流水线状态。如果我的批处理摘要因达到阈值而自动停止,我会看到 Cookie 标签变为 `⚠ Cookie
过期`(红色)或 `🌐 Cookie OK,网络断开`(橙色),我就确切知道该怎么做了。
Arsenal 流水线(在 `🔗・liens` 中的投放)也同样受到
Discord 机器人通过相同配额的限制:如果当我的 5 小时会话配额饱和时投放链接,
机器人会发布一个橙色嵌入 `⚠ 摘要跳过 — 配额
已达上限`,而不是消耗配额。Download/Whisper 仍会
执行并保存,我可以在配额
降下来时重新启动 summarize。
### 场景 5 — 我的 Claude 批处理耗尽了我的 Pro Max 配额,导致我无法进行其他操作
这是经典的“流水线在夜间运行了 8 小时”的问题:
早上我想打开 Claude Code 做别的事情时,却发现**没有可用的
配额**。自制的解决方案:
1. 我打开 Tkinter 的 GUI `summarize_gui.py`(双击 VBS,无控制台)。
2. **📊 Quota Pro Max** 框架实时显示:`Session 5h : 30 % (reset 3h50m)`,
`Hebdo 7j : 45 %`,`Hebdo Sonnet : 1 %`,`Overage : 94 %`。
3. GUI 是如何读取这些数字的?`claude.ai/settings/usage` 的 API 并非
公开的——我检查了 Network DevTools 的请求,识别出了
私有 endpoint `/api/organizations/{ORG}/usage`,在请求头方面模仿了 Chrome(
`sec-ch-ua-*`,`priority`,`sec-fetch-*`)以通过 Cloudflare。
4. **会话 Cookie** 通过 **Windows DPAPI**
在本地加密存储(`win32crypt.CryptProtectData`,与 Windows 会话绑定——只能
由我在此机器上的账户解密,无需记住密码)。
5. GUI 提供了**两个阈值 Spinbox**:“Session:70 %”和
“Hebdo:80 %”。当批处理超过该值时,**自动停止**(Ctrl-Break
→ Discord 嵌入“会话暂停 — 5 小时配额已满” → 释放锁)。
6. 每周节流是**持久化**的(`_secrets/quota_state.json`),因此
它能在 GUI 重启后继续生效。▶ Lancer 按钮一直处于禁用状态,
直到限制解除(当配额回落时自动重置,或通过点击
“Reset throttle hebdo”并确认进行手动重置)。
7. 当 5 小时计数器降至阈值以下或在
重置后,会话自动恢复。无需盯着看,我让它运行,早上就能为我的
其他用途保留完整的配额。
这正是别人会告诉我“不可能/API 未公开/需要一个代理”的那种事情。而在实际操作中:200 行 Python 代码 +
DevTools + DPAPI = 问题解决。
## 鲁棒性与运维
- **托盘监视器**:如果机器人崩溃,将在 10 秒内自动重启。它在 3 个月内崩溃了 77 次,但没有造成任何服务中断。
- **原子写入**:所有 JSON 和 YAML 都通过 `.tmp` + `os.replace` 进行写入——在写入过程中发生崩溃也不会损坏文件。
- **MD5 去重**:RSS 采用 30 天去重,COURS 答案基于文件去重,Arsenal CSV 基于 `(plateforme, id)` 去重。
- **版本控制**:MD5 发生变化的答案会以 `🔄 Version N` 为前缀重新发布,历史记录保存在 `versions[]` 中。
- **补偿机制**:如果机器人在早上 8:00 之后启动,当天的 RSS 摘要将立即执行,同时遵守去重规则。
- **自动隔离**:导致 libav 挂起的视频会被 `whisper_supervisor.py` 移动到 `_corrupted_videos/` 中——Whisper 绝不会卡住超过 15 分钟。
- **自动禁用**:持续报错(5 次错误)的 RSS 源将在内存中被禁用(YAML 保持 `active: true`,以便我们在修复后手动重新启用它们)。
## 该项目展示了什么
**技术能力**:
- Python 异步架构(asyncio、aiohttp、discord.py)。
- 带有 CSV/JSON 检查点和 MD5 幂等性的多阶段 ETL 流水线。
- LLM 集成(API + CLI 订阅)并带有自动回退机制。
- GPU 计算(CUDA、faster-whisper、easyocr)。
- 高级 Discord API(论坛、标签、Style Magazine 嵌入、discord.py 之外的直接 REST 调用)。
- 原生 Windows 运维(PowerShell、托盘服务、自动重启、用于本地机密的 **DPAPI**)。
- 配置即代码(通过 ruamel 实现 YAML 往返格式保留)。
- 可观测性(颜色编码的嵌入、带日期的会话文件、审计脚本)。
- **逆向工程私有 API**(DevTools Network、Chrome 模拟、绕过 Cloudflare、抓取配额)。
- **Python 桌面 GUI**(Tkinter、用于网络 I/O 的守护线程、用于优雅停止的清晰信号)。
- 当主要工具失效时的**多策略下载**(例如:`dl_instagram.py` 链式调用 yt-dlp → manifest → 探测 `?img_index=N` → **gallery-dl** → 缩略图)。
**方法论**:
- **真实需求优先,代码随后**。这些机器人中没有一个是“玩具项目”——它们每天都在运行,我也每天都在使用它们。
- **短迭代,完全可追溯**。每次开发会话都记录在 `_claude_logs/session_YYYY-MM-DD.md` 中,包含决策、异常和阶段转换。
- **防御性质量**。原子写入、幂等性、监视器、监督器。我宁愿多投入 1 小时,以免日后永远不需要手动修复。
- **活文档**。根目录下的 `CLAUDE.md` 会在每个阶段(截至目前为 A → S)更新,并用作辅助 AI 的可执行规范。
## 启动
### 托盘模式(推荐)
`bot_tray.py` 是一个带有系统托盘图标的监视器:
- 以无控制台的子进程方式启动 `python -u bot.py`。
- 崩溃后 10 秒自动重启(每次崩溃时弹出 Windows 提示)。
- 彩色图标(绿色运行中 / 橙色暂停 / 红色崩溃 / 蓝色重启中)。
- 右键菜单:查看日志 / 暂停 / 重启 / 开机自启开或关 / 退出。
- 带有自动滚动的实时 Tk 日志窗口,可从菜单打开。
静默启动:双击 `start_tray.vbs`(使用 `pythonw.exe`,无控制台)。托盘菜单可以在 Windows 启动文件夹中安装或移除 `BotGSTAR_Tray.vbs` 快捷方式,以实现登录时自动启动。
### 控制台模式(调试)
`start_bot` 仍可使用:
- 重启循环(崩溃间隔 10 秒)。
- 实时控制台日志 + `%TEMP%\BotGSTAR_startup.log`。
- **“点击 = 重启”的语义**:启动时,终止所有其他实例(按标题终止旧监视器,按命令行终止旧 `bot.py`)然后接管。确保只运行一个实例。
两种模式在同一时间只能运行一种——托盘监视器自行管理子进程 `bot.py`,将其与 `start_bot.bat` 并行运行会产生两个并发实例。
## 环境变量
| 变量 | 位置 | 用途 |
|---|---|---|
| `DISCORD_BOT_TOKEN` | 根目录 `.env` | Discord 机器人 Token |
| `ANTHROPIC_API_KEY` | Windows 环境变量 | Claude 密钥(CM 摘要,可选 —— 后备方案为 CLI 订阅) |
## 详细文档
| 文件 | 受众 |
|---|---|
| `CLAUDE.md` | Cog 的详细架构(开发参考,由 Claude Code 自身使用)。 |
| `CHANGELOG.md` | 各阶段演进(监测端的 R-A → R-H,托盘端的 S)。 |
| `GUIDE_VEILLE.md` | RSS 监测用户手册(读者 / 管理员 / 维护者)。 |
| `Arsenal_Arguments/CLAUDE.md` | Arsenal 流水线架构。 |
| `Arsenal_Arguments/_claude_logs/session_YYYY-MM-DD.md` | 按日记录的 Claude Code 会话日志。 |
| `COURS/CLAUDE.md` | COURS 项目的磁盘约定。 |
| `COURS/CHANGELOG.md` | 课程流水线演进(阶段 A → I)。 |
## 路线图
- [ ] **自动化政治论坛** —— 以 COURS 答案论坛为模型,为每个重大政治主题(退休、移民、生态)创建 1 个帖子,并在其中发布聚合的视频+转录+摘要。
- [ ] **Web 仪表盘** —— 使用 Streamlit 或 FastAPI + HTMX 来可视化 Arsenal CSV,按关键词过滤,并导出细分数据。
- [ ] **主题检测** —— 对 Whisper 转录内容进行语义聚类(sentence-transformers),以自动发现新兴主题。
- [ ] **多租户** —— 调整机器人,使其他 ISTIC 学生能够为其所在群体自行托管。
- [ ] **英/西语国际监测** —— 将政治 RSS 系统扩展到国外的极左翼媒体。
## 联系方式
- **Email**:[gaylordaboeka@gmail.com](mailto:gaylordaboeka@gmail.com)
- **Instagram**:[@gaylordaboeka](https://www.instagram.com/gaylordaboeka/)
- **所在地**:Rennes (35000)
_本 README 是与 Claude Code 在 2026 年 4 月的一个夜间结对编程会话中共同编写的,当时 Whisper 正在后台转录 447 个政治视频。非常 Meta。_
标签:Anthropic, CIS基准, Claude API, CUDA, CUI/托盘应用, discord.py, Discord 机器人, DLL 劫持, ESC4, GPU 加速, HTTP工具, Instagram, OCR, OSINT, Python, Reddit, RSS 聚合, RTX 2060, TikTok, Vectored Exception Handling, Whisper, Windows 应用, YouTube, 个人项目, 人工智能, 代码示例, 信息抓取, 信息检索, 光学字符识别, 大语言模型, 学生项目, 政治分析, 教育科技, 数据分析, 新闻监控, 无后门, 生态系统, 用户模式Hook绕过, 知识管理, 社交媒体抓取, 自动化总结, 自动重启, 论坛集成, 语音转文本