一个轻量级、高性能的 Telegram 群组消息记录与中文检索引擎,专为超大型活跃群组设计,支持全文检索、媒体提取与自动分库。
- 🚀 高性能异步写入: 采用
aiosqlite+ 内存缓冲池机制(按条数或按秒落盘),应对 10 万+ 人数级别活跃群组每日 10W 条以上的高并发消息。 - 🔎 毫秒级中文检索: 内置
jieba分词与 SQLite FTS5 虚拟表技术,支持关键字全文模糊搜索、与特定用户追踪。 - 📂 自动化存储管理: 数据按月自动切割分库(如
chat_log_2026_03.db),防止单库体积过大拖慢性能,并支持跨月无缝追溯。 - 🖼️ 富媒体精准还原: 检索结果自动带上原始消息直达链接,并支持一键将历史图片、视频及多图相册(Media Group)提取发送至私聊。
- 🛡️ 严格的安全防线: 所有检索和运维操作仅限管理员私聊使用;若被拉入非授权群组,Bot 将自动退群,杜绝隐私泄露。
- 🛑 优雅退出机制: 接收到系统中断信号(如
Ctrl+C或Systemd重启)时,会自动将内存中的零星数据强制存盘,确保数据 0 丢失。 - 💬 **支持话题群组 **: 完美兼容 Telegram 的群组话题功能,并在检索结果中显示消息所属的对应话题。
- Python 版本: Python 3.10 或更高版本
- 操作系统: Linux / macOS / Windows 均可
- 依赖组件:
jieba,aiosqlite,python-telegram-bot等(详见requirements.txt)
前往 Telegram 搜索 @BotFather 创建一个新的 Bot,获取 Bot Token。
Bot Settings -> Group Privacy -> 设置为 Turn off。
git clone https://github.com/tjsky/Telegram_Search_Bot.git
cd Telegram_Search_Bot
pip install -r requirements.txt将项目中的 config_ex.yaml 复制或重命名为 config.yaml,并根据你的实际情况填写:
bot:
token: "123456789:abcdefghijklmnopqrstuvwxyz" # 填入你的 Bot Token
target_chat_id: -1001265283025 # 要监控的目标群组 ID (带 -100 前缀)
admin_ids: # 允许使用搜索指令的管理员 TG User ID
- 123456789
# ... 其他进阶配置详见文件内注释直接运行测试:
python main.py(推荐在生产环境中使用 systemd, pm2 或 nohup 进行后台守护运行。)
将 Bot 拉入目标群组并设为管理员(如果是话题群需要给管理话题的权限,其他权限随意)后,再启动Bot,Bot 会自动开始静默记录。(要先给管理员再启动Bot,不然Bot会自动退群)
作为配置文件中的 admin_ids 成员,你可以私聊 Bot 使用以下指令:
/search <关键词>- 全文模糊检索聊天记录(例:/search 机场推荐)/user <username>- 根据用户的@用户名搜索记录(例:/user durov)/name <昵称>- 根据用户的显示昵称模糊搜索(例:/name 小明)/id <数字ID>- 终极追踪,根据纯数字 User ID 搜索此人所有发言
/media <媒体号>- 提取单张图片、视频或文件/album <媒体组号>- 提取完整的历史多图相册
/start- 查看实时数据库监控仪表盘(库大小、总条数、内存缓冲池状态)/help- 显示指令大全与使用帮助
是的,支持的。
- 模糊搜索:只要消息或昵称部分含有关键词即可被检索到
- 组合关键词:支持
AND模式搜索,关键词之间用空格隔开(例:/search 机场 中转 低价)
可以记录到原始消息和修改后的消息,但无法记录到消息被删除/撤回。
-
因telegram 不会告知 bot 消息已经被删除,所以即使对方删了消息,还能检索到。
-
但媒体内容除外,因为为了不撑爆硬盘,媒体仅记录其
file_id,检索时通过这个文件在telegram网络中的唯一ID复原图片。所以若该文件的唯一一份在TG内被删除,则无法复原媒体文件。举个🌰:同一张图若在群A和群B内都存在,只删除群A内图片,则依然能通过file_id复原图片,若B群内图片也被删除,则最长24小时后就无法通过file_id复原图片了。
从技术上讲,只要关闭了“隐私模式”,Bot 作为一个普通成员也能读取到群内消息。
但本Bot代码内强制要求你必须设置Bot为群组的管理员,否则Bot会自行退群
因为Bot是设计给群管理用的,群主和群管理为了解决群内纠纷或者逮那种发完就删的广告才需要查群员历史发言的水表,而不是用来做防撤回或者让群员偷偷备份群内资源用的。(当然你要是能看懂代码自己给改了,那也拦不住你是不)
以及赋予它管理员权限有以下 2 个好处:
-
处理话题群组 : 若群组开启了话题模式,作为管理员,Bot 能更稳定地访问所有话题(Threads)中的消息。(当群内消息总数量超过100W条后会出现消息不同步的问题,TG的一个陈年老bug了)
-
防止消息丢失:如果 Bot 是管理员,它的数据流通常拥有更高的优先级,不会因为短时间内群内发言过多而被系统误判为普通成员,进入“按需拉取模式”(只在主动发送过消息一段时间内推送群内消息)从而导致丢失记录。
可以的
Telegram 的“禁止转发/保存”只是一个客户端的 UI 限制 只是个君子协定。它只是告诉手机或电脑上的 Telegram 软件:“你应该把转发按钮藏起来,屏蔽长按保存选项,并调用系统级接口禁止截屏”(所以有些三方客户端会选择无视这个要求)。Bot 通过 API 接收到的始终是底层的纯文本 JSON 数据,Bot收到消息时无法知道消息是不是禁止转发保存的。只有Bot调用原生的 forwardMessage(转发)TG 服务器才会报错拦截。
这也是为什么在管理具有机密属性的 Telegram 群组时,很多群主即使开启了禁止转发,也绝对不允许群员拉入未经审核的第三方 Bot。因为任何一个能读取消息的 Bot,都是一个完美的“群内消息搬运工”。
但注意:参考前边关于媒体部分的Q&A,若媒体文件被删除了,则有可能无法找回。
不支持
因为Bot的设计目标是在1H1G服务器上也能高性能记录并检索10W级群组的消息,所以只支持单群模式。如果需要记录多个群的消息,请建立并运行多个Bot。
请以”词“为单位搜索
为了实现毫秒级中文检索,数据记录后会进行预分词,比如“我小时候还看猫和狗打架呢”会被切成“我、小时、时候、小时候、还、看、猫、和、狗、打架、呢” 作为检索用库,你搜个什么“候还”,“小 架”,那自然是搜不到的。
点对应消息前边的【💬】符号就可以跳转到原始消息了。
右键/长按对应分区内任意一条消息,选择复制消息链接,可以看到类似这样https://t.me/aabbcc/333333/555555(公开群)或这样https://t.me/c/1111111/333333/555555(私有群)的链接
倒数第二个数字333333 就是这个话题的ID。
因为TG的限制,bot只能知道话题ID,无法获取话题名,所以需要管理手动写上,不然搜索结果只会显示话题的ID号。
因为现阶段备份群内媒体文件可行的措施无非是两种:方案一、保存一份到本地/云盘。方案二、将媒体原样发到自己的私有频道内保存。
方案一:10W人的群组每天都能产生上万张图片,就算每张图就150K,每天至少都要吃1.5G储存空间,1年下来大几百GB的图片,储存成本可不低。
方案二:白嫖TG:收到媒体后,趁着file_id这时候一定是有效的,马上将媒体转发至自己的私有频道永久保存。虽然可行,但有很大的安全风险,如果对方发送的是触碰 Telegram 官方底线的内容(例如:儿童色情 CSAM、恐怖主义血腥斩首),Telegram 服务器底层有基于哈希值(PhotoDNA等算法)的自动扫描。如果你的 Bot 频繁将这类内容复制到你的私有频道,你的频道、你的 Bot,甚至你本人的 Telegram 账号都会被官方永久封禁(而且申诉无门)。这种极端情况下的“连坐”风险实在太高了。
本项目采用 Apache License 2.0 开源协议。你可以自由地使用、修改和分发,但请保留原作者的版权声明。


