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.
Tabla de Contenidos
- Requisitos previos
- Crear el bot en Telegram
- Configurar el proyecto Python
- Integrar con ChatGPT
- Integrar con Claude
- Funciones avanzadas
- Deployment
- FAQ
Requisitos previos {#requisitos}
| 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 {#crear-bot}
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 {#proyecto}
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 {#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 {#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 {#avanzado}
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 {#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 &
FAQ {#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
¿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
Posts Relacionados
Cómo Usar Claude Code en Terminal: Tutorial Paso a Paso [2026]
Tutorial completo de Claude Code CLI. Aprende a usar el agente de código de Anthropic en terminal para automatizar desarrollo, refactoring y tareas complejas.
MCP Servers para Claude: Guía de Configuración en Español [2026]
Configura MCP Servers para Claude Code y Claude Desktop. Tutorial en español con ejemplos: filesystem, GitHub, bases de datos, APIs personalizadas.
Gemini 3 Deep Think: Cómo Usar el Modo Razonamiento de Google [2026]
Guía de Gemini 3 Deep Think, el modo de razonamiento avanzado de Google. Cómo activarlo, cuándo usarlo, comparativa con GPT-5.2 Thinking y casos de uso.
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.
¿Quieres más contenido de IA?
Explora nuestras comparativas y guías