Enviar mensajes de WhatsApp desde Python con la API oficial

Para enviar mensajes de WhatsApp desde Python utiliza la plataforma oficial de WhatsApp Business y su API de la nube. Prepara primero una prueba con un destinatario autorizado, una plantilla disponible y un token de tu propia aplicación. Automatizar una sesión de WhatsApp Web no sustituye ese proceso.
Prepara una prueba en Meta
- Sigue los primeros pasos oficiales para crear o configurar una aplicación con el caso de uso de WhatsApp.
- En la configuración de la API, identifica el número emisor y su identificador. Un identificador de número no es el número que escribe un usuario.
- Registra un destinatario de prueba autorizado y comprueba primero el envío desde el panel.
- Identifica el token, la versión de Graph API y una plantilla habilitada con su idioma.


Los requisitos de permisos, revisión y cuenta dependen del despliegue. No copies credenciales de un tutorial ni supongas que un token temporal sirve para producción. Revisa su caducidad, los activos a los que da acceso y los permisos que necesita tu aplicación.
Configura variables fuera del código
El ejemplo lee WA_GRAPH_VERSION, WA_PHONE_NUMBER_ID, WA_ACCESS_TOKEN, WA_TEST_RECIPIENT, WA_TEMPLATE_NAME y WA_TEMPLATE_LANGUAGE del entorno del proceso. Configúralas con los valores de tu panel: la versión debe ser una admitida por tu aplicación y el nombre e idioma deben coincidir con la plantilla disponible.
El caso mostrado es una plantilla de prueba sin parámetros. Si tu plantilla tiene variables, encabezados o botones obligatorios, necesitarás incluir sus componentes según la documentación; este cuerpo no es suficiente para cualquier plantilla. No guardes tokens en repositorios, capturas o páginas públicas.
Envía una única solicitud de prueba
import json
import os
import urllib.error
import urllib.request
version = os.environ["WA_GRAPH_VERSION"]
phone_id = os.environ["WA_PHONE_NUMBER_ID"]
token = os.environ["WA_ACCESS_TOKEN"]
recipient = os.environ["WA_TEST_RECIPIENT"]
template_name = os.environ["WA_TEMPLATE_NAME"]
language = os.environ["WA_TEMPLATE_LANGUAGE"]
payload = {
"messaging_product": "whatsapp",
"to": recipient,
"type": "template",
"template": {
"name": template_name,
"language": {"code": language}
}
}
request = urllib.request.Request(
f"https://graph.facebook.com/{version}/{phone_id}/messages",
data=json.dumps(payload).encode("utf-8"),
headers={
"Authorization": f"Bearer {token}",
"Content-Type": "application/json"
},
method="POST"
)
try:
with urllib.request.urlopen(request, timeout=30) as response:
result = json.load(response)
messages = result.get("messages") or []
print("Identificador:", messages[0].get("id") if messages else "No indicado")
except urllib.error.HTTPError as error:
print("La API rechazó la solicitud. Código HTTP:", error.code)
except urllib.error.URLError:
print("No se pudo confirmar el resultado. Revisa antes de reenviar.")
El código usa la biblioteca estándar de Python y no programa envíos masivos. Ejecútalo únicamente después de preparar tu cuenta y el destinatario. Un identificador en la respuesta significa que Meta aceptó la solicitud; no acredita por sí solo la entrega o lectura. Para conocer esos estados, configura y valida webhooks según la guía de Meta.
Límites y errores que debes distinguir
- Una plantilla o un idioma incorrectos no se arreglan cambiando el número emisor al azar.
- Un token caducado o sin acceso necesita revisión de credenciales y permisos.
- Si se pierde la conexión, comprueba el resultado antes de repetir: reenviar automáticamente puede duplicar mensajes.
- Fuera del intervalo de servicio permitido, no sustituyas una plantilla requerida por texto libre.
Contacta solo con personas que hayan aceptado esas comunicaciones y respeta las bajas. La política de WhatsApp Business y las condiciones de la cuenta también se aplican a las pruebas y a los sistemas automatizados. No se promete un servicio gratuito, sin límites ni sin riesgo de restricciones.
Si necesitas ejecutar un servicio propio, revisa el uso básico de una terminal Linux y cómo limitar el acceso SSH. Una automatización requiere además control de acceso, tratamiento de errores y seguimiento; no basta con dejar un bucle enviando mensajes.

Deja un comentario