Bot de WhatsApp con Django, Python e OpenAI

Alejandro

Hai algúns anos, montar un chatbot implicaba lidar con árbores de decisión ríxidas e interminables. Hoxe, grazas aos modelos de linguaxe (LLM), a historia é moi distinta. Como desenvolvedores, integrar intelixencia artificial en canles de uso diario é unha das habilidades máis demandadas. Neste tutorial imos mancharnos as mans construíndo un bot de WhatsApp intelixente empregando Django, Python e a API de OpenAI. Guiareite polo proceso exacto que uso en contornos de produción, saltándonos a teoría innecesaria e indo directos ao que funciona, incluíndo os atrancos técnicos que seguramente terás ao lidar con webhooks por primeira vez.

Requisitos Previos para a Integración

Antes de escribir a primeira liña de código, asegúrate de ter o teu contorno preparado. Traballar con integracións de terceiros require que certas pezas estean no seu lugar desde o principio:

  • Python 3.10+ e coñecementos intermedios do framework Django.
  • Unha conta activa en Twilio (usaremos o seu contorno Sandbox para WhatsApp, que é gratuíto para desenvolvemento).
  • Unha chave de API de OpenAI con saldo dispoñible.
  • Ngrok instalado no teu sistema local para expor o teu porto a Internet de forma segura.

Paso 1: Configuración do Contorno e Dependencias

O primeiro é illar o noso contorno. Xa sabes, nada de instalar dependencias a nivel global que logo rompan outros proxectos. Crea un contorno virtual e instala o básico. No teu terminal, executa:

pip install django twilio openai python-dotenv

Inicia un proxecto novo en Django e crea unha aplicación dedicada exclusivamente ao bot. Na miña experiencia, separar a lóxica de comunicación nunha app específica (por exemplo, whatsapp_bot) aforrarache dores de cabeza cando o proxecto empece a escalar e necesites engadir canles como Telegram ou Slack.

Paso 2: Creando o Webhook para Twilio

Twilio comunícase co noso servidor mediante peticións POST cada vez que un usuario envía unha mensaxe ao número de WhatsApp. Aquí hai un detalle crucial no que moitos desenvolvedores junior se atascan: Django bloquea por defecto as peticións POST externas por motivos de seguridade (protección CSRF). Como Twilio non sabe nada dos nosos tokens internos, necesitamos desactivar esta protección especificamente para esta vista usando o decorador @csrf_exempt.

No teu ficheiro views.py, crea unha función que reciba o obxecto request, extraia o parámetro 'Body' (que contén o texto do usuario) e o parámetro 'From' (o número de teléfono). É fundamental devolver sempre unha resposta HTTP 200 rápida para que Twilio saiba que recibimos a mensaxe correctamente.

Paso 3: Conectando co Cerebro de OpenAI

Unha vez que capturamos o texto do usuario, toca pasarllo a OpenAI. Utiliza o cliente oficial de Python para facer a chamada á API. Configura o system prompt coidadosamente; aquí é onde lle das personalidade ao teu bot e estableces os seus límites. Por exemplo, podes indicarlle que actúe como un asistente de soporte técnico que só responde preguntas sobre programación.

Un consello baseado na experiencia: nunca deixes o parámetro max_tokens baleiro. Se o modelo decide xerar unha resposta excesivamente longa, non só empeorará a experiencia do usuario lendo un bloque de texto enorme en WhatsApp, senón que a túa factura da API dispararase innecesariamente.

Paso 4: Formatando a Resposta e Expondo o Servidor

Twilio espera que lle devolvamos un documento XML específico chamado TwiML coa nosa resposta. Afortunadamente, a libraría de Twilio para Python inclúe clases auxiliares para xerar este XML sen ter que concatenar strings manualmente. Simplemente instancia un obxecto MessagingResponse, engádelle o texto xerado por OpenAI e devólveo como un HttpResponse co tipo de contido axeitado.

Para probar isto na túa máquina, levanta o servidor de desenvolvemento de Django (python manage.py runserver) e noutro terminal executa ngrok http 8000. Ngrok proporcionarache unha URL HTTPS pública. Copia esa URL, vai á consola de Twilio, busca a configuración do Sandbox de WhatsApp e pégala no campo que di "When a message comes in".

Erros Comúns e Boas Prácticas en Produción

O código básico funciona ben para un tutorial, pero a realidade en produción é moito máis esixente. Aquí tes os problemas máis habituais aos que te enfrontarás:

  • O temido Timeout de Twilio: Twilio esixe que o teu webhook responda nun máximo de 15 segundos. Se a API de OpenAI está conxestionada ou usas un modelo pesado como GPT-4, a petición tardará máis. Twilio cortará a conexión e o usuario non recibirá nada. A solución profesional? Devolve un HTTP 200 inmediatamente, delega a chamada a OpenAI a unha tarefa en segundo plano usando Celery ou Redis Queue, e cando teñas a resposta, envíala asincronamente usando a API REST de Twilio.
  • Falta de Contexto: A API de OpenAI é stateless (non ten memoria). Se queres que o bot lembre o que o usuario dixo hai dúas mensaxes, terás que deseñar un modelo na túa base de datos de Django para almacenar o historial da conversa e enviar as últimas mensaxes en cada nova petición á API.
  • Seguridade do Webhook: Agora mesmo, o teu endpoint está aberto a toda Internet. Calquera podería facer peticións POST á túa URL simulando ser Twilio. Nun contorno real, debes utilizar a utilidade RequestValidator da libraría de Twilio para verificar criptograficamente a sinatura da petición entrante.

Reflexións Finais

Montar a arquitectura básica dun bot de WhatsApp con Python non leva máis dun par de horas se tes os conceptos claros. Porén, afinar o comportamento do modelo, xestionar o estado das conversas e asegurar a infraestrutura contra fallos de rede é onde realmente demostras a túa madurez como enxeñeiro de software. Comeza implementando esta base, experimenta con diferentes prompts e, cando te sintas cómodo co fluxo de datos, dá o salto cara ao procesamento asíncrono. O ecosistema de Django está perfectamente preparado para escalar este tipo de solucións tecnolóxicas.

Texto redactado con la ayuda de Inteligencia Artificial y supervisado por el equipo de Zeleiro

Compartir

Sobre o autor

Alejandro

Desenvolvedor

Desenvolvedor web especializado en Django e Python, con paixón pola tecnoloxía e a innovación.