Crear Bot de Telegram con Python e IA: Tutorial Completo [2026]
Tutorial paso a paso para crear un bot de Telegram con Python que usa ChatGPT o Claude. Desde cero hasta producción con ejemplos de código.
Crear Bot de Telegram con Python e IA: Tutorial Completo [2026]
TLDR: Crear un bot de Telegram con IA requiere: 1) Token de BotFather, 2) API key de OpenAI/Anthropic, 3) Librería aiogram (Python). Costo: ~$0.01 por conversación. Tiempo de setup: 30 minutos.
Requisitos previos
| Requisito | Descripción |
|---|---|
| Python 3.10+ | Lenguaje de programación |
| API Key OpenAI/Anthropic | Para la IA |
| Cuenta de Telegram | Para crear el bot |
| Servidor (opcional) | Para deployment 24/7 |
Crear el bot en Telegram
Paso 1: Hablar con BotFather
- Abre Telegram y busca
@BotFather - Envía
/newbot - Elige un nombre para tu bot
- Elige un username (debe terminar en
bot) - Guarda el token que te da
1Tu token será algo como:27123456789:AAHdqTcvCH1vGWJxfSeofSAs0K5PALDsaw
Configurar el proyecto Python
Estructura del proyecto
1telegram-ai-bot/2├── bot.py3├── config.py4├── requirements.txt5└── .env
requirements.txt
1aiogram==3.4.12openai==1.12.03anthropic==0.18.04python-dotenv==1.0.1
.env
1TELEGRAM_TOKEN=tu-token-de-botfather2OPENAI_API_KEY=sk-...3ANTHROPIC_API_KEY=sk-ant-...
config.py
1import os2from dotenv import load_dotenv3 4load_dotenv()5 6TELEGRAM_TOKEN = os.getenv("TELEGRAM_TOKEN")7OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")8ANTHROPIC_API_KEY = os.getenv("ANTHROPIC_API_KEY")
Integrar con ChatGPT
bot.py (versión ChatGPT)
1import asyncio2from aiogram import Bot, Dispatcher, types3from aiogram.filters import Command4from openai import AsyncOpenAI5from config import TELEGRAM_TOKEN, OPENAI_API_KEY6 7# Inicializar8bot = Bot(token=TELEGRAM_TOKEN)9dp = Dispatcher()10openai_client = AsyncOpenAI(api_key=OPENAI_API_KEY)11 12# Almacenar historial de conversaciones13conversations = {}14 15@dp.message(Command("start"))16async def start_handler(message: types.Message):17 await message.answer(18 "¡Hola! Soy un bot con IA. "19 "Escríbeme cualquier pregunta y te responderé."20 )21 22@dp.message(Command("clear"))23async def clear_handler(message: types.Message):24 user_id = message.from_user.id25 conversations[user_id] = []26 await message.answer("Historial borrado.")27 28@dp.message()29async def message_handler(message: types.Message):30 user_id = message.from_user.id31 user_message = message.text32 33 # Inicializar historial si no existe34 if user_id not in conversations:35 conversations[user_id] = []36 37 # Añadir mensaje del usuario38 conversations[user_id].append({39 "role": "user",40 "content": user_message41 })42 43 # Mantener solo últimos 10 mensajes44 conversations[user_id] = conversations[user_id][-10:]45 46 # Mostrar "escribiendo..."47 await bot.send_chat_action(message.chat.id, "typing")48 49 try:50 # Llamar a OpenAI51 response = await openai_client.chat.completions.create(52 model="gpt-4o-mini",53 messages=[54 {"role": "system", "content": "Eres un asistente útil y amigable. Responde en español de forma concisa."},55 *conversations[user_id]56 ],57 max_tokens=100058 )59 60 assistant_message = response.choices[0].message.content61 62 # Guardar respuesta en historial63 conversations[user_id].append({64 "role": "assistant",65 "content": assistant_message66 })67 68 await message.answer(assistant_message)69 70 except Exception as e:71 await message.answer(f"Error: {str(e)}")72 73async def main():74 print("Bot iniciado...")75 await dp.start_polling(bot)76 77if __name__ == "__main__":78 asyncio.run(main())
Integrar con Claude
bot.py (versión Claude)
1import asyncio2from aiogram import Bot, Dispatcher, types3from aiogram.filters import Command4import anthropic5from config import TELEGRAM_TOKEN, ANTHROPIC_API_KEY6 7bot = Bot(token=TELEGRAM_TOKEN)8dp = Dispatcher()9claude_client = anthropic.AsyncAnthropic(api_key=ANTHROPIC_API_KEY)10 11conversations = {}12 13@dp.message()14async def message_handler(message: types.Message):15 user_id = message.from_user.id16 user_message = message.text17 18 if user_id not in conversations:19 conversations[user_id] = []20 21 conversations[user_id].append({22 "role": "user",23 "content": user_message24 })25 26 conversations[user_id] = conversations[user_id][-10:]27 28 await bot.send_chat_action(message.chat.id, "typing")29 30 try:31 response = await claude_client.messages.create(32 model="claude-3-5-sonnet-20241022",33 max_tokens=1000,34 system="Eres un asistente útil. Responde en español de forma concisa.",35 messages=conversations[user_id]36 )37 38 assistant_message = response.content[0].text39 40 conversations[user_id].append({41 "role": "assistant",42 "content": assistant_message43 })44 45 await message.answer(assistant_message)46 47 except Exception as e:48 await message.answer(f"Error: {str(e)}")49 50async def main():51 print("Bot con Claude iniciado...")52 await dp.start_polling(bot)53 54if __name__ == "__main__":55 asyncio.run(main())
Funciones avanzadas
Añadir comandos especiales
1@dp.message(Command("resumen"))2async def resumen_handler(message: types.Message):3 """Resumir un texto largo"""4 text = message.text.replace("/resumen", "").strip()5 6 if not text:7 await message.answer("Uso: /resumen [texto a resumir]")8 return9 10 response = await openai_client.chat.completions.create(11 model="gpt-4o-mini",12 messages=[13 {"role": "system", "content": "Resume el siguiente texto en 3 puntos clave."},14 {"role": "user", "content": text}15 ]16 )17 18 await message.answer(response.choices[0].message.content)19 20@dp.message(Command("traducir"))21async def traducir_handler(message: types.Message):22 """Traducir texto al inglés"""23 text = message.text.replace("/traducir", "").strip()24 25 response = await openai_client.chat.completions.create(26 model="gpt-4o-mini",27 messages=[28 {"role": "system", "content": "Traduce el siguiente texto al inglés."},29 {"role": "user", "content": text}30 ]31 )32 33 await message.answer(response.choices[0].message.content)
Manejar imágenes (GPT-4 Vision)
1@dp.message(types.ContentType.PHOTO)2async def photo_handler(message: types.Message):3 """Analizar imágenes con GPT-4 Vision"""4 photo = message.photo[-1] # Mayor resolución5 file = await bot.get_file(photo.file_id)6 file_url = f"https://api.telegram.org/file/bot{TELEGRAM_TOKEN}/{file.file_path}"7 8 response = await openai_client.chat.completions.create(9 model="gpt-4o",10 messages=[11 {12 "role": "user",13 "content": [14 {"type": "text", "text": "Describe esta imagen en español."},15 {"type": "image_url", "image_url": {"url": file_url}}16 ]17 }18 ]19 )20 21 await message.answer(response.choices[0].message.content)
Deployment
Opción 1: Railway (Recomendado)
1# Instalar Railway CLI2npm install -g @railway/cli3 4# Login y deploy5railway login6railway init7railway up
Opción 2: Docker
1FROM python:3.11-slim2 3WORKDIR /app4COPY requirements.txt .5RUN pip install -r requirements.txt6 7COPY . .8CMD ["python", "bot.py"]
1docker build -t telegram-bot .2docker run -d --env-file .env telegram-bot
Opción 3: VPS (DigitalOcean, Hetzner)
1# En el servidor2git clone tu-repo3cd telegram-ai-bot4pip install -r requirements.txt5nohup python bot.py &
Opción 4: Mini PC en casa
Si no quieres pagar un VPS mensual, un mini PC como el Blackview MP50 con 32 GB por menos de 300 EUR consume menos de 15W, funciona 24/7 y te sirve para este bot y cualquier otro proyecto (n8n, Ollama, Home Assistant...). Yo lo uso para alojar varios bots y el coste de electricidad es inferior a 3 EUR/mes.
FAQ
¿Cuánto cuesta mantener el bot funcionando?
Depende del uso. Con GPT-4o-mini:
- 100 mensajes/día ≈ $0.50/mes
- 1000 mensajes/día ≈ $5/mes
- Hosting: $0 (Railway free tier) a $5/mes — o un mini PC por ~250 EUR como inversión única
¿Puedo usar el bot en grupos?
Sí, pero necesitas ajustar el código para manejar mensajes de grupo y decidir cuándo responder (menciones, comandos, etc.).
¿Cómo evito abusos?
Implementa rate limiting:
1from collections import defaultdict2import time3 4user_last_message = defaultdict(float)5RATE_LIMIT = 5 # segundos entre mensajes6 7@dp.message()8async def message_handler(message: types.Message):9 user_id = message.from_user.id10 now = time.time()11 12 if now - user_last_message[user_id] < RATE_LIMIT:13 await message.answer("Espera unos segundos antes de enviar otro mensaje.")14 return15 16 user_last_message[user_id] = now17 # ... resto del código
Conclusión
Crear un bot de Telegram con IA es más fácil de lo que parece. Con ~50 líneas de código tienes un asistente funcional.
Próximos pasos:
- Añadir base de datos para persistir conversaciones
- Implementar memoria a largo plazo con embeddings
- Añadir funciones específicas para tu caso de uso
Recursos relacionados:
Más tutoriales de IA en Javadex.es
Síguenos: YouTube @JavadexAI | TikTok @javadex
¿Listo para poner tu proyecto en producción?
Si estás siguiendo este tutorial, necesitas un servidor donde desplegarlo. Yo uso Hostinger para mis proyectos porque el panel es intuitivo, los VPS van con SSD NVMe, y a 4,99€/mes no hay nada comparable en relación calidad-precio.
* Enlace de afiliado. Si contratas a través de este enlace, nos ayudas a mantener este contenido gratuito.
Posts Relacionados
Consultoría IA en San Sebastián (Donostia): Agentes, Automatización y Modelos Privados para Empresas [2026]
Guía completa de servicios de inteligencia artificial en San Sebastián: agentes IA, automatización, modelos privados y consultoría para empresas vascas en 2026.
Kit Digital 2026 para IA: Cómo Solicitar Hasta 12.000€ para tu PYME Paso a Paso
Tutorial paso a paso para solicitar el Kit Digital 2026 con soluciones de IA. Requisitos, cuantías por segmento (hasta 12.000€), agentes digitalizadores y errores que rechazan tu solicitud.
Formación en Claude Code para Empresas en España: Proveedores, Precios y Qué Esperar [2026]
Guía de formación en Claude Code para empresas españolas: proveedores, precios (desde 4.000€), programas in-company, duración y resultados esperados.
Javier Santos Criado
Consultor de IA y Automatización | Fundador de Javadex
Experto en implementación de soluciones de Inteligencia Artificial para empresas. Especializado en automatización con n8n, integración de LLMs, y desarrollo de agentes IA.
Lleva tu proyecto a producción
Hosting web desde 2,99€/mes o VPS con SSD NVMe desde 4,99€/mes. Panel intuitivo, IP dedicada y soporte 24/7 en español.
¿Quieres más contenido de IA?
Explora nuestras comparativas y guías