Files
script/telegram/README.md
Orion 6eaf04e77b fix(core): 🛠️ 限制批量删除消息的最大数量为100
通过引入 MAX_BATCH_DELETE 常量,将单次批量删除消息的数量限制在 100 条以内。此更改提高了操作的安全性,防止因误操作或恶意请求导致的大规模数据删除,并同步更新了相关文档说明。

- 在 tg-bot.js 中添加 MAX_BATCH_DELETE 常量
- 重构部分代码逻辑以符合批量删除限制
- 更新 README.md,向用户明确单次删除上限为 100 条
2026-05-05 00:40:25 +08:00

294 lines
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Telegram Bot Worker
`tg-bot.js` 是一个部署在 Cloudflare Workers 上的 Telegram 双向私聊中继 Bot版本 v3.68)。它会把用户私聊消息转发到管理员论坛群的独立 topic 中,管理员在对应 topic 内回复即可把消息发回用户,同时提供验证、过滤、封禁、备注、自动回复、备份和 Telegram 内联管理面板。
**核心特点:**
- **无回执体验**:移除了用户侧"已送达"和管理员侧"已回复"回执提示,减少打扰
- **安全加固**:支持 Webhook secret 校验、WebApp initData 验证、nonce 防伪造、管理员精确匹配
- **消息编辑同步**:用户和管理员编辑消息时,对方会收到修改通知
- **双向删除**:用户和管理员都可以通过 `/del` 命令删除消息
## 来源与致谢
本脚本基于 [huliyoudiangou/TG_Chat_Bot-D1](https://github.com/huliyoudiangou/TG_Chat_Bot-D1) 二次修改与自用优化。原项目是一个基于 Cloudflare Worker 和 D1 数据库的 Telegram 双向机器人,并在 GitHub 页面中标注为 forked from [moistrr/TGbot-D1](https://github.com/moistrr/TGbot-D1)。
感谢原作者提供 Cloudflare Worker + D1 + Telegram forum topic 的完整实现思路。本仓库版本主要保留原项目的核心工作流,并针对个人使用习惯做了精简、无回执体验、消息编辑同步和安全加固。
## 本版本调整 (v3.68)
### 用户体验优化
- ✅ 去掉用户侧"已送达"和管理员侧"已回复"回执,减少打扰和额外 API 调用
- ✅ 兼容无 `username` 的 Telegram 用户,资料卡仍可通过 `tg://user?id=...` 建立用户链接
- ✅ 支持用户编辑消息后,在管理员 topic 中记录修改前后内容
- ✅ 支持管理员编辑 topic 内消息后,主动通知用户"对方修改了消息"
### 安全加固
- ✅ 支持 Webhook secret 校验,配置 `TELEGRAM_WEBHOOK_SECRET` 后会拒绝非 Telegram webhook 请求
- ✅ 网页验证提交会校验 Telegram WebApp `initData`,并使用 nonce 防止伪造 `user_id`
- ✅ 管理员 ID 与协管 ID 使用精确匹配,避免字符串片段误判
- ✅ 屏蔽词和自动回复正则使用安全包装,降低坏正则导致 Worker 异常或 ReDoS 的风险
- ✅ 内置正则安全检查机制,拒绝复杂表达式(反向引用、环视等)
### 新增功能
-**双向消息删除**:用户和管理员都可以通过 `/del` 命令删除消息(详见下方说明)
-**引用消息支持**:用户使用 `>``》``>` 开头的文本会被渲染为引用块
-**媒体欢迎语**:支持图片/视频/GIF 作为欢迎语,可设置 caption
-**话题自愈机制**:当 topic 失效时自动重建并迁移数据
## 核心功能
### 消息转发
- 私聊用户消息转发到管理员群论坛 topic
- 每个用户自动创建独立 topic并推送用户身份卡片
- 管理员在对应 topic 内回复,即可把消息复制回用户私聊
- 支持消息引用关系保持(用户和管理员均可引用回复)
### 验证系统
- 支持 Cloudflare Turnstile 或 Google reCAPTCHA 人机验证
- 支持二次问答验证
- 支持验证码模式动态切换Turnstile ↔ reCAPTCHA ↔ 关闭)
- 验证状态持久化,无需重复验证
### 消息类型控制
- 支持文本、媒体、链接、转发、频道转发、音频、贴纸/GIF 等类型过滤
- 管理员可单独控制每种消息类型的转发开关
- 管理员不受过滤限制,所有消息类型均可发送
### 智能回复
- 支持关键词自动回复(格式:`关键词===回复内容`
- 支持屏蔽词计数封禁(可配置阈值)
- 支持忙碌模式自动回复
### 用户管理
- 支持黑名单 topic、用户解封、备注、资料卡置顶
- 支持消息编辑记录同步
- 支持消息备份到指定群或频道
- 内置 Telegram 管理面板,主管理员通过 `/start` 打开
### 双向消息删除
- **用户侧**:引用自己发送的消息,发送 `/del` 命令,可以删除该消息并通知管理员。
- **管理员侧**
- **单条删除**:在 topic 中引用消息,发送 `/del` 命令,可以同时删除用户侧和管理员侧的消息。
- **批量删除**:直接发送 `/del N`(如 `/del 3`),可删除当前话题内最近的 N 条消息(仅限管理员使用,单次最多 100 条)。
- **全量清空**:主管理员可使用 `/del all` 清空当前话题的所有历史消息。
- **权限控制**:用户只能删除自己发送的消息,无法删除管理员回复的消息;批量删除功能仅对管理员开放。
## 运行环境
- Cloudflare Workers
- Cloudflare D1 数据库绑定
- Telegram Bot Token
- 启用话题的 Telegram 管理群
- 可选Cloudflare Turnstile 或 Google reCAPTCHA 密钥
## 必需环境变量
| 名称 | 说明 |
| --- | --- |
| `BOT_TOKEN` | Telegram Bot Token |
| `ADMIN_IDS` | 主管理员 Telegram user id多个用英文或中文逗号分隔 |
| `ADMIN_GROUP_ID` | 管理员论坛群 ID通常是 `-100...` |
| `WORKER_URL` | Worker 公开访问地址,不要带结尾斜杠 |
## 可选环境变量
| 名称 | 说明 |
| --- | --- |
| `TURNSTILE_SITE_KEY` | Cloudflare Turnstile site key |
| `TURNSTILE_SECRET_KEY` | Cloudflare Turnstile secret key |
| `RECAPTCHA_SITE_KEY` | Google reCAPTCHA site key |
| `RECAPTCHA_SECRET_KEY` | Google reCAPTCHA secret key |
| `WELCOME_MESSAGE` | 默认欢迎语,对应配置项 `welcome_msg` |
| `VERIF_QUESTION` | 默认问答验证问题,对应 `verif_q` |
| `VERIF_ANSWER` | 默认问答验证答案,对应 `verif_a` |
| `TELEGRAM_WEBHOOK_SECRET` | Telegram Webhook secret token配置后会校验请求头 |
大多数运行时配置也可以在管理员面板中调整,并优先保存到 D1。
## D1 绑定
Worker 需要绑定一个 D1 数据库,绑定名必须是:
```text
TG_BOT_DB
```
脚本会自动创建和维护以下表:
- `config`:配置项。
- `users`用户状态、封禁状态、topic 映射、用户资料。
- `messages`:用户消息与管理员群 topic 消息的映射。
## 默认配置
| 配置项 | 默认值 | 说明 |
| --- | --- | --- |
| `welcome_msg` | `欢迎 {name}!使用前请先完成验证。` | 欢迎语,支持 `{name}``{user}`,也可配置为媒体(图片/视频/GIF |
| `enable_verify` | `true` | 是否启用网页人机验证 |
| `enable_qa_verify` | `true` | 是否启用问答验证 |
| `captcha_mode` | `turnstile` | 验证模式:`turnstile``recaptcha` |
| `verif_q` | `1+1=?\n提示答案在简介中。` | 问题验证题目 |
| `verif_a` | `3` | 问题验证答案 |
| `block_threshold` | `5` | 命中屏蔽词多少次后封禁 |
| `busy_mode` | `false` | 是否启用非营业自动回复 |
| `enable_admin_receipt` | `false` | 管理员回执开关,当前版本默认不发送回执 |
**注意**`welcome_msg` 支持两种格式:
1. 纯文本:直接输入文字,支持 `{name}` 占位符
2. 媒体配置:发送图片/视频/GIF 给机器人,会自动转换为 JSON 配置
## 部署流程
1. 在 Telegram 中创建 Bot拿到 `BOT_TOKEN`
2. 创建一个启用 Topics 的 Telegram 群,把 Bot 拉入群。
3. 给 Bot 管理员权限,至少需要发消息、管理话题、置顶消息等能力。
4. 在 Cloudflare 创建 D1 数据库并绑定为 `TG_BOT_DB`
5. 创建 Worker把 [tg-bot.js](tg-bot.js) 作为 Worker 代码。
6. 配置环境变量 `BOT_TOKEN``ADMIN_IDS``ADMIN_GROUP_ID``WORKER_URL`
7. 如果使用网页验证,配置 Turnstile 或 reCAPTCHA 的 site key 与 secret key。
8. 设置 Telegram Webhook。
不使用 secret token 时:
```bash
curl "https://api.telegram.org/bot<BOT_TOKEN>/setWebhook?url=<WORKER_URL>"
```
推荐配置 `TELEGRAM_WEBHOOK_SECRET`,并设置 Webhook secret token
```bash
curl -X POST "https://api.telegram.org/bot<BOT_TOKEN>/setWebhook" \
-d "url=<WORKER_URL>" \
-d "secret_token=<TELEGRAM_WEBHOOK_SECRET>"
```
9. 访问 Worker 根路径,若返回 `Bot v3.68 Active`,说明 Worker 基本可用。
10. 主管理员私聊 Bot 发送 `/start`,打开控制面板。
11. **首次启动建议**
- 在面板中配置欢迎语(可选媒体)
- 设置验证问题和答案
- 添加协管管理员(如有需要)
- 配置自动回复规则
- 设置屏蔽词列表
## Webhook 路由
| 路径 | 方法 | 用途 |
| --- | --- | --- |
| `/` | `GET` | 健康检查 |
| `/verify` | `GET` | Telegram Web App 验证页面 |
| `/submit_token` | `POST` | 验证 token 提交 |
| `/` | `POST` | Telegram Webhook 更新入口 |
## 管理员面板
主管理员私聊 Bot 发送 `/start` 后会打开配置面板,包含以下模块:
### 📝 基础配置
- 欢迎语(支持文字或图片/视频/GIF
- 验证问题与答案
- 验证码模式切换Cloudflare / Google / 关闭)
- 问题验证开关
### 🤖 自动回复
- 添加或删除关键词自动回复
- 格式:`关键词===回复内容`
- 示例:`价格===请联系人工客服`
### 🚫 屏蔽词
- 添加或删除正则关键词
- 命中后累计计数,达到阈值自动封禁
- 建议使用简单正则,避免复杂表达式
### 🛠 过滤设置
- 控制转发、媒体、语音、贴纸、链接、频道、文本等类型
- 可单独开启/关闭每种消息类型
- 管理员不受过滤限制
### 👮 协管管理
- 维护额外授权管理员列表
- 支持批量输入:`123456,789012`
- 协管拥有回复权限,但无法访问管理面板
### 💾 备份/通知
- 设置备份群 ID所有消息会异步归档
- 重置黑名单 topic
### 🌙 营业状态
- 切换忙碌模式
- 修改非营业时间自动回复语
## 用户流程
1. 用户私聊 Bot 发送 `/start`
2. Bot 发送欢迎语(可能是文字或媒体)。
3. 如果启用网页验证,用户点击按钮完成 Turnstile 或 reCAPTCHA。
4. 如果启用问答验证,用户继续回答问题。
5. 验证通过后,用户消息会转发到管理员群中的个人 topic。
6. 管理员在 topic 中回复Bot 会把回复发送给该用户。
7. 用户或管理员编辑消息时Bot 会同步对应的编辑提示。
8. **引用消息**:用户可以使用 `>``》``&gt;` 开头来引用之前的内容。
9. **删除消息**
- **用户侧**:引用自己发送的消息,发送 `/del` 命令,可以删除该消息并通知管理员。
- **管理员侧**
- 引用消息发送 `/del`:删除指定的单条双向记录。
- 直接发送 `/del N`:删除当前话题内最近的 N 条消息(例如 `/del 5`,单次上限 100 条)。
- 主管理员发送 `/del all`:清空当前话题的所有历史记录。
- **注意**:用户只能删除自己发送的消息,无法删除管理员回复的消息;批量删除功能仅对管理员开放。
### 特殊语法
- **引用块**:以 `>``》``&gt;` 开头的文本会被渲染为 HTML 引用块
- **媒体欢迎语**:管理员可以在面板中上传图片/视频/GIF 作为欢迎语
## 安全建议
### 🔐 认证与授权
- 推荐配置 `TELEGRAM_WEBHOOK_SECRET`;未配置时会保持兼容模式,不强制校验 Telegram Webhook secret。
- `ADMIN_IDS` 和协管列表会按逗号拆分后精确匹配,避免子串误判。
- 请妥善保护 `BOT_TOKEN`、验证码 secret、D1 数据库和 Cloudflare 账号权限。
### 🛡️ 防护措施
- 管理员群必须开启 Topics否则自动创建用户话题会失败。
- `WORKER_URL` 要使用 HTTPS 公开地址,否则 Telegram Web App 验证页面无法正常工作。
- Turnstile 和 reCAPTCHA 至少配置一种;如果关闭网页验证,可只使用问答验证。
- 屏蔽词和自动回复支持正则,但建议保持简单,避免复杂表达式造成匹配性能问题或被拒绝。
### ⚠️ 正则安全
- 系统内置正则安全检查,会拒绝以下模式:
- 嵌套量词(如 `(a+)+`
- 反向引用(如 `\1`
- 环视断言(如 `(?<=...)``(?<!...)`
- 超长模式(>256 字符)
- 这可以有效防止 ReDoS正则表达式拒绝服务攻击
### 📊 性能优化
- 系统使用内存缓存减少 D1 数据库读写(缓存 TTL 60 秒)
- 用户 topic 创建有锁机制,防止并发冲突
- 警告消息有 3 秒冷却时间,防止刷量攻击
## 技术细节
### 数据库结构
- **config**:存储配置项(键值对)
- **users**用户状态、封禁状态、topic 映射、用户资料JSON
- **messages**:用户消息与管理员群 topic 消息的双向映射
### 缓存机制
- 配置缓存TTL 60 秒,减少 D1 查询
- 管理员集合缓存TTL 60 秒,加速权限检查
- 用户锁机制:防止同一用户并发创建多个 topic
### API 调用策略
- 使用 `copyMessage` 优先,保持消息引用关系
- 降级使用 `forwardMessage`(不支持引用时)
- 错误自愈topic 失效时自动重建并重试
### 版本历史
- **v3.68**(当前版本):无回执模式 + 安全加固 + 双向删除
- 基于 [huliyoudiangou/TG_Chat_Bot-D1](https://github.com/huliyoudiangou/TG_Chat_Bot-D1) 二次开发
- 上游 fork 自 [moistrr/TGbot-D1](https://github.com/moistrr/TGbot-D1)
## 许可证与上游
原项目 [huliyoudiangou/TG_Chat_Bot-D1](https://github.com/huliyoudiangou/TG_Chat_Bot-D1) 采用 MIT License。本仓库中的修改版沿用原项目开源精神仅作个人维护与自用优化如需完整部署教程、上游更新和问题讨论请优先参考原作者仓库。