Gstarmix/BotGstarShowcase
GitHub: Gstarmix/BotGstarShowcase
一个由三个互联模块组成的 Discord 机器人生态系统,实现课程音频自动转录摘要、多平台政治视频情报聚合及 RSS 新闻监测的自动化 pipeline。
Stars: 0 | Forks: 0
# BotGSTAR — Discord 机器人生态系统
## 太长不看
**BotGSTAR** 是一个由我独立使用 Python 3.12 + GPU CUDA 在个人电脑上开发并运行的**三个互联的 Discord 机器人生态系统**。该项目旨在满足三个非常具体的需求:
1. **自动化课程跟踪**(位于 ISTIC,雷恩第一大学)—— 包含音频转录 + AI 摘要 + 论坛发布的 pipeline。
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 高中获得的 **理科业士文凭 (bac S)** 为我打下了科学根基。但真正锻造了我“观察实际需求、提出工具方案并长期维护”这一方法的,主要是那些年我**管理社区 Discord 服务器**(特别是围绕 MMORPG NosTale)的经验,以及我的**协会志愿工作**(学生融合联盟,Bruz 学校旅行)。
除此之外:健身(Fitness Park Liberté)、极左翼政治参与,以及写了非常、非常、**非常**多的 Python 代码。
## 为什么存在 BotGSTAR
### 教学层面的顿悟
在 ISTIC 的第一年,我会错过一些课程,我的同学们也是。课程内容散落在 Moodle、邮件、PPT 幻灯片和我自己的笔记中。解决方案:一个机器人,它可以整理我的硬盘、转录我的 CM(大课)音频、生成 LaTeX 摘要,并按科目将所有内容发布到一个 Discord 中。**这成为了 Cog `cours_pipeline.py`** —— 8,353 行代码,24 个命令,一个实时文件监听器,一个 LaTeX → PDF 的 pipeline,一个带有状态标签(`📄 仅题目`, `✍️ 包含答案` 等)的 Discord 论坛系统。
### 政治层面的顿悟
第二个驱动力:**在不陷入信息茧房的情况下理解 LFI**。我是 Insoumis(不屈法国)的支持者,但我希望能够聪明地回应反对者——而不是仅仅重复一些话术。我需要**有数据支持**、**有来源**、**有视频佐证**的**论点**。
因此诞生了 **Arsenal Intelligence Unit**:这是一个 pipeline,它可以抓取我在社交网络上(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 pipeline**:音频 + Whisper 转录 + LaTeX 摘要(通过订阅模式的 Claude Code CLI 生成,免费) → 自动发布到 15 个文本频道 (`cm-{audio,transcription,résumé}-{matière}`)。
- **答案论坛**:每个 TD/TP/CC(习题课/实验课/测验)对应 1 个 thread,题目作为首帖,答案作为后续帖子(每个练习 1 个帖),并在 MD5 发生变化时自动进行版本控制(删除旧消息 + 重新发布 `🔄 Version N`)。
- **个人专属资料私密论坛**:`🔒 PERSONNEL` 分类(仅管理员可见),包含每个练习的口述脚本、幻灯片、训练视频。
- **24 个管理员命令**(`!cours setup-channels`, `!cours publish`, `!cours backfill`, `!cours rapport [--deep]` 等)。
**重要阶段 — Phase L(2026 年 4 月)**:由于我的 Anthropic API key 额度耗尽,我**将整个摘要系统切换到了 `claude --print` CLI**(带有 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 步 Pipeline**:
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** — 在 NVIDIA RTX 2060 GPU CUDA 上运行 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 轮播图通过 easyocr(支持法语+英语,GPU 加速)进行 OCR 处理,将每一张幻灯片的文本聚合到 `02_whisper_transcripts/_ocr.txt` 中。
**论坛架构**:每种内容类型都会进入其对应的论坛,并打上平台和主题(移民、退休、生态等)标签。每当在 `#liens` 中投放 URL 时,机器人就会:
- 自动检测平台(通过正则表达式支持 6 个平台)。
- 启动 pipeline,并通过 embeds 在 `#logs` 中记录每个步骤(根据成功与否显示绿色/橙色/红色)。
- 将结果发布到相应的论坛中。
**健壮性**:我本月编写的 `whisper_supervisor.py` 会自动检测**导致 libav 卡死的视频**(这是 `faster-whisper` 处理某些损坏的 MP4 文件时的已知问题),它会 kill 掉进程,将文件隔离到 `_corrupted_videos/` 中,并重启 Whisper。处理 500+ 个视频完全无需任何人工干预。
在 Discord 方面,`arsenal_publisher` 具有一个每小时运行的循环 (`_auto_archive_loop`),一旦服务器达到 **900/1000 个活跃 thread**(未 Boost 的 Discord 服务器的限制),它就会归档 `ANALYSES POLITIQUES` 中的旧 thread。这可以防止出现 `400 ... 160006: Maximum number of active threads reached` 错误,该错误会阻止任何新内容的发布。已归档的 thread 在 Discord 中仍然可见,如果有人在其中发帖则会自动取消归档——不会丢失任何内容,只是释放了活跃配额。提供手动命令 `!archive_arsenal [target]` 用于触发即时归档。
### 模块 3 — `veille_rss.py` + `veille_rss_politique.py`:RSS 聚合
**两个双胞胎 Cogs**,对应两个目标服务器:
#### `veille_rss.py` — 技术监测(ISTIC 服务器)
- 4 个分类:**cyber** (CERT-FR, Krebs, BleepingComputer, ZATAZ 等), **ia** (Anthropic, OpenAI, HuggingFace, ActuAI), **dev** (GitHub Blog…), **tech** (Numerama)。
- 通过关键词打分 (`vulnérabilité critique`, `0-day`, `RCE`, `GPT-5`, `Claude` 等) + 广告黑名单。
- 巴黎时间早上 8:00 在 4 个专属频道发布早间摘要(Style A v3 Magazine —— 带有 730×1 透明间隔图像的 embeds,以统一宽度)。
- 自动禁用连续出错(连续 5 次错误)的 RSS 源。
#### `veille_rss_politique.py` — 政治监测(自 2026-04-29 起在 ISTIC L1 G2 服务器,与 `📡 VEILLE` 中的技术监测合并)
- **7 个以 USAGE 为导向的分类**,**40 个已验证的法国信息源**(HTTP 200 + entries > 0)。
- 设计理念:**Option C — Arsenal Intelligence Unit**。每个频道都旨在回答一个具体的实际问题,而不是模糊的意识形态立场。没有专门的“右翼”或“极右翼”频道(这很快就会变成有毒的联系人簿)——他们的叙事会被过滤和批判,通过 `arsenal-attaques`(亲 LFI 分析)、`arsenal-medias`(媒体批评)以及 `actu-chaude` 的 fact-check (CheckNews, Décodeurs) 来实现。
| 分类 | Emoji | 实际问题 | 代表性信息源 |
|---|---|---|---|
| **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 officiel, 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/扩展架构) |
| **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 订阅作为 fallback) |
| **下载** | yt-dlp + cookies Netscape (Instagram, TikTok) |
| **RSS** | feedparser, aiohttp(并行抓取,支持 ETag/If-Modified-Since) |
| **YAML** | ruamel.yaml (preserve-roundtrip,保留注释和顺序) |
| **数据** | CSV utf-8-sig(兼容 Excel) + 原子化 JSON (`.tmp` + `os.replace`) |
| **监控** | 自定义 Windows 托盘(`bot_tray.py` + `start_tray.vbs`),支持 10 秒自动重启,Tk 日志窗口,切换 Windows 自启动 |
| **日志** | 在 `#logs` 中发送颜色编码的 Discord embeds + 本地文件位于 `_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 et Compagnon ont leurs propres dépôts, voir la note en haut)
```
## 演示与具体场景
### 场景 1 — 我错过了一节 CM
1. 我的同学录了音(`.m4a`)并发送给我。
2. 我将其拖入 `COURS/_INBOX/CM7_AN1_1602.m4a`。
3. 监听器检测到文件 → 将其整理到 `COURS/AN1/CM/` 中。
4. 自动 pipeline:音频发布到 `#cm-audio-an1`,Whisper 转录 → `#cm-transcription-an1`,LaTeX 摘要 → `#cm-résumé-an1`(通过 `summarize.py` 生成 PDF)。
5. 在我来得及去泡杯咖啡之前,所有的东西都已经发到 Discord 里了。
### 场景 2 — 我在 TikTok 上发现了一段有趣的反对者视频
1. 我将 URL 复制粘贴到 `#liens` 中。
2. 机器人检测到(通过正则表达式),作出 🔄 反应,将其加入处理队列。
3. Pipeline:`dl_tiktok.py` → `csv_normalize.py` → Whisper → `summarize.py --use-claude-code` → 发布到主题论坛。
4. 每一步都会在 `#logs` 中显示 Embed:✅ Download (3.2s) · ✅ Normalize · ✅ Whisper (12s) · ✅ Résumé · ✅ Publication。
5. 如果 Summarize 步骤失败(例如:API key 耗尽),我会看到 `#logs` 中出现红色,并立刻知道该从哪里排查。
### 场景 3 — 我需要经济方面的论据来回应辩论
1. 我在 8:05 查看 `#💰・économie-veille`。
2. 我看到了 10 篇文章:Alt. Économiques 关于财富不平等的文章,Frustration 关于亿万富翁的文章,Inégalités.fr 关于 SMIC 与高管对比的文章,Contretemps 关于通胀的马克思主义分析等。
3. 我点击我感兴趣的文章(在 Discord embed 中标题是可以点击的)。
4. 如果我想深入了解特定主题,我会输入 `!vp keywords` 查看加权关键词并进行调整。
### 场景 4 — 某个 RSS 源挂了
1. CERT-FR 连续出现 5 次 HTTP 错误。
2. 机器人自动将其禁用。
3. 在 `#logs` 发送橙色 Embed:“信息源 `cert-fr` 在连续报错 5 次后已被禁用。”
4. 第二天早上的摘要会提及该源处于宕机状态。
5. 我去查看 YAML,修改 URL,输入 `!veille reload`,恢复正常运行。
### 场景 6 — 我打开 GUI,一眼就能看到整个 pipeline 的完整状态
summarize GUI 的 `📥 Drops récents (#liens)` 框架会显示最近的 10 个
drop,每一个都会包含:源 ID、平台、每个步骤的状态 emoji
(DL ✅, Summarize ⏳, Sync ❌) 和时间戳。通过直接读取 CSV 每 30 秒
刷新一次。如果我看到 DL 或 Sync 旁边有红色的 ❌,我就
能立刻知道该去 `📋・logs` 里的什么地方排查问题。
结合 `📊 Quota Pro Max` 框架,我在一个屏幕上就能看到:实时配额
+ 完整的 Arsenal pipeline 状态。如果我的 summarize 批处理任务由于
达到阈值而自动停止,我会看到 cookie 标签变成 `⚠ Cookie
expiré`(红色)或 `🌐 Cookie OK, réseau down`(橙色),我就知道
接下来该做什么了。
Arsenal pipeline(在 `🔗・liens` 中 drop)同样受到
Discord 机器人的配额限制:如果我在 5 小时
会话配额饱和时 drop 链接,机器人会发送一个橙色 Embed `⚠ Résumé sauté — quota
atteint`,而不是消耗配额。不过,download/whisper 仍然
会被执行并保存数据,我可以在配额恢复后
重新运行 summarize。
### 场景 5 — 我的 Claude 批处理任务耗尽了我的 Pro Max 配额,并阻塞了其他使用场景
这是典型的“pipeline 在夜间运行 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 并
不公开 —— 我通过检查 DevTools Network 请求,找到了
私有 endpoint `/api/organizations/{ORG}/usage`,并在 headers 中模仿 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 Embed “Pause session — quota 5h atteint” → 释放锁)。
6. 每周限流是**持久化存储的**
(`_secrets/quota_state.json`),因此即使 GUI 重启它也不会重置。在配额限制解除之前,“▶ Lancer”按钮都会被
禁用(当配额下降时自动重置,或者在确认后
手动点击“Reset throttle hebdo”)。
7. 当 5 小时计数器低于阈值或在重置后自动恢复会话。无需
时刻盯守,我让它自动运行,早上醒来时还能拥有完整的配额
去做其他事情。
这通常是别人会告诉我“不可能实现 / API 没有文档说明 / 需要代理”
的那种事情。但实际上:200 行 Python 代码 +
DevTools + DPAPI = 问题解决。
## 健壮性与运维
- **托盘看门狗 (Watchdog)**:如果机器人崩溃,将在 10 秒后自动重启。它在 3 个月内崩溃了 77 次,但从未导致服务中断。
- **原子写入**:所有的 JSON 和 YAML 都是通过 `.tmp` + `os.replace` 写入的 —— 如果在写入过程中发生崩溃,也不会导致文件损坏。
- **MD5 去重**:RSS 按 30 天进行去重,COURS 答案按文件去重,Arsenal CSV 按 `(plateforme, id)` 去重。
- **版本控制**:MD5 发生变化的答案会被加上 `🔄 Version N` 前缀重新发布,历史记录会被保存在 `versions[]` 中。
- **追赶机制 (Catch-up)**:如果机器人在 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 pipeline。
- LLM 集成(API + CLI 订阅)及自动 fallback。
- GPU 计算(CUDA, faster-whisper, easyocr)。
- 高级 Discord API 操作(forums, tags, Style Magazine embeds, 超出 discord.py 范围的直接 REST 调用)。
- 原生 Windows 运维(PowerShell, 托盘服务, 自动重启, 使用 **DPAPI** 保护本地机密)。
- 配置即代码(通过 ruamel 实现 YAML preserve-roundtrip)。
- 可观测性(颜色编码的 embeds,带有日期的会话文件,审计脚本)。
- **逆向工程私有 API**(DevTools Network, 模仿 Chrome, 绕过 Cloudflare, 抓取配额)。
- **Python 桌面 GUI**(Tkinter, 用于网络 I/O 的 daemon 线程, 用于优雅停止的适当信号)。
- 当主要下载工具失效时的**多重下载策略**(例如:`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` 是一个带有系统托盘图标的看门狗程序:
- 以无控制台的子进程方式 spawn `python -u bot.py`。
- 崩溃 10 秒后自动重启(每次崩溃都会弹出 Windows toast 通知)。
- 彩色图标(绿色 running / 橙色 pause / 红色 crash / 蓝色 restart)。
- 右键菜单:查看日志 / 暂停 / 重启 / 开关自启 / 退出。
- 带有自动滚动功能的 Tk 实时日志窗口,可从菜单中打开。
静默启动:双击 `start_tray.vbs`(使用 `pythonw.exe`,无控制台)。托盘菜单可以自动在 Windows 启动文件夹中安装或移除 `BotGSTAR_Tray.vbs` 快捷方式,以实现开机自启。
### 控制台模式()
`start_bot.bat` 依然可以使用:
- 重启循环(崩溃间隔 10 秒)。
- 控制台实时日志 + `%TEMP%\BotGSTAR_startup.log`。
- **“点击即重启”的语义**:启动时,会杀死任何其他实例(通过标题杀死旧的看门狗,通过 cmdline 杀死旧的 `bot.py`),然后接管控制权。保证只有一个实例在运行。
一次只能运行两种模式中的一个 —— 托盘看门狗会自行管理 `bot.py` 子进程,如果同时运行 `start_bot.bat` 将会产生两个互相冲突的并发实例。
## 环境变量
| 变量 | 位置 | 用途 |
|---|---|---|
| `DISCORD_BOT_TOKEN` | 根目录 `.env` | Discord 机器人的 Token |
| `ANTHROPIC_API_KEY` | Windows env | Claude Key(用于 CM 摘要,可选 —— 可回退至 CLI 订阅) |
## 详细文档
| 文件 | 受众 |
|---|---|
| `CLAUDE.md` | Cog 的详细架构(开发参考,也供 Claude Code 自身使用)。 |
| `CHANGELOG.md` | 各阶段的功能演进(veille 的 R-A → R-H,tray 的 S)。 |
| `GUIDE_VEILLE.md` | RSS 监测用户手册(读者 / 管理员 / 维护者)。 |
| `COURS/CLAUDE.md` | COURS 项目方面的磁盘文件约定。 |
| `COURS/CHANGELOG.md` | 课程 pipeline 的演进(Phase A → I)。 |
## Roadmap
- [ ] **自动化政治论坛** —— 以 COURS 答案论坛为模板,为每个重大政治主题(退休、移民、生态)创建 1 个 thread,并发布聚合后的视频+转录+摘要。
- [ ] **Web Dashboard** —— 使用 Streamlit 或 FastAPI + HTMX 可视化 Arsenal 的 CSV 数据,通过关键词进行过滤,并导出统计数据。
- [ ] **主题检测** —— 对 Whisper 转录内容进行语义聚类,以自动发现新兴话题。
- [ ] **多租户 (Multi-tenant)** —— 改造机器人,使其他 ISTIC 学生能够为其所在群组自行部署。
- [ ] **英/西语国际监测** —— 将政治 RSS 系统扩展至国外的激进左翼媒体。
## 联系方式
- **Email**:[gaylordaboeka@gmail.com](mailto:gaylordaboeka@gmail.com)
- **Instagram**:[@gaylordaboeka](https://www.instagram.com/gaylordaboeka/)
- **所在地**:Rennes (35000)
_本 README 是在 2026 年 4 月的一个夜间结对编程会话中与 Claude Code 共同撰写的,与此同时,Whisper 正在后台转录 447 个政治视频。充满 Meta 感。_
标签:AI摘要, Discord机器人, ESC4, OSINT, Python, RSS监控, Web爬虫, 无后门