Saltar a contenido

Twilio - WhatsApp

Envía mensajes de WhatsApp de manera sencilla y segura con las APIs de Twilio.

Warning

Este complemento asume que ya tienes una cuenta de Twilio creada y configurada para usar las funciones de números de teléfono. Si aún no tienes una cuenta configurada, por favor sigue los pasos en la documentación de Twilio.

Instalación

pip install botcity-twilio-whatsapp-plugin

Importando el complemento

Después de instalar este paquete y configurar tu cuenta de Twilio, el siguiente paso es importar el paquete en tu código y comenzar a usar las funciones.

from botcity.plugins.twilio.whatsapp import BotTwilioWhatsappPlugin

Instanciando el complemento

Primero, vamos a instanciar el complemento pasando alguna información de tu cuenta de Twilio. Todo lo que necesitamos es el ACCOUNT SID y el AUTH TOKEN de la cuenta, puedes obtener esta información en la sección Account Info de tu panel de control de Twilio.

account_sid = "<YOUR_ACCOUNT_SID>"
auth_token = "<YOUR_AUTH_TOKEN>"
wpp_number = "+14155238886"

# Instantiate the plugin for WhatsApp messages
twilio_wpp = BotTwilioWhatsappPlugin(account_sid, auth_token, wpp_number)

Enviando mensajes de WhatsApp

Podemos enviar mensajes a través de WhatsApp de la misma manera en que enviamos mensajes de SMS. Todo lo que necesitamos es un número configurado correctamente. En este ejemplo, estamos usando un número de prueba proporcionado por Twilio, pero puedes configurar y usar tus propios números que hayan sido aprobados por WhatsApp (detalles aquí).

Tip

Si tienes más de un número de WhatsApp configurado en tu cuenta de Twilio, puedes cambiar la propiedad whatsapp number en cualquier momento durante el proceso para definir qué número se utilizará.

wpp = BotTwilioWhatsappPlugin(account_sid, auth_token, whatsapp_number)
print("Número actual a utilizar: ", wpp.whatsapp_number)
wpp.whatsapp_number = "<TU_SEGUNDO_NÚMERO>"
from botcity.plugins.twilio.whatsapp import BotTwilioWhatsappPlugin

account_sid = "<YOUR_ACCOUNT_SID>"
auth_token = "<YOUR_AUTH_TOKEN>"

# Phone numbers must be used in E.164 format
# [+][country code][phone number including area code]
whatsapp_number = "+14155238886"
to_phone = "+5519987654321"

whatsapp = BotTwilioWhatsappPlugin(account_sid, auth_token, whatsapp_number)
whatsapp.send_message(
    to_number=to_phone,
    msg_content="Hello from WhatsApp! 😃"
)

También es posible enviar contenido multimedia, pero en WhatsApp está limitado a un archivo multimedia por mensaje utilizando la API de Twilio. El contenido multimedia debe ser una URL de acceso público, simplemente pasa la URL del archivo multimedia que se adjuntará al mensaje.

photo = "https://i.imgur.com/7qqUvQR.jpg"

whatsapp.send_message(
    to_number=to_phone,
    msg_content="A dog photo",
    media_url=photo
)

Recuperando mensajes

Con este complemento también podemos obtener mensajes asociados a un número de WhatsApp configurado. Podemos devolver mensajes que hayan sido enviados y recibidos por este número.

Puedes usar filtros para buscar mensajes específicos, como la fecha en que se envió el mensaje o el número que lo envió. Se devolverá una lista de mensajes y para cada mensaje es posible acceder a algunas propiedades y realizar algunas acciones más adelante.

# Instantiating the plugin
whatsapp = BotTwilioWhatsappPlugin(account_sid, auth_token, whatsapp_number)

# Only collects messages that have been received from a specific number.
messages = whatsapp.get_received_messages(from_number="+5519987654321")

# For each message found, prints:
# The sender's number
# The sending date
# The message content
for msg in messages:
    print(msg.from_)
    print(msg.date_sent)
    print(msg.body)

Respondiendo mensajes

Es posible responder a los mensajes que se devolvieron con el método get received messages, podemos responder a un solo mensaje o recorrer la lista y responder a cada mensaje recuperado.

from datetime import datetime
from botcity.plugins.twilio.whatsapp import BotTwilioWhatsappPlugin

account_sid = "<YOUR_ACCOUNT_SID>"
auth_token = "<YOUR_AUTH_TOKEN>"
whatsapp_number = "+14155238886"

whatsapp = BotTwilioWhatsappPlugin(account_sid, auth_token, whatsapp_number)

# Get only messages that were received on 05/27/2022
msgs_to_reply = whatsapp.get_received_messages(on_date=datetime(2022, 5, 27))

# Reply for all messages with a standard message.
for msg in msgs_to_reply:
    whatsapp.reply_message(msg, "Your message was received!")

Esperando nuevos mensajes

En los casos en que tenemos que esperar a que llegue un nuevo mensaje y no sabemos cuánto tiempo tomará, podemos usar el método wait for new message. De esta manera, es posible definir un tiempo máximo de espera y el número que enviará el mensaje, cuando sea necesario.

account_sid = "<YOUR_ACCOUNT_SID>"
auth_token = "<YOUR_AUTH_TOKEN>"
whatsapp_number = "+14155238886"

whatsapp = BotTwilioWhatsappPlugin(account_sid, auth_token, whatsapp_number)

# Wait for a new message from a specific number
new_msg = whatsapp.wait_for_new_message(from_number="+5519987654321")

print(new_msg.body)

Descargando contenido multimedia recibido

Para los mensajes que se han recibido y tienen contenido multimedia, podemos guardar este archivo en el disco.

Warning

La API de Twilio para WhatsApp tiene la limitación de un archivo multimedia por mensaje. Por lo tanto, en los mensajes que se reciben y tienen más de un contenido multimedia, la API considera en el objeto de mensaje solo el primer archivo multimedia que se envió, descartando los demás (ver más detalles aquí).

# Wait for a new message
new_msg = whatsapp.wait_for_new_message(from_number="+5519987654321", timeout=90)

# If the message was received, save the media content
if new_msg:
    print(new_msg.body)
    whatsapp.download_media_file(new_msg, download_folder_path="downloads/media")

Los tipos de contenido multimedia actualmente admitidos que se utilizan para guardar los archivos se definen en la siguiente tabla:

Tipo MIME admitido Extensión utilizada para guardar el archivo
image/jpg .jpg
image/jpeg .jpeg
image/png .png
audio/mp3 .mp3
application/pdf .pdf
video/mp4 .mp4