python | Enviar y recibir WhatsApp desde Python
Recibir es una ruta en tu framework web que responde al GET de verificación de Meta y acepta POSTs. Enviar es una petición HTTPS a la Cloud API con el phone number id y el token del número. Ningún SDK nuestro, y nada que instalar.
Un GET para la verificación de Meta y un POST para los eventos. Ese es el lado de recepción.
Ventana posterior al mensaje del cliente en la que se envía texto libre.
El error que se devuelve cuando envías texto libre fuera de esa ventana.
¿Cómo se reciben mensajes en Python?
Con dos handlers en una misma ruta, en el framework que ya uses.
El handler de GET responde a la verificación de Meta. Lee hub.mode, hub.verify_token y hub.challenge de la query string, compara el token con el tuyo, y devuelve el challenge como cuerpo crudo. Devolver JSON aquí es el error más común, y falla en silencio.
El handler de POST recibe los eventos. Devuelve 200 rápido y haz el trabajo después, porque Meta trata una respuesta lenta como un fallo y va a reintentar, lo que significa atender el mismo mensaje dos veces. Encólalo, o pásalo a una tarea en segundo plano, en lugar de procesarlo ahí mismo.
Los mensajes llegan con un id de mensaje wamid. Vale la pena deduplicar por él desde el principio, ya que los reintentos son normales y no excepcionales.
¿Cómo se envía?
Un POST al endpoint de mensajes de la Cloud API del phone number id, con un bearer token.
Los dos valores vienen de la conexión: el panel los muestra, y get_api_credentials los devuelve si prefieres que un asistente los busque. Nada de la llamada es específico nuestro, así que cualquier librería HTTP funciona y la petición queda exactamente igual que en la documentación de la propia Meta.
Lo que cambia con el tiempo es el cuerpo. Dentro de las 24 horas del último mensaje del cliente envías un objeto de texto. Fuera de eso envías un objeto de plantilla nombrando una plantilla aprobada y su idioma. Un cliente que solo conoce la primera forma funciona perfecto en las pruebas y falla en el primer mensaje que cruza la noche, devolviendo el error 131047.
¿Qué necesita un handler de producción además de eso?
Tres cosas que es fácil saltarse y caro agregar después.
Deduplica por el id del mensaje, porque Meta reintenta. Verifica la firma de la petición si estás expuesto públicamente, ya que, sin eso, cualquiera que descubra tu URL puede publicar en ella. Y ramifica según hace cuánto escribió el contacto por última vez, para que el camino de envío elija texto o plantilla sin que una persona lo decida.
Nada de esto necesita un framework ni una librería. Son un conjunto, una comprobación y una comparación, y tenerlos listos antes del primer cliente es la diferencia entre una integración que corre en silencio y una que te despierta de madrugada.
Errores comunes
- Devolver JSON en el GET de verificación en lugar del valor crudo del challenge.
- Procesar ahí mismo antes de devolver 200. Meta reintenta las respuestas lentas y atiendes el mensaje dos veces.
- Enviar texto libre sin revisar la ventana. Devuelve 131047 y parece que no pasó nada.
Conecta el número en easycoexistence.com, define el destino del webhook como tu ruta, y lee el phone number id y el token desde el panel. Desde US$ 9 por número por mes, bajando a US$ 2 con volumen, con los primeros 7 días gratis.
Preguntas frecuentes
¿Existe un SDK de Python?
Nuestro no, y no lo necesitas. La API es de Meta, documentada por Meta, y alcanzable con cualquier librería HTTP.
¿Qué framework debería usar?
Cualquiera. El requisito es una ruta que responda a un GET y acepte un POST, algo que hace todo framework web de Python.
¿Cómo evito atender un mensaje dos veces?
Deduplica por el id de mensaje wamid que viene en el payload. Meta reintenta por diseño, así que esto es lo esperado y no un caso extremo.
¿El equipo puede seguir usando el teléfono?
Sí. La Coexistencia mantiene la app de WhatsApp Business funcionando en el mismo número, y tu handler ve lo que envían como un evento de eco.
Sigue leyendo
¿Listo para empezar?
Configura WhatsApp Coexistence en minutos, no en meses. La app sigue funcionando en el teléfono.
Empezar prueba gratisVerificado el