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爬虫, 无后门