PythonBot de Telegram con Webhooks
note
Puedes ver este bot en funcionamiento en Telegram:
Los bots de Telegram pueden implementarse mediante dos métodos principales: polling (sondeo periódico) y webhooks. Los webhooks ofrecen ventajas en producción al eliminar la necesidad de conexiones persistentes y reducir la latencia en la entrega de actualizaciones. En este artículo exploraremos una implementación técnica usando Python, FastAPI y la biblioteca python-telegram-bot
.
Requisitos previos
Python 3.10+ instalado
Cuenta de Telegram y @BotFather para crear un bot
ngrok para pruebas locales (opcional)
Cuenta en Railway para despliegue (opcional)
Arquitectura del sistema
Implementación
Crea un nuevo entorno virtual e instala las dependencias:
python -m venv venv
source venv/bin/activate # Linux/Mac
venv\Scripts\activate.bat # Windows
pip install fastapi hypercorn python-telegram-bot python-dotenv
Configura las variables de entorno:
TELEGRAM_BOT_TOKEN=tu_token_aqui
RAILWAY_PUBLIC_DOMAIN=https://tudominio.com
Inicializa el bot con utilizando el método Application.builder()
:
from telegram.ext import Application
bot_builder = (
Application.builder()
.token(os.getenv('TELEGRAM_BOT_TOKEN'))
.updater(None) # Desactiva el updater para webhooks
.build()
)
Configura el servicio con FastAPI:
@asynccontextmanager
async def lifespan(_: FastAPI):
await bot_builder.bot.setWebhook(WEBHOOK_DOMAIN)
async with bot_builder:
await bot_builder.start()
yield
await bot_builder.stop()
app = FastAPI(lifespan=lifespan)
Define el endpoint de entrada que procesará las actualizaciones recibidas desde Telegram:
@app.post("/")
async def process_update(request: Request):
update = Update.de_json(await request.json(), bot_builder.bot)
await bot_builder.process_update(update)
return Response(status_code=HTTPStatus.OK)
Handlers
Los handlers son componentes que definen cómo tu bot responde a diferentes tipos de mensajes o eventos. Actúan como "escuchas" que reaccionan a comandos, mensajes, o interacciones específicas, y ejecutan funciones asociadas (llamadas callback functions).
Ejemplo 1: Manejar comando /start
async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
await update.message.reply_text("¡Bot activado! 🚀")
bot_builder.add_handler(CommandHandler("start", start))
Ejemplo 2: Manejar mensajes de texto
async def echo(update: Update, context: ContextTypes.DEFAULT_TYPE):
await update.message.reply_text(update.message.text)
bot_builder.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, echo))
Flujo de trabajo del Webhook
Registro del webhook: Al iniciar la aplicación, se configura la URL en Telegram
Recepción de actualizaciones: Telegram envía actualizaciones via POST a nuestro endpoint
Procesamiento: FastAPI deserializa el JSON y lo convierte en un objeto
Update
Ejecución de handlers: La aplicación de bot procesa la actualización con los handlers registrados
Respuesta: El bot envía respuestas mediante llamadas a la API de Telegram"
Despliegue en producción
Usando Railway
Crea un nuevo proyecto desde la plantilla
Configura las variables de entorno en el panel de control
Despliega con un clic usando el botón proporcionado
Conclusión
Esta implementación combina la eficiencia de FastAPI con la flexibilidad de python-telegram-bot para crear bots escalables. Los webhooks son ideales para entornos de producción donde el rendimiento y la eficiencia en el uso de recursos son críticos.