一个基于 aiogram 的 Telegram 文件收录与搜索机器人,支持多数据库后端。
- 发送文件自动收录到数据库
- 关键词搜索文件名(支持分页)
- 分页结果显示:当前页/总页数、总文件数、总容量
- 文件类型筛选(支持常用文档/视频/音频/图片/压缩包)
- 点击按钮回传文件
- 管理员删除文件(按钮删除或
/delete 文件ID) - 内置命令:
/start、/help、/search、/recent、/myfiles、/get、/id、/stats、/types、/ping - 网页端支持:搜索、筛选、分页、下载、上传(管理员)
- 数据库后端支持:
sqlite / supabase / mongodb / turso / neon(部署时单选其一) - 支持
polling和webhook两种运行方式
/start:启动提示/help:查看使用说明/search 关键词:命令方式搜索(和直接发关键词效果一致)/recent:查看最新一页文件列表/recent pdf 2:查看指定类型的第 2 页(页码可选)/myfiles:快速查看文件列表(“我的文件”入口)/get 文件ID:按文件 ID 直接取回文件/id:查看你的User ID和当前Chat ID(配置ADMIN_ID时很有用)/stats:查看数据库统计(总文件数、总容量)/stats pdf:查看指定类型统计(支持pdf/doc/mp4/zip等)/types:查看支持的文件类型列表/ping:快速检查机器人是否在线(返回pong)/delete 文件ID:删除文件记录(仅管理员可用)
中文快捷词(无需 /):
开始:等同/start帮助:等同/help我的文件:等同/myfiles
- Python 3.10+
pip install -r requirements.txt可以按下面 4 步来配,照着填就行。
-
先复制配置文件
把.env.example复制为.env,后续都改.env。 -
先填两个“必须项”
BOT_TOKEN:你的 Telegram 机器人 TokenDB_PROVIDER:你要用哪种数据库
可选值:sqlite | supabase | mongodb | turso | neon
- 数据库只填一组
你选了哪个DB_PROVIDER,就只填那一组变量,其他可以留空。
- 选
sqlite:填DB_PATH(默认data.db) - 选
supabase:填SUPABASE_DATABASE_URL(或SUPABASE_DB_URL/DATABASE_URL) - 选
neon:填NEON_DATABASE_URL(或DATABASE_URL) - 选
mongodb:填MONGODB_URI(可再填MONGODB_DB_NAME、MONGODB_COLLECTION_NAME) - 选
turso:填TURSO_DATABASE_URL、TURSO_AUTH_TOKEN(可选TURSO_LOCAL_PATH)
- 按运行方式补充
- 用
bot.py(轮询模式):不用填 webhook 变量 - 用
app.py(webhook 模式):填下面任意一组
WEBHOOK_URL
或WEBHOOK_BASE_URL+WEBHOOK_PATH
在 Render 上可以不填域名,平台会自动给RENDER_EXTERNAL_URL
常用可选项:
ADMIN_ID:填你的 Telegram 数字 ID,开启管理员权限(私聊上传/删除限制)SEARCH_LIMIT:每页显示多少条,默认5SEARCH_SESSION_TTL_SECONDS:分页会话多久过期(秒),默认1800WEBHOOK_DELETE_ON_SHUTDOWN:停机时是否删除 Telegram webhook,Render 免费实例建议保持0POSTGRES_POOL_SIZE:Postgres 连接池大小,默认5(仅 Supabase/Neon 用到)WEB_UI_ENABLED:是否启用网页端,默认1(开启)WEB_ADMIN_TOKEN:网页管理删除令牌(可选,不填则网页端为只读)WEB_UPLOAD_CHAT_ID:存储聊天 ID;网页上传会发到这里,私聊发给机器人的文件也会归档到这里(网页上传没填时回退到ADMIN_ID)
ADMIN_ID 速查模板:
# 开启管理员限制(推荐)
ADMIN_ID=123456789
# 不限制管理员(留空)
ADMIN_ID=说明:
ADMIN_ID必须是“纯数字 Telegram 用户 ID”,不是用户名(例如不是@abc)- 可在 Telegram 里找
@userinfobot(或@getmyid_bot)发消息获取数字 ID
下面是可直接复制的 .env 模板。你只需要选一个数据库模板使用。
通用最小模板(所有方案都要有):
BOT_TOKEN=123456:your_telegram_bot_token
ADMIN_ID=
SEARCH_LIMIT=5
SEARCH_SESSION_TTL_SECONDS=1800模板 A:SQLite(最简单,单机/测试):
DB_PROVIDER=sqlite
DB_PATH=data.db模板 B:Supabase(Postgres):
DB_PROVIDER=supabase
SUPABASE_DATABASE_URL=postgresql://username:password@host:5432/postgres
POSTGRES_POOL_SIZE=5模板 C:Neon(Postgres):
DB_PROVIDER=neon
NEON_DATABASE_URL=postgresql://username:password@host:5432/dbname?sslmode=require
POSTGRES_POOL_SIZE=5模板 D:MongoDB Atlas:
DB_PROVIDER=mongodb
MONGODB_URI=mongodb+srv://username:password@cluster.mongodb.net/?retryWrites=true&w=majority
MONGODB_DB_NAME=wangpanbot
MONGODB_COLLECTION_NAME=files模板 E:Turso(libSQL):
DB_PROVIDER=turso
TURSO_DATABASE_URL=libsql://your-db-your-org.turso.io
TURSO_AUTH_TOKEN=your_turso_auth_token
TURSO_LOCAL_PATH=轮询模式(bot.py)不需要 webhook 变量。
Webhook 模式(app.py)加上其中一组:
WEBHOOK_URL=https://your-domain.com/webhook
WEBHOOK_PATH=/webhook或
WEBHOOK_BASE_URL=https://your-domain.com
WEBHOOK_PATH=/webhookpython bot.py设置下面任意一组:
WEBHOOK_URL(完整地址,例如https://example.com/webhook)WEBHOOK_BASE_URL(域名)+WEBHOOK_PATH(路径)
然后启动:
uvicorn app:app --host 0.0.0.0 --port 8000健康检查:
GET /healthz
项目内置了轻量网页管理页,地址:
GET /drive
也支持直接访问根路径(当前域名)自动跳转:
GET /
支持功能:
- 关键词搜索
- 类型筛选
- 分页浏览
- 网页下载
- 网页上传(管理员)
- 复制
/get 文件ID命令 - 网页端删除(需要配置
WEB_ADMIN_TOKEN,并在页面中填写)
说明:
- 未配置
WEB_ADMIN_TOKEN时,网页仍可查看与搜索,但删除按钮不可用 - 网页上传需要配置
WEB_UPLOAD_CHAT_ID或ADMIN_ID - 私聊发给机器人的文件会在配置
WEB_UPLOAD_CHAT_ID时同步归档到该聊天 - 网页直连下载受 Telegram Bot API 限制:单文件超过 20MB 可能失败,建议在 Telegram 使用
/get 文件ID - 网页端是管理辅助,不影响 Telegram 机器人命令
仓库已提供 render.yaml,可直接用 Blueprint 创建服务。
步骤:
- 在 Render 选择
New +->Blueprint - 连接本仓库并导入
render.yaml - 在环境变量中填写
BOT_TOKEN - 首次部署完成后,Telegram webhook 会自动设置为
https://<your-service>.onrender.com/webhook
注意:
- Render 免费 Web Service 会在 15 分钟无流量后休眠
WEBHOOK_ENABLED保持1,WEBHOOK_DELETE_ON_SHUTDOWN保持0,避免休眠时把 Telegram webhook 删除- 如果
DB_PROVIDER=sqlite,免费实例文件系统是临时的,data.db在重启/重新部署后会丢失 - 生产场景建议改用 Postgres 持久化数据
项目已提供 Dockerfile 和 k8s/ 清单。
docker build -t <your-registry>/wangpanbot:latest .
docker push <your-registry>/wangpanbot:latestk8s/deployment.yaml中的镜像地址改为你的镜像k8s/secret.yaml中填入真实BOT_TOKEN(可选ADMIN_ID)k8s/configmap.yaml中把WEBHOOK_BASE_URL改为你的 HTTPS 域名(如https://bot.example.com)k8s/ingress.yaml中把bot.example.com和tls secretName改为你的配置
kubectl apply -k k8skubectl -n wangpanbot get pods,svc,ingress
kubectl -n wangpanbot logs deploy/wangpanbot -f注意:
- Telegram webhook 需要公网可访问的 HTTPS 地址
- 当前用 SQLite + PVC,建议
replicas: 1(多副本会有 SQLite 并发/锁冲突风险) - 生产环境建议迁移到 Postgres,再考虑横向扩容
core.py机器人核心逻辑(配置、数据库、handler)bot.pypolling 入口app.pywebhook 入口k8s/Kubernetes 部署清单
现在网页下载支持两种模式:
- 默认回退模式(Bot API)
- 无需额外配置
- 但单文件超过 20MB 可能失败
- MTProto 流式模式(推荐)
- 需要配置
API_ID+API_HASH - 配置后,
/api/files/{id}/download会走 MTProto 分块流式下载,支持大文件和 Range 断点续传
API_ID=12345678
API_HASH=your_api_hash
MTPROTO_DOWNLOAD_ENABLED=1可选变量:
MTPROTO_SESSION_NAME=wangpanbot_mtproto
MTPROTO_WORKDIR=.mtproto
MTPROTO_CHUNK_SIZE=1048576说明:
API_ID/API_HASH在https://my.telegram.org创建应用后获取- 如果没有配置这两个变量,系统会自动使用 Bot API 回退下载逻辑
如果你要同时保留 Kuberns + Render 两套环境,推荐:
- 主站(Kuberns):
WEBHOOK_ENABLED=1 - 备站(Render):
WEBHOOK_ENABLED=0
这样备站仍可部署并访问网页端,但不会在启动时 setWebhook,不会抢走主站的 webhook。
主站(Kuberns):
WEBHOOK_ENABLED=1
WEBHOOK_DELETE_ON_SHUTDOWN=0
WEBHOOK_BASE_URL=https://your-kuberns-domain
WEBHOOK_PATH=/webhook备站(Render):
WEBHOOK_ENABLED=0
# 备站可不配置 WEBHOOK_URL / WEBHOOK_BASE_URL
# 也不会处理 /webhook 请求(返回 404)- 先把主站停掉(避免双活)
- 将备站
WEBHOOK_ENABLED改为1 - 给备站配置
WEBHOOK_BASE_URL或WEBHOOK_URL - 重启备站
- 用
getWebhookInfo确认 webhook 已指向备站