- Go 88.9%
- Python 8.9%
- Shell 1.1%
- Dockerfile 1.1%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
- /ban 封禁成员,默认永久;/mute 禁言成员,默认永久 - mute/ban 后可跟时长参数,支持 1d12h30m 组合或纯数字(分钟) - 目标可通过回复消息或用户 ID 指定 - 双轨授权:Bot 管理员或本群管理员/群主均可使用 - 拒绝操作机器人自己、群管理员/群主及匿名管理员 Co-Authored-By: Claude <[email protected]> |
||
| .github/workflows | ||
| checkai | ||
| data | ||
| docs | ||
| internal | ||
| vendor | ||
| .dockerignore | ||
| .gitignore | ||
| config.example.yaml | ||
| docker-compose.yml | ||
| Dockerfile | ||
| go.mod | ||
| go.sum | ||
| main.go | ||
| main_test.go | ||
| README.md | ||
BAKABOT
BAKABOT 是一个 Telegram Bot。所有功能均以内置插件实现,当前包含 JM PDF 下载、二维码获取、群组置顶管理、群组管理和随机烂梗。
功能
- JM PDF 下载 (
/jm <id>):下载 JM album,解码图片并返回 PDF 文件 - 二维码获取 (
/maicode):获取舞萌 DX / 中二节奏登录二维码 - 群组置顶管理 (
/unpin):管理群置顶,并可自动取消绑定频道自动转发消息的置顶/unpin on- 开启自动取消置顶(会尽量删除置顶通知服务消息)/unpin off- 关闭自动取消置顶/unpin all- 取消所有历史置顶消息(仅群主)
- 随机烂梗 (
/6657):获取随机烂梗 - 群组管理 (
/ban/mute/unban/unmute):封禁/禁言群成员,支持回复消息或指定用户 ID,时长可省略(默认永久)/mute 30m、/mute 1d12h- 支持组合时长;纯数字按分钟计
- Guest Mode (
@Bot /指令):未加入的聊天中也可用 @Bot 召唤 Bot,以 guest 消息回复,与普通指令保持一致 - AI 生成检测 (
/checkai):对图片并行运行 C2PA、Meta Content Seal、OpenAI Content Provenance 检测器,汇总判定结果 - 权限管理:支持管理员和用户/群组白名单配置
Guest Mode
Guest Mode 允许 Bot 在未加入的私聊、群组或超群中,被用户通过 @Bot用户名 召唤后直接以 guest 消息形式回复,而无需加入该聊天。
开启方式:
- 在 Telegram 中找到 @BotFather → 打开 Bot 设置 MiniApp → 在设置中开启 Guest Mode。
- 重启本 Bot,启动日志会显示
Guest Mode 已启用或提示尚未开启。
行为说明:
- 用户在任何受支持聊天中用
@Bot用户名召唤(或回复 Bot 的 guest 消息)时,Bot 会收到guest_message更新并按插件逻辑回复。 - 带命令时(
@Bot /checkai、@Bot /6657)按注册表路由到对应插件,与普通指令保持一致;仅@Bot无命令时回复随机烂梗。 /unpin、/maicode不适用于 Guest Mode:前者依赖机器人成为群成员,后者需以图片回复。- guest 回复内容与普通命令共享插件的权限配置(
permission.allowed_users/permission.allowed_groups),无权限时不会回复内容。 - 目前支持 Guest Mode 的插件:
随机烂梗(sb6657)、AI 生成检测(checkai)。
快速开始
Docker Compose
git clone https://git.origami.pub/Bingxin/maimaibot.git
cd maimaibot
cp config.example.yaml config.yaml
# 编辑 config.yaml,填入 Telegram Bot Token 和插件配置
docker-compose up -d
手动运行
环境要求:
- Go 1.23 或更高版本
go mod download
go build -o bakabot .
./bakabot config.yaml
配置
配置文件使用 YAML 格式,参考 config.example.yaml。
telegram:
token: "YOUR_BOT_TOKEN_HERE"
use_webhook: false
permission:
admins:
- 123456789
allowed_users: []
allowed_groups: []
plugins:
jm:
work_dir: "data/jm"
domains: []
timeout_seconds: 600
request_timeout_seconds: 30
max_concurrency: 4
retry_times: 2
max_pages: 300
maicode:
api_url: "http://127.0.0.1:5000"
token: "maiqr"
conflict_window_minutes: 10
unpin:
state_file: "data/unpin.yaml"
plugins.jm.domains 留空时,插件会尝试从 JM 永久在线入口解析当前网页端域名,并使用内置域名兜底。如果你的网络环境需要固定域名或代理网关,可以在这里填写域名列表。
Webhook 模式
默认使用 polling 模式(机器人主动向 Telegram 拉取更新)。需要改用 webhook 模式(Telegram 主动把更新推送到你的服务器)时,按以下步骤配置。
1. 配置 config.yaml
telegram:
token: "YOUR_BOT_TOKEN_HERE"
use_webhook: true
webhook_url: "https://your-domain.com/webhook" # 公网 HTTPS 地址
webhook_listen: "0.0.0.0:8080" # 本地监听地址,默认 :8080
webhook_path: "/webhook" # 本地路径,默认 /webhook,需与 webhook_url 路径一致
webhook_secret: "一个足够长的随机字符串" # 强烈建议配置,防止伪造更新请求
可选字段:
webhook_cert_file/webhook_key_file:两者都配置时 Bot 直接以 HTTPS 对外服务;自签证书会一并上传给 Telegram 用于校验。- 两者留空时 Bot 以 HTTP 监听本地端口,需要由 nginx / Caddy 等反向代理提供 HTTPS。
2. 对外提供 HTTPS
Telegram 只接受 HTTPS 的 webhook 地址(127.0.0.1、localhost 等本机地址除外)。两种常见方式任选其一:
方式 A:反向代理(推荐,使用 Let's Encrypt 等免费证书)
nginx 示例:
server {
listen 443 ssl;
server_name your-domain.com;
ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem;
location /webhook {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
方式 B:Bot 直接监听 HTTPS(自签证书)
openssl req -x509 -newkey rsa:2048 -nodes -keyout bot.key -out bot.crt -days 365 -subj "/CN=your-domain.com"
把 webhook_cert_file / webhook_key_file 指向生成的 bot.crt / bot.key 后重启即可,证书会在设置 webhook 时自动上传给 Telegram 校验。
3. Docker
Docker 部署时需映射 webhook 端口(如需要证书则挂载证书文件),参考 docker-compose.yml。启动后可用 curl https://your-domain.com/healthz 验证服务是否在线。
提示:从 webhook 模式切换回 polling 模式时,机器人会自动调用
deleteWebhook清理配置,无需手动操作。
使用
JM PDF 下载
向机器人发送:
/jm 123456
机器人会下载对应 album 的所有章节图片,按 JM 的分图规则还原图片顺序,生成 PDF 后以文件形式回复。
二维码获取
向机器人发送:
/maicode
机器人会返回舞萌 DX / 中二节奏登录二维码,并在短时间内被不同用户重复获取时提示冲突风险。
群组置顶管理
在群组中使用:
/unpin on
/unpin off
/unpin all
权限要求:
/unpin on/off:需要群管理员权限/unpin all:仅群主可用
开发
内置插件统一放在 internal/plugin/ 下,并实现统一的插件接口:
type Plugin interface {
Name() string
Commands() []string
Handle(bot *tgbotapi.BotAPI, update tgbotapi.Update)
}
新增插件后,在 main.go 中注册即可。
许可证
本项目采用 MIT 许可证。详见 LICENSE 文件。
AI 生成检测
只检测图片:
/checkai + 回复图片或附带图片 —— 检测图片
机器人会并行运行以下检测器并汇总结果:
| 检测器 | 类型 | 说明 |
|---|---|---|
| C2PA 标准库 | 图片 | 读取并验证 C2PA / Content Credentials 元数据,检查 AI 生成声明 |
| Meta Content Seal(内容凭证) | 图片 | 基于 C2PA 内容凭证验证签名与 AI 声明 |
| OpenAI Content Provenance | 图片 | 调用 OpenAI 官方 Content Provenance API 检测 C2PA / SynthID 信号(需配置 openai_api_key) |
注意:
- C2PA / 内容凭证只能检出携带了元数据的图片。
- OpenAI Content Provenance 只能识别 OpenAI 自家生成的信号;
not_detected不代表内容一定是真人创作(可能来自其他公司的模型,或元数据/水印被剥离)。
⚙️ 并发控制:同时最多允许
max_concurrent(默认 2)个检测任务在跑,超出时会立即回复"当前已有检测任务在运行,请稍后再试",避免连续/checkai时多个 Python 子进程叠加大幅拖慢服务器。仍嫌慢可调小该值。
安装检测环境
插件通过 Python 脚本调用检测库,需要先安装:
./checkai/install.sh
然后在 config.yaml 中启用:
plugins:
checkai:
venv_python: "checkai/venv/bin/python"
openai_api_key: "sk-..." # OpenAI Content Provenance 检测;留空则显示"未配置"
完整配置项见 config.example.yaml 中的 plugins.checkai 段。
Docker
Dockerfile 已内置 Python 检测环境:
docker compose build
docker compose up -d
在 config.yaml 中把 venv_python 设为 checkai/venv/bin/python 即可。
权限管理
支持管理员、用户/群组白名单、黑名单、命令级 ACL 和运行时热更新(/perm)。详细说明见 docs/permission.md。
permission:
admins:
- 123456789
allowed_users: []
allowed_groups: []
deny_users: []
deny_groups: []
command_acl:
jm:
- 123456789