marcoodistefano/CTFTimeBot

GitHub: marcoodistefano/CTFTimeBot

一款 Discord 机器人,自动获取 CTFtime.org 的赛事信息并定时推送到服务器频道,帮助 CTF 团队追踪赛事日程。

Stars: 0 | Forks: 0

# 🕛 CTFTime Notifier Bot **[➕ 添加到 Discord](https://top.gg/bot/1217196592046538993) | [⭐ 在 TOP.GG 投票](https://top.gg/bot/1217196592046538993)** 一款高级且可靠的 Discord 机器人,可自动将 CTFtime.org 上即将举办的夺旗赛 (CTF) 活动发布到您的服务器。 保持井然有序,绝不错过任何比赛,并让您的 CTF 团队自动获取最新信息! ## 🆕 **近期重大更新 (2025)** - **🔥 Firebase Realtime Database 集成**:完全从本地 JSON 文件迁移至基于云的持久化存储 - **☁️ 持久化配置**:所有设置在机器人重启、崩溃和重新部署后均会自动保留 - **多服务器支持**:每个服务器(guild)都有自己独立的日程安排和配置 - **强大的 scheduler 管理**:scheduler 任务现在按 guild 通过全局注册表进行追踪,确保状态可靠并能重启 - **自动重启 scheduler**:对日程频道、时间或时区的任何更改都会立即取消并重启该服务器的 scheduler - **重启时自动恢复**:机器人在启动时会自动从 Firebase 恢复所有服务器配置和 scheduler - **scheduler 状态与日志**:`/scheduler_logs` 和 `/debug` 现在能显示每个服务器准确、实时的 scheduler 和配置信息 - **清理帮助命令**:`/help_ctf` 现在只列出可用且正常的命令 - **高级 debug 工具**:改进了 `/debug` 输出,包含配置、权限和脚本检查 - **更安全的任务处理**:机器人防止出现重复或僵尸 scheduler 任务,并始终反映最新的配置 - **改进的错误处理**:为所有命令提供更健壮的反馈和错误消息 - **更清晰的代码与文档**:所有命令和帮助文本均已更新,反映了机器人的真实功能 - **全天候托管就绪**:针对 Render.com 进行了优化,支持自动 keep-alive 和环境变量 ## 🚀 主要功能 * ⏰ **自动每日更新** 机器人每天会在您首选的时间获取并发布即将举行的 CTF 活动列表。 * 🔥 **Firebase 云存储** 所有配置都存储在 Firebase Realtime Database 中——在重启、崩溃和重新部署后自动保留。 * ☁️ **零数据丢失** 您的设置将永久保存在云端,没有本地文件依赖。 * 🌍 **全面的时区支持** 可针对全球任何时区进行配置(Europe/Rome、America/New_York、Asia/Tokyo 等)。 * 🕐 **可自定义的日程时间** 设置您首选的每日消息发送时间(不限于午夜!)。 * 🗑️ **自动清理频道** 在发送更新之前自动清除以前的消息。 * 📅 **一目了然的 CTF 赛事** 显示每场即将举行的比赛的赛事名称、日期、持续时间和直接链接。 * 🔧 **高级 debug 工具** 为管理员提供完整的监控和诊断系统。 * 🌐 **来自 CTFtime.org 的数据** 使用直接来自 CTFtime 网站的官方数据,始终保持最新。 * 🏢 **支持多服务器** 每个 Discord 服务器都有自己独立的配置和 scheduler。 * 🔄 **自动重启 scheduler** 对频道、时间或时区的任何更改都会重启该服务器的 scheduler。 * 🔁 **自动恢复** 机器人在任何重启后会自动恢复所有配置并重启所有 scheduler。 * 🛡️ **可靠的 scheduler 状态/日志** `/scheduler_logs` 和 `/debug` 始终反映 scheduler 和配置的真实状态。 * 🧹 **清晰且最新的帮助** `/help_ctf` 仅显示正常运行的命令。 ## 📋 可用命令 (2025) ### 📢 主要命令 | 命令 | 描述 | |---------|-------------| | `/upcoming` | 立即显示即将举行的 CTF 赛事 | | `/events` | 搜索并过滤即将举行的活动(格式、线上、权重) | | `/eventinfo ` | 获取特定 CTF 的详细信息 | | `/teaminfo ` | 获取特定 CTF 战队的详细信息 | | `/topbycountry ` | 获取特定国家/地区的顶级战队 | | `/topteams [year] [limit]` | 获取当前或特定年份的顶级战队 | | `/results [year] [limit]` | 获取全球 CTF 结果 | | `/help_ctf` | 显示所有可用命令 | ### ⚙️ 日程配置 | 命令 | 描述 | |---------|-------------| | `/set_schedule_channel` | 设置用于接收每日消息的当前频道(重启 scheduler) | | `/unset_schedule_channel` | 移除计划频道(停止 scheduler) | | `/schedule_status` | 显示当前 scheduler 状态 | ### 🕐 时间管理 | 命令 | 示例 | 描述 | |---------|---------|-------------| | `/set_schedule_time [minute]` | `/set_schedule_time 8 30` | 设置消息时间(重启 scheduler) | | `/get_schedule_time` | - | 显示当前设置的时间 | | `/reset_schedule_time` | - | 将时间重置为午夜(重启 scheduler) | ### 🌍 时区管理 | 命令 | 示例 | 描述 | |---------|---------|-------------| | `/set_timezone ` | `/set_timezone Europe/Rome` | 设置时区(重启 scheduler) | | `/get_timezone` | - | 显示当前设置的时区 | | `/list_timezones [region]` | `/list_timezones Europe` | 列出可用时区 | | `/reset_timezone` | - | 重置为 Europe/Rome(重启 scheduler) | ### 🔧 管理员命令 | 命令 | 描述 | |---------|-------------| | `/test_schedule` | 测试计划发送(包含频道清理) | | `/force_schedule` | 强制立即发送计划消息 | | `/test_now` | 不删除消息的快速测试 | | `/clear_channel` | 清除计划频道中的所有消息 | | `/debug` | 显示详细的 debug 信息(按服务器) | | `/scheduler_logs` | 检查日程任务状态(按服务器,始终准确) | | `/restart_scheduler` | 重启此服务器的日程任务 | ## 🎯 快速入门指南(多服务器,2025) ### 1️⃣ 初始设置 ``` 1. /set_schedule_channel # In the channel where you want messages (restarts scheduler) 2. /set_schedule_time 8 0 # Set time (e.g., 08:00, restarts scheduler) 3. /set_timezone Europe/Rome # Set your timezone (restarts scheduler) ``` ### 2️⃣ 验证配置 ``` /schedule_status # Check that everything is configured ``` ### 3️⃣ 测试功能 ``` /test_now # Quick test /force_schedule # Complete test with cleanup ``` ## 🌍 支持的时区 该机器人支持所有标准时区。以下是一些示例: **欧洲:** - `Europe/Rome`(意大利) - `Europe/London`(英国) - `Europe/Paris`(法国) - `Europe/Berlin`(德国) **美洲:** - `America/New_York`(美国东部) - `America/Los_Angeles`(美国西部) - `America/Chicago`(美国中部) - `America/Toronto`(加拿大) **亚洲:** - `Asia/Tokyo`(日本) - `Asia/Shanghai`(中国) - `Asia/Mumbai`(印度) - `Asia/Dubai`(阿联酋) **大洋洲:** - `Australia/Sydney` - `Pacific/Auckland` 使用 `/list_timezones` 查看所有可用时区,或使用 `/list_timezones [region]` 查看特定区域。 ## ➕ 将机器人添加到您的服务器 **[🎯 从 TOP.GG 邀请 CTFTime Notifier Bot](https://top.gg/bot/1217196592046538993)** 该机器人全天候托管,随时可用!只需点击上方链接将其添加到您的 Discord 服务器。 ### 🚀 快速开始 一旦受邀加入您的服务器: 1. **设置您的频道**:在您希望接收每日更新的频道中运行 `/set_schedule_channel` 2. **自定义(可选)**: - `/set_schedule_time 9 0` - 设置时间(例如 09:00) - `/set_timezone Europe/Rome` - 设置您的时区 3. 大功告成!机器人将每天自动发布 CTF 活动 🎉 ### 🔐 所需的机器人权限 确保机器人具有以下权限: - ✅ **Send Messages** - 用于发布更新 - ✅ **Manage Messages** - 用于清除旧消息 - ✅ **Embed Links** - 用于显示格式化的事件卡片 ## 🛠️ 故障排除 ### 📋 前置条件 1. **Discord Bot Token**:在 [Discord Developer Portal](https://discord.com/developers/applications) 创建一个机器人 2. **Firebase Project**:设置 Firebase Realtime Database(参见 [FIREBASE_SETUP.md](FIREBASE_SETUP.md)) 3. **托管平台**:推荐:[Render.com](https://render.com)(提供免费层) ### ☁️ 在 Render 上部署(推荐 - 免费 24/7 托管) #### 1. Fork/克隆此仓库 ``` git clone https://github.com/Mrk756/CtfTimeBot.git cd CtfTimeBot ``` #### 2. 设置 Firebase 按照 [FIREBASE_SETUP.md](FIREBASE_SETUP.md) 中的完整指南进行操作,以: - 创建一个 Firebase 项目 - 启用 Realtime Database - 下载服务账号凭据 - 获取您的数据库 URL #### 3. 部署到 Render 1. 前往 [Render Dashboard](https://dashboard.render.com/) 2. 点击 **"New +"** → **"Web Service"** 3. 连接您的 GitHub 仓库 4. 配置: - **Name**:`ctftime-bot`(或您自定义的名称) - **Environment**:`Python 3` - **Build Command**:(留空,从 `requirements.txt` 自动检测) - **Start Command**:(从 `Procfile` 自动检测:`python main.py`) - **Plan**:Free #### 4. 添加环境变量 在 Render 中,转到 **Environment**(环境)选项卡并添加: | 变量 | 值 | 在哪里查找 | |----------|-------|---------------| | `DISCORD_TOKEN` | 您的 Discord 机器人 token | [Discord Developer Portal](https://discord.com/developers/applications) | | `FIREBASE_DATABASE_URL` | `https://your-project.firebaseio.com/` | Firebase Console → Realtime Database | | `FIREBASE_CREDENTIALS` | 凭据文件中的完整 JSON | 从 Firebase 下载(粘贴完整的 JSON) | **重要提示**:对于 `FIREBASE_CREDENTIALS`,请粘贴您 Firebase 凭据 JSON 文件的**完整内容**。 #### 5. 部署! 点击 **"Create Web Service"** - Render 将自动: - 从 `requirements.txt` 安装依赖项 - 使用 `Procfile` 启动机器人 - 保持其 24/7 运行 ### 🖥️ 本地开发 #### 1. 克隆并安装 ``` git clone https://github.com/Mrk756/CtfTimeBot.git cd CtfTimeBot pip install -r requirements.txt ``` #### 2. 配置环境 创建一个 `.env` 文件: ``` DISCORD_TOKEN=your_discord_bot_token FIREBASE_DATABASE_URL=https://your-project-default-rtdb.firebaseio.com/ FIREBASE_CREDENTIALS_PATH=firebase-credentials.json ``` 将您的 Firebase 凭据 JSON 文件作为 `firebase-credentials.json` 放在项目根目录中。 #### 3. 运行 ``` python main.py ``` ### 🔧 保持机器人 24/7 在线(可选但推荐) Render 免费层在 15 分钟不活动后会休眠。使用 [UptimeRobot](https://uptimerobot.com/)(免费)每 5 分钟 ping 一次您的机器人: 1. 在 [UptimeRobot](https://uptimerobot.com/) 注册 2. 创建一个新的监控: - **Monitor Type**:HTTP(s) - **URL**:您的 Render URL(例如 `https://ctftime-bot.onrender.com`) - **Monitoring Interval**:5 分钟 3. 保存 - 您的机器人将永远不会休眠! 🎉 ### 📦 依赖项 ``` python-dotenv # Environment variables nextcord # Discord API wrapper aiohttp # Asynchronous HTTP requests flask # Keep-alive web server firebase-admin # Firebase Realtime Database ``` 所有依赖项都会从 `requirements.txt` 自动安装。 ### 🔐 安全说明 - ✅ 切勿将 `.env` 文件或 Firebase 凭据提交到 Git - ✅ 对所有密钥使用环境变量 - ✅ Firebase 凭据已包含在 `.gitignore` 中 - ✅ 配置 Firebase 安全规则(参见 [FIREBASE_SETUP.md](FIREBASE_SETUP.md)) ## 🛠️ 故障排除 (2025) ### 机器人没有发送计划消息? 1. 使用 `/scheduler_logs` 检查任务是否处于活动状态(按服务器,始终最新) 2. 使用 `/debug` 验证配置(按服务器) 3. 如有必要,尝试使用 `/restart_scheduler`(可靠,按服务器) ### 时区错误? 1. 使用 `/list_timezones` 查看有效的时区 2. 使用 `/get_timezone` 检查当前时区 3. 如有必要,使用 `/reset_timezone` 进行重置 ### 权限问题? 机器人需要以下权限: - ✅ Send Messages - ✅ Manage Messages(用于清理频道) - ✅ Embed Links ### Firebase 连接失败? 1. 检查 `FIREBASE_DATABASE_URL` 是否正确(末尾没有 `/` 的问题) 2. 验证 `FIREBASE_CREDENTIALS` 包含有效的 JSON 3. 确保 Firebase 安全规则允许服务账号访问 4. Render 日志以获取具体的错误消息 ### 重启后配置未保留? 使用 Firebase **绝不**应发生这种情况!机器人在重新上线时会自动恢复所有配置。 如果您遇到问题: - 使用 `/debug` 检查您当前的配置 - 尝试使用 `/restart_scheduler` 手动重启 scheduler - 如果问题持续存在,请联系支持 ## 📸 示例输出 ![CTF 赛事示例](https://static.pigsec.cn/wp-content/uploads/repos/cas/b7/b7991652098ba00023668e1109e67530d832ca89aaeed53b6df160059f0667dc.jpg) ## 🔄 更新与功能 **2025 年重大更新:** - 支持多服务器,具备基于 guild 的配置和日程安排 - 全局 scheduler 任务注册表,确保状态稳健且易于重启 - 每次配置更改(频道、时间、时区)时自动重启 scheduler - `/scheduler_logs` 和 `/debug` 始终反映真实状态 - `/help_ctf` 已清理且始终保持最新 - 改进了错误处理和反馈 - 不再有僵尸或重复的 scheduler 任务 ## 👩‍💻 面向开发者 想要自托管或为机器人做贡献吗?以下是您需要了解的内容: ### 🛠️ 技术栈 - **语言**:Python 3.13+ - **Discord 库**:[nextcord](https://github.com/nextcord/nextcord) - **数据库**:Firebase Realtime Database - **Web Scraping**:BeautifulSoup4 + Requests - **托管**:Render.com(或任何 Python 托管平台) - **Keep-Alive**:Flask Web 服务器 ### 📦 安装与设置 #### 1. 克隆仓库 ``` git clone https://github.com/Mrk756/CtfTimeBot.git cd CtfTimeBot pip install -r requirements.txt ``` #### 2. Firebase 设置 按照 **[FIREBASE_SETUP.md](FIREBASE_SETUP.md)** 中的完整指南进行操作,以: - 创建一个 Firebase 项目 - 启用 Realtime Database - 下载服务账号凭据 - 配置安全规则 #### 3. 环境变量 创建一个 `.env` 文件: ``` DISCORD_TOKEN=your_discord_bot_token FIREBASE_DATABASE_URL=https://your-project-default-rtdb.firebaseio.com/ FIREBASE_CREDENTIALS_PATH=firebase-credentials.json ``` 或者对于云部署(例如 Render): ``` DISCORD_TOKEN=your_discord_bot_token FIREBASE_DATABASE_URL=https://your-project-default-rtdb.firebaseio.com/ FIREBASE_CREDENTIALS= ``` #### 4. 在本地运行 ``` python main.py ``` ### ☁️ 部署到 Render 1. Fork 此仓库 2. 在 [Render](https://render.com) 上创建一个新的 **Web Service** 3. 连接您的 GitHub 仓库 4. 添加环境变量(参见上面的第 3 步) 5. 部署!`Procfile` 和 `requirements.txt` 将处理其余部分 **Render 配置:** - **Build Command**:(从 `requirements.txt` 自动检测) - **Start Command**:`python main.py`(来自 `Procfile`) - **Environment**:Python 3 ### 🔧 项目结构 ``` CtfTimeBot/ ├── main.py # Main bot logic & schedule management ├── ctftime_commands.py # Advanced CTFTime API commands ├── firebase_db.py # Firebase database abstraction ├── webserver.py # Flask keep-alive server ├── requirements.txt # Python dependencies ├── Procfile # Render deployment config ├── .env # Environment variables (local) ├── .gitignore # Git ignore rules ├── README.md # This file └── FIREBASE_SETUP.md # Firebase setup guide ``` ### 🔐 安全说明 - ✅ 切勿提交 `.env` 或 `firebase-credentials.json` - ✅ 对所有密钥使用环境变量 - ✅ 配置 Firebase 安全规则(参见 `FIREBASE_SETUP.md`) - ✅ 保持依赖项更新 ### 🤝 贡献 欢迎各种贡献!如需贡献: 1. Fork 该仓库 2. 创建一个功能分支 (`git checkout -b feature/AmazingFeature`) 3. 提交您的更改 (`git commit -m 'Add AmazingFeature'`) 4. 推送到该分支 (`git push origin feature/AmazingFeature`) 5. 发起一个 Pull Request **欢迎贡献的领域:** - Bug 修复 - 新功能(例如更多 CTF 平台) - 文档改进 - 代码优化 ### 📚 更多开发者文档 - **[FIREBASE_SETUP.md](FIREBASE_SETUP.md)** - 完整的 Firebase 设置指南 - **[requirements.txt](requirements.txt)** - Python 依赖项 - **[Procfile](Procfile)** - 部署配置 ### 📄 许可证 该项目是开源的,并在 MIT 许可证下可用。 ## 💬 支持与社区 - **需要帮助?** 在 Discord 中使用 `/help_ctf` - **Bug 报告**:[GitHub Issues](https://github.com/Mrk756/CtfTimeBot/issues) - **为机器人投票**:[TOP.GG](https://top.gg/bot/1217196592046538993) ⭐ ## 🙏 鸣谢 - CTF 赛事数据来自 [CTFtime.org](https://ctftime.org/) - 使用 [nextcord](https://github.com/nextcord/nextcord) 构建 - 由 [Firebase](https://firebase.google.com/) 提供持久化存储 - 托管于 [Render](https://render.com/) - 在 [TOP.GG](https://top.gg/bot/1217196592046538993) 上发布 **让您的 CTF 团队时刻保持更新! 🚀** **[➕ 添加到 Discord](https://top.gg/bot/1217196592046538993) | [⭐ 在 TOP.GG 投票](https://top.gg/bot/1217196592046538993) | [🐛 报告问题](https://github.com/Mrk756/CtfTimeBot/issues)** **需要帮助?** 查看 [FIREBASE_SETUP.md](FIREBASE_SETUP.md) 获取详细的设置说明,或在 GitHub 上提交一个 issue。
标签:Discord机器人, Firebase, Webhooks, 任务调度, 网络调试, 自动化, 逆向工具