
🔪 Dumper y ripper para bots de Telegram mediante token. Herramienta forense de CLI con interfaz web
Volcado sencillo de todo el contenido de un bot de Telegram.
Entrada: solo el token del bot.
Salida: nombre e información del bot, historial de texto y multimedia de todos los chats, información y fotos de los usuarios del bot.
Esta es una implementación en Python.
🚀 Versión rápida en Golang por ScBoln.
Una interfaz de navegador similar a Telegram Web para un volcado: lista de chats, historial completo de mensajes con multimedia en línea, perfiles de usuario con carrusel de fotos y búsqueda global en todas las conversaciones a la vez. Modo en vivo compatible: ejecuta el dumper en segundo plano y transmite los mensajes nuevos al navegador en tiempo real.
Caso de uso — pentesting de un token de bot filtrado. Los tokens de bots de Telegram aparecen constantemente en un encargo — codificados en una app móvil/de escritorio, subidos a un repositorio, o presentes en un log de CI, un archivo de configuración o un bundle del lado del cliente. Por sí solo, un token parece un hallazgo de baja severidad; cargarlo aquí muestra el alcance real. Para un bot interno (mesa de ayuda, asistente de IT/DevOps, asistente de IA) eso significa todas las conversaciones de los empleados con él — nombres de host internos, perfiles de VPN, credenciales y detalles de infraestructura — navegables y buscables, para que puedas delimitar el impacto y evidenciar el hallazgo en tu informe.

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
Abre http://127.0.0.1:8010 y pega un token de bot para seleccionar su carpeta de volcado. La visualización de solo lectura no requiere autenticación, es local y no necesita credenciales de API. El modo en vivo además necesita API_ID/API_HASH de my.telegram.org, pasados mediante el entorno — nunca incluidos en la imagen:
# 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
Las variables de entorno PORT y HOST sobrescriben los valores predeterminados (8010, 127.0.0.1).
--down / --start-from-id).--listen-only): recibe mensajes nuevos en tiempo real y ofrece volcar el historial hacia abajo desde el primer id observado.[from:USER][group:CHAT]. Los mensajes directos salientes del bot se etiquetan con [to:USER].--listen-only los volcará en tiempo real. Con el modo de privacidad activado (el predeterminado) el bot solo ve comandos, menciones y respuestas.requirements.txt para la versión fijada)API_ID y 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...
Recorre los ids 1..∞ hacia arriba en lotes de 200, descargando cada mensaje, toda la multimedia y todas las fotos de perfil de usuario. Por defecto, el dumper sigue escuchando mensajes entrantes nuevos después de terminar el volcado. Para salir inmediatamente tras el volcado del historial (ideal para scripts y tareas cron), pasa --no-listen.
./dumper.py --token 12345678:ABCe2rPVteUWZ7wLeCqCb3CH3ilUY_fLabc
Para un bot activo, el recorrido hacia arriba se topa con una larga franja de ids antiguos eliminados (borrados/caducados) y se rinde. Recorrer hacia abajo desde el id más reciente es mucho más productivo. --down sondea automáticamente el límite superior (potencias de 10 hasta 10⁹) y comienza desde el id no vacío más alto que encuentre:
./dumper.py --token TOKEN --down
Nota. Telegram no conserva el historial de mensajes de un bot para siempre. Empíricamente, solo los últimos cientos de miles de mensajes permanecen accesibles — en nuestras pruebas un bot con mucho tráfico exponía aproximadamente los últimos 500K mensajes antes de que
messages.getMessagesempezara a devolver soloMessageEmptypara los ids más antiguos. Si tu bot ha procesado históricamente más tráfico que eso, el historial más antiguo simplemente ya no existe en el servidor y ninguna opción lo recuperará.
Si ya conoces un id de mensaje reciente (p. ej. uno que viste en tiempo real), puedes omitir el sondeo y empezar exactamente desde él:
./dumper.py --token TOKEN --start-from-id 11922524
No volcar nada; solo observar lo que llega. En el primer mensaje entrante el script ofrecerá iniciar un volcado hacia abajo desde ese id:
./dumper.py --token TOKEN --listen-only
Útil cuando solo necesitas un listado de quién ha hablado con el bot — sin zips, sin jpegs, sin *_history.txt por chat.
./dumper.py --token TOKEN --down --users-csv --no-photos --no-media --no-history
Salida: <bot_id>/users.csv con las columnas id, username, first_name, last_name, phone, lang_code, bot, premium, verified, scam, fake.
El recorrido hacia abajo imprime Requesting message ids X..Y ... por cada lote. Si la ejecución se interrumpe, reinicia desde el último límite inferior impreso:
./dumper.py --token TOKEN --start-from-id <Y>
Lotes más pequeños → retroalimentación más rápida en el log y ventana de recuperación más corta tras un FloodWait. Lotes más grandes → menos round-trips al escanear rangos de ids dispersos / eliminados. Valores de hasta 1000 funcionan bien en la práctica.
./dumper.py --token TOKEN --down --batch-size 50
./dumper.py --token TOKEN --down --batch-size 500
./dumper.py --token TOKEN --down --batch-size 1000