# Enviar mensajes de WhatsApp desde Python con la API oficial

- Link: https://sergiocaballero.com/como-enviar-mensajes-automaticos-de-whatsapp-desde-python/
- Published: 2021-02-05T10:30:20+00:00
- Author: Sergio Caballero

Índice de contenido

 1.  [Prepara una prueba en Meta](https://sergiocaballero.com/como-enviar-mensajes-automaticos-de-whatsapp-desde-python/#prepara_una_prueba_en_meta)
 2.  [Configura variables fuera del código](https://sergiocaballero.com/como-enviar-mensajes-automaticos-de-whatsapp-desde-python/#configura_variables_fuera_del_codigo)
 3.  [Envía una única solicitud de prueba](https://sergiocaballero.com/como-enviar-mensajes-automaticos-de-whatsapp-desde-python/#envia_una_unica_solicitud_de_prueba)
 4.  [Límites y errores que debes distinguir](https://sergiocaballero.com/como-enviar-mensajes-automaticos-de-whatsapp-desde-python/#limites_y_errores_que_debes_distinguir)
 5.  [Fuentes oficiales](https://sergiocaballero.com/como-enviar-mensajes-automaticos-de-whatsapp-desde-python/#fuentes_oficiales)

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

 1. Sigue [los primeros pasos oficiales](https://developers.facebook.com/documentation/business-messaging/whatsapp/get-started/)
    para crear o configurar una aplicación con el caso de uso de WhatsApp.
 2. 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.
 3. Registra un destinatario de prueba autorizado y comprueba primero el envío desde
    el panel.
 4. Identifica el token, la versión de Graph API y una plantilla habilitada con su 
    idioma.

![Instalador de Python en Windows con la opción Add Python to PATH marcada](https://
i0.wp.com/sergiocaballero.com/wp-content/uploads/2022/11/python-installation-options.
png?ssl=1)

Imagen 1: Durante la instalación en Windows, marca “Add Python to PATH” para evitar
problemas con pip y la terminal.

![Comando python --version ejecutado en Windows](https://i0.wp.com/sergiocaballero.
com/wp-content/uploads/2021/02/captura-de-pantalla-193-1.png?ssl=1)

Imagen 2: Verifica tu instalación con _python --version_ (o _py --version_).

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

    ```wp-block-code
    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](https://sergiocaballero.com/como-usar-terminal-linux/)
y [cómo limitar el acceso SSH](https://sergiocaballero.com/habilitar-conexion-ssh-en-kali-linux/).
Una automatización requiere además control de acceso, tratamiento de errores y seguimiento;
no basta con dejar un bucle enviando mensajes.

## Fuentes oficiales

 * [Meta: primeros pasos con la API de la nube](https://developers.facebook.com/documentation/business-messaging/whatsapp/get-started/)
 * [Meta: envío de mensajes](https://developers.facebook.com/documentation/business-messaging/whatsapp/messages/send-messages/)
 * [WhatsApp: política de mensajería de empresas](https://whatsappbusiness.com/es-la/policy/)
 * [Python: urllib.request](https://docs.python.org/3/library/urllib.request.html)

### Comparte esto:

 * [  Facebook ](https://sergiocaballero.com/como-enviar-mensajes-automaticos-de-whatsapp-desde-python/?share=facebook)
 * [  X ](https://sergiocaballero.com/como-enviar-mensajes-automaticos-de-whatsapp-desde-python/?share=x)

### _Relacionado_
