轻松转储所有 Telegram 机器人内容。
输入:仅需机器人 token。
输出:机器人名称与信息、所有聊天的文本历史与媒体、机器人的用户信息与照片。
这是一个 Python 实现。
一个类似 Telegram-Web 的浏览器 UI,用于查看转储:聊天列表、带内联媒体的完整消息历史、带照片轮播的用户资料,以及跨所有对话的全局搜索。支持实时模式:它在后台运行转储器,并将新消息实时流式传输到浏览器。
使用场景——对泄露的机器人 token 进行渗透测试。 Telegram 机器人 token 在渗透测试中经常出现——硬编码在移动/桌面应用中、提交到仓库中,或存在于 CI 日志、配置文件或客户端 bundle 中。单独来看,一个 token 看起来像是低危发现;在这里加载它就能显示真正的爆炸半径。对于内部机器人(支持台、IT/DevOps 助手、AI 助手),那就是每位员工与它的对话——内部主机名、VPN 配置、凭据和基础设施细节——可浏览、可搜索,因此你可以评估影响范围并在报告中为发现提供证据。

docker run --rm -p 8010:8010 -v "$PWD:/data" soxoj/telegram-bot-dumper-web
docker compose up --build # builds and serves on http://127.0.0.1:8010
pip install -r requirements.txt
python webapp/server.py # serves the current directory's dumps on :8010
打开 http://127.0.0.1:8010 并粘贴一个机器人 token 以选择其转储文件夹。只读查看无需认证、本地运行,且不需要 API 凭据。实时模式额外需要来自 my.telegram.org 的 API_ID/API_HASH,通过环境变量传入——绝不烘焙到镜像中:
# one-off container
docker run --rm -p 8010:8010 -v "$PWD:/data" \
-e API_ID=123456 -e API_HASH=abc... soxoj/telegram-bot-dumper-web
# or with docker compose: put them in a local .env (see .env.example)
cp .env.example .env && $EDITOR .env && docker compose up
PORT 和 HOST 环境变量会覆盖默认值(8010、127.0.0.1)。
--down / --start-from-id)遍历消息 id 来转储机器人的消息及媒体内容。--listen-only):实时接收新消息,并提供从观察到的第一个 id 向下转储历史记录的选项。[from:USER][group:CHAT]。传出的机器人私信会标记为 [to:USER]。--listen-only 会实时转储它们。启用隐私模式(默认)时,机器人只能看到命令、提及和回复。requirements.txt)API_ID 和 API_HASHpip install -r requirements.txt
# Telegram API credentials from https://my.telegram.org (read from the environment)
export API_ID=123456
export API_HASH=abc...
以每批 200 个向上遍历 id 1..∞,下载每条消息、所有媒体和所有用户资料照片。默认情况下,转储器在转储完成后会继续监听新的传入消息。要在历史转储后立即退出(非常适合脚本和 cron 任务),请传入 --no-listen。
./dumper.py --token 12345678:ABCe2rPVteUWZ7wLeCqCb3CH3ilUY_fLabc
对于活跃的机器人,向上遍历会遇到一长段已被清理(删除/过期)的旧 id 并放弃。从最近的 id 向下遍历效率要高得多。--down 会自动探测上界(10 的幂,最高到 10⁹),并从找到的最高非空 id 开始:
./dumper.py --token TOKEN --down
注意。 Telegram 不会永久保留机器人消息历史。根据经验,只有最近几十万条消息仍然可访问——在我们的测试中,一个繁忙的机器人暴露了大约最近 500K 条消息,之后
messages.getMessages对更旧的 id 开始只返回MessageEmpty。如果你的机器人历史上处理了超过这个量的流量,更旧的历史在服务器端已经消失,任何标志都无法恢复。
如果你已经知道一个较近的消息 id(例如你实时看到的一个),可以跳过探测并直接从它开始:
./dumper.py --token TOKEN --start-from-id 11922524
不转储任何内容;只观察到达的内容。在收到第一条传入消息时,脚本会提供从该 id 开始向下转储的选项:
./dumper.py --token TOKEN --listen-only
当你只需要与机器人交谈过的人员名单时很有用——没有 zip、没有 jpeg、没有每个聊天的 *_history.txt。
./dumper.py --token TOKEN --down --users-csv --no-photos --no-media --no-history
输出:<bot_id>/users.csv,列包括 id, username, first_name, last_name, phone, lang_code, bot, premium, verified, scam, fake。
向下遍历会为每一批打印 Requesting message ids X..Y ...。如果运行被中断,请从最后打印的下界重新开始:
./dumper.py --token TOKEN --start-from-id <Y>
更小的批次 → 日志中更快的反馈,以及 FloodWait 后更短的重试窗口。更大的批次 → 在扫描稀疏/已清理的 id 范围时更少的往返次数。实践中,最高 1000 的值都可以正常工作。
./dumper.py --token TOKEN --down --batch-size 50
./dumper.py --token TOKEN --down --batch-size 500
./dumper.py --token TOKEN --down --batch-size 1000
| 标志 | 作用 |
|---|---|
--lookahead N | 在一个全空批次之后,继续扫描 N 个批次再放弃。当 id 稀疏时很有用。 |
--no-photos | 跳过下载用户资料照片(头像)。 |
--no-media | 跳过下载消息内的照片和文档;元数据仍会写入文本历史。 |
--no-history | 不写入每个聊天的 <chat_id>_history.txt。与 --users-csv 结合可实现最轻量的运行。 |
--users-csv | 将用户写入单个 <bot_id>/users.csv,而不是 <user_id>/<user_id>.json 目录。 |
--tor | 通过 127.0.0.1:9050 上的本地 Tor SOCKS5 代理路由(绕过 Telegram 封锁)。 |
运行 ./dumper.py --help 查看完整列表。
机器人在历史完全转储之前退出。
如果某些消息已被用户删除,一个批次可能返回完全为空,脚本可能会过早停止。此外,如果机器人处理了非常大量的流量,旧消息根本不再由 Telegram 服务器返回——它们已被清理,任何标志都无法恢复。对于稀疏但存在的历史,请提高 --lookahead 以继续扫描越过空段:
# check additionally 5*200 = 1000 ids
./dumper.py --token TOKEN --lookahead 5
或者直接使用 --down,它受旧 id 间隙的影响要小得多。
未转储群聊(基本群组、超级群组)的历史。
messages.getMessages 只返回机器人的私信历史;超级群组历史需要按频道调用,而机器人通常无法进行此类调用。如果群组隐私已关闭(见功能),群组消息仍会在 --listen-only 模式下实时捕获。
离线单元测试(无网络、无 token):
pip install -r test-requirements.txt
pytest tests/ --ignore=tests/bot_test.py
针对真实机器人的集成测试(需要可用的机器人 token):
TEST_TOKEN=12345678:... pytest tests/bot_test.py
Dorks 示例:telepot.bot