Bot de WhatsApp con Django, Python y OpenAI

Alejandro

Hace algunos años, montar un chatbot implicaba lidiar con árboles de decisión rígidos e interminables. Hoy, gracias a los modelos de lenguaje (LLM), la historia es muy distinta. Como desarrolladores, integrar inteligencia artificial en canales de uso diario es una de las habilidades más demandadas. En este tutorial vamos a ensuciarnos las manos construyendo un bot de WhatsApp inteligente utilizando Django, Python y la API de OpenAI. Te guiaré por el proceso exacto que uso en entornos de producción, saltándonos la teoría innecesaria y yendo directos a lo que funciona, incluyendo los tropiezos técnicos que seguramente tendrás al lidiar con webhooks por primera vez.

Requisitos Previos para la Integración

Antes de escribir la primera línea de código, asegúrate de tener tu entorno preparado. Trabajar con integraciones de terceros requiere que ciertas piezas estén en su lugar desde el principio:

  • Python 3.10+ y conocimientos intermedios del framework Django.
  • Una cuenta activa en Twilio (usaremos su entorno Sandbox para WhatsApp, que es gratuito para desarrollo).
  • Una clave de API de OpenAI con saldo disponible.
  • Ngrok instalado en tu sistema local para exponer tu puerto a Internet de forma segura.

Paso 1: Configuración del Entorno y Dependencias

Lo primero es aislar nuestro entorno. Ya sabes, nada de instalar dependencias a nivel global que luego rompan otros proyectos. Crea un entorno virtual e instala lo básico. En tu terminal, ejecuta:

pip install django twilio openai python-dotenv

Inicia un proyecto nuevo en Django y crea una aplicación dedicada exclusivamente al bot. En mi experiencia, separar la lógica de comunicación en una app específica (por ejemplo, whatsapp_bot) te ahorrará dolores de cabeza cuando el proyecto empiece a escalar y necesites añadir canales como Telegram o Slack.

Paso 2: Creando el Webhook para Twilio

Twilio se comunica con nuestro servidor mediante peticiones POST cada vez que un usuario envía un mensaje al número de WhatsApp. Aquí hay un detalle crucial en el que muchos desarrolladores junior se atascan: Django bloquea por defecto las peticiones POST externas por motivos de seguridad (protección CSRF). Como Twilio no sabe nada de nuestros tokens internos, necesitamos desactivar esta protección específicamente para esta vista usando el decorador @csrf_exempt.

En tu archivo views.py, crea una función que reciba el objeto request, extraiga el parámetro 'Body' (que contiene el texto del usuario) y el parámetro 'From' (el número de teléfono). Es fundamental devolver siempre una respuesta HTTP 200 rápida para que Twilio sepa que hemos recibido el mensaje correctamente.

Paso 3: Conectando con el Cerebro de OpenAI

Una vez que hemos capturado el texto del usuario, toca pasárselo a OpenAI. Utiliza el cliente oficial de Python para hacer la llamada a la API. Configura el system prompt cuidadosamente; aquí es donde le das personalidad a tu bot y estableces sus límites. Por ejemplo, puedes indicarle que actúe como un asistente de soporte técnico que solo responde preguntas sobre programación.

Un consejo basado en la experiencia: nunca dejes el parámetro max_tokens vacío. Si el modelo decide generar una respuesta excesivamente larga, no solo empeorará la experiencia del usuario leyendo un bloque de texto enorme en WhatsApp, sino que tu factura de la API se disparará innecesariamente.

Paso 4: Formateando la Respuesta y Exponiendo el Servidor

Twilio espera que le devolvamos un documento XML específico llamado TwiML con nuestra respuesta. Afortunadamente, la librería de Twilio para Python incluye clases auxiliares para generar este XML sin tener que concatenar strings manualmente. Simplemente instancia un objeto MessagingResponse, añádele el texto generado por OpenAI y devuélvelo como un HttpResponse con el tipo de contenido adecuado.

Para probar esto en tu máquina, levanta el servidor de desarrollo de Django (python manage.py runserver) y en otra terminal ejecuta ngrok http 8000. Ngrok te proporcionará una URL HTTPS pública. Copia esa URL, ve a la consola de Twilio, busca la configuración del Sandbox de WhatsApp y pégala en el campo que dice "When a message comes in".

Errores Comunes y Buenas Prácticas en Producción

El código básico funciona bien para un tutorial, pero la realidad en producción es mucho más exigente. Aquí tienes los problemas más habituales a los que te enfrentarás:

  • El temido Timeout de Twilio: Twilio exige que tu webhook responda en un máximo de 15 segundos. Si la API de OpenAI está congestionada o usas un modelo pesado como GPT-4, la petición tardará más. Twilio cortará la conexión y el usuario no recibirá nada. ¿La solución profesional? Devuelve un HTTP 200 inmediatamente, delega la llamada a OpenAI a una tarea en segundo plano usando Celery o Redis Queue, y cuando tengas la respuesta, envíala asíncronamente usando la API REST de Twilio.
  • Falta de Contexto: La API de OpenAI es stateless (no tiene memoria). Si quieres que el bot recuerde lo que el usuario dijo hace dos mensajes, tendrás que diseñar un modelo en tu base de datos de Django para almacenar el historial de la conversación y enviar los últimos mensajes en cada nueva petición a la API.
  • Seguridad del Webhook: Ahora mismo, tu endpoint está abierto a todo Internet. Cualquiera podría hacer peticiones POST a tu URL simulando ser Twilio. En un entorno real, debes utilizar la utilidad RequestValidator de la librería de Twilio para verificar criptográficamente la firma de la petición entrante.

Reflexiones Finales

Montar la arquitectura básica de un bot de WhatsApp con Python no lleva más de un par de horas si tienes los conceptos claros. Sin embargo, afinar el comportamiento del modelo, gestionar el estado de las conversaciones y asegurar la infraestructura contra fallos de red es donde realmente demuestras tu madurez como ingeniero de software. Empieza implementando esta base, experimenta con diferentes prompts y, cuando te sientas cómodo con el flujo de datos, da el salto hacia el procesamiento asíncrono. El ecosistema de Django está perfectamente preparado para escalar este tipo de soluciones tecnológicas.

Compartir

Sobre el autor

Alejandro

Desarrollador

Desarrollador web especializado en Django y Python, con pasión por la tecnología y la innovación.