Volver a las novedades para desarrolladores

Cómo visualizar métricas de una cuenta de WhatsApp en una aplicación

19 de diciembre de 2022DeRashed Talukder

La API de administración de WhatsApp Business te da acceso a métricas y análisis sobre tu cuenta de WhatsApp Business (WABA). Puedes obtener dos tipos de datos sobre la cuenta:

  • Análisis de mensajes: la cantidad de mensajes enviados y entregados por los números de teléfono asociados a una cuenta WABA concreta durante un periodo determinado.
  • Análisis de conversaciones: información sobre el coste y la conversación de los mensajes enviados durante un periodo determinado.

Al consultar el extremo de la API, debes especificar si quieres obtener análisis de mensajes o de conversaciones; para ello, tienes que añadir analytics o conversation_analytics como parámetro para la URL.

A modo de ejemplo, a continuación se incluye una solicitud que puedes usar si quieres obtener análisis de mensajes sobre tu cuenta:

https://graph.facebook.com/v14.0/{whatsapp-business-account-ID}
      ?fields=analytics
      .{filtering-parameters}
      &{access-token}

En este ejemplo, especificamos que queremos recuperar análisis de mensajes de los números de teléfono vinculados a la cuenta WABA que tiene un identificador único de cuenta WABA. Obtendrás más información sobre cómo obtener el identificador de la cuenta WABA y el identificador de acceso en la sección Requisitos a continuación.

Además, al realizar una solicitud, puedes aplicar parámetros de filtración para mejorar el resultado. El extremo de la API de administración de WhatsApp Business admite seis parámetros de filtración en total. Debes tener los siguientes:

  • start: si especificas una fecha de inicio, los mensajes enviados antes de la fecha indicada no se incluyen en la respuesta.

  • end: si especificas una fecha de fin, los mensajes enviados después de la fecha indicada no se incluyen en la respuesta.

  • granularity: indica el nivel de detalle que quieres que tengan los análisis recuperados. Entre los valores posibles, están HALF_HOUR, DAY y MONTH.

En el caso de conversation_analytics, tienes nueve parámetros de filtración, tres de los cuales (start, end y granularity) son obligatorios.

Requisitos

Para este tutorial, tendrás que hacer lo siguiente:

  • Instalar Python y pip en tu máquina de desarrollo local.*

  • Registrarte para obtener una cuenta de desarrollador en Meta for Developers, crear una aplicación de tipo empresarial y añadir una cuenta de WhatsApp Business a la aplicación.

  • Llevar a cabo la configuración; para ello, en la página “Añade productos a tu aplicación”, haz clic en el botón Configurar de la opción WhatsApp.

Después de crear una aplicación de tipo WhatsApp Business, obtendrás un identificador de cuenta WABA y un identificador de acceso temporal. Necesitas estas dos claves para lo que queda de tutorial, así que no las olvides.

Puedes añadir tu número personal de WhatsApp como emisor o usar el número de teléfono de prueba proporcionado por WhatsApp.

Crear una aplicación de Python para visualizar datos

Configura un entorno de desarrollo de Python e instala los paquetes necesarios.

Crea una carpeta, asígnale un nombre y, a continuación, accede a ella mediante una herramienta de línea de comandos. En este blog, usaremos la biblioteca de solicitudes para realizar solicitudes HTTP y la popular biblioteca Matplotlib para crear visualizaciones estáticas, animadas e interactivas. Ejecuta el siguiente comando para instalarlas:

pip install requests matplotlib

Ahora podrás usar solicitudes de Python para hacer consultas a la API sobre datos de análisis de WhatsApp y, después, usar Matplotlib para visualizar las métricas mediante el trazado de un gráfico con los puntos de datos recibidos de la API.

Visualizar la cantidad de mensajes enviados al día

Para empezar, solicita los datos de análisis. Para ello, crea un archivo denominado sent.py en la carpeta de tu aplicación e importa las dependencias necesarias para esta tarea:

import datetime
import requests
import matplotlib.pyplot as plt

A continuación, crea la solicitud GET a la API para obtener los análisis mediante el identificador de la cuenta WABA y el identificador de acceso. Puedes consultar estos valores en el panel de tu cuenta de desarrollador en Meta for Developers. El código de la solicitud GET es el siguiente:

key = 'put-your-access-token-here'
waba_id = 'put-your-waba-id-here'

res = requests.get(f'https://graph.facebook.com/v14.0/{waba_id}?fields=analytics.start(1662174000).end(1662548446).granularity(DAY)&access_token={key}')

dict = res.json() 
print(dict)

En la solicitud anterior, representamos la fecha de inicio siguiendo el estilo UNIX, según los requisitos de la API. Puedes usar este conversor gratuito para hacer conversiones entre marcas de tiempo en lenguaje natural y UNIX. El código convierte la respuesta a formato JSON en la última línea y la imprime.

Ejecuta el siguiente comando para ejecutar el código:

python app.py

Si los números de teléfono vinculados a la cuenta WABA se usan para enviar mensajes durante el intervalo de tiempo especificado, obtenemos un objeto de diccionario de respuesta que tiene un aspecto similar al siguiente:

{
  "analytics": {
    "phone_numbers": [
      "16505550111",
      "16505550112",
      "16505550113"
    ],
    "country_codes": [
      "US",

    ],
    "granularity": "DAY",
    "data_points": [
      {
        "start": 1662174000,
        "end": 1662260400,
        "sent": 199251,
        "delivered": 183001
      },
      {
        "start": 1662260400,
        "end": 1662346800,
        "sent": 162489,
        "delivered": 141234
      },
      {
        "start": 1662346800,
        "end": 1662433200,
        "sent": 67902,
        "delivered": 53902
      },
      {
        "start": 1662433200,
        "end": 1662519600,
        "sent": 129521,
        "delivered": 117832
      }
    ]
  },
  "id": "952305634918047"
}

En este caso, la lista data_points incluye cuatro diccionarios. Cada uno de ellos contiene la cantidad de mensajes que enviaron y entregaron los números de WhatsApp vinculados durante el intervalo de fechas especificado.

Ahora que tienes los datos, debes recuperar la información necesaria. Como queremos visualizar la cantidad de mensajes enviados cada día, debemos obtener los valores de start y sent de cada diccionario.

Para ello, recorre en bucle los puntos de datos mediante el bucle for...in de Python. Convierte la fecha de inicio de estilo UNIX a una versión en lenguaje natural para cada objeto de datos. A continuación, obtén solo el día numérico del mes y añádelo a la lista de días. Almacena la cantidad de mensajes enviados en otra lista denominada no_of_msgs_sent:

days = []
no_of_msgs_sent = []

data_points = dict.get("analytics").get("data_points")

for point in data_points:
    
    # Get date in human readable format
    x = datetime.datetime.fromtimestamp(point.get('start'))
    
    # Get just the day in string format
    y = x.strftime("%d")
    
    days.append(y)
    
    # Add the number of sent messages to the list 
    no_of_msgs_sent.append(point.get('sent'))
    
print(days)
print(no_of_msgs_sent)

If you run the code, you get two lists:

['03', '04', '05', '06'] // days
[196093, 147649, 61988, 132465] // number of messages

Now that you have what you need, it's time to visualize it. Add the following code to app.py:

plt.plot(days, no_of_msgs_sent)

plt.title('Our Graph')
plt.xlabel('Days')
plt.ylabel('Number of messages sent')

plt.show()

Aquí, vas a trazar un gráfico básico con los días en el eje x y la cantidad de mensajes enviados en el eje y.

Guarda el archivo y ejecuta el código. Si usas Linux y recibes un error que indique lo siguiente:

UserWarning: Matplotlib is currently using agg, which is a non-GUI backend, so cannot show the figure.

Asegúrate de tener instalado el paquete tkinter. Si no lo tienes instalado, ejecuta el siguiente comando para instalarlo:

sudo apt-get install python3-tk

Si ejecutas el código, obtendrás un gráfico con un aspecto similar al siguiente:

A continuación, crearás un gráfico para visualizar la cantidad de mensajes entregados.

Visualizar información de un número de WhatsApp concreto

En la sección anterior, no se incluyeron números de teléfono en la solicitud. Como resultado, la API devolvió información de todos los números de teléfono vinculados a la cuenta WABA durante el periodo transcurrido entre las fechas de inicio y fin.

No obstante, si quieres recuperar datos de análisis de uno o varios números de teléfono, pero no de todos ellos, tienes que incluir los números de teléfono en una matriz y pasarla al método .phone_numbers al crear la solicitud:

res = requests.get(f'https://graph.facebook.com/v14.0/{waba_id}?fields=analytics.start(1662174000).end(1662548446).phone_numbers([16505550111, // others]).granularity(DAY)&access_token={key}')

El código restante de sent.py permanece igual. Únicamente obtendrás los análisis de los números de teléfono especificados cuando lo ejecutes.

Visualizar la cantidad de mensajes entregados al día

En las dos últimas secciones, trazamos un gráfico para visualizar la cantidad de mensajes que enviaron cada día los números de teléfono vinculados mediante WhatsApp. Ahora vamos a trazar un gráfico para visualizar la cantidad de mensajes entregados al día.

Crea un nuevo archivo y asígnale el nombre delivered.py. A continuación, copia el código de sent.py en delivered.py.

Después, haz algunos cambios en el código de delivered.py. En primer lugar, cambia el nombre de la variable de la parte superior de no_of_msgs_sent a no_of_msgs_del para reflejar el tipo de datos que vas a almacenar.

A continuación, en el bucle for...in, cambia el valor del método point.get de sent a delivered. A continuación se incluye un fragmento de código con el aspecto que deberías obtener después de hacer los cambios:

# Variables go here

for point in data_points:
    
    # Code for getting human readable date goes here    
    
    # Now add the number of delivered messages to the list  
    no_of_msgs_del.append(point.get('delivered'))

print(day)
print(no_of_msgs_del)

Finally, specify no_of_msgs_del in the plt.plot method and update the label shown on the y-axis:

plt.plot(days, no_of_msgs_del)

plt.title('Our Graph')
plt.xlabel('Days')
plt.ylabel('Number of messages delivered')

plt.show()

Una vez ejecutado el código en el terminal (con python delivered.py), obtendrás un gráfico como el siguiente.

Ahora que has representado dos conjuntos de datos de análisis de mensajes, vas a representar el coste de los mensajes mediante conversation_analytics.

Visualizar el coste de los mensajes enviados al día

Una vez más, crea un nuevo archivo para esta sección y asígnale el nombre cost.py. Copia el código de sent.py en cost.pyA continuación, haz algunas modificaciones.

Primero modifica el código de la solicitud. Como vas a obtener información sobre la conversación, establece el valor del parámetro fields en conversation_analytics y el de granularity en daily.

res = requests.get(f'https://graph.facebook.com/v14.0/{waba_id}?fields=conversation_analytics.start(1662174000).end(1662548446).granularity(DAILY).phone_numbers([])&access_token={key}')

Ten en cuenta que el campo conversation_anaytics admite varios parámetros de filtración diferentes para obtener otros tipos de información. Para obtener más información, consulta la documentación completa.

Tras realizar la solicitud anterior, deberías obtener un objeto de respuesta muy similar al siguiente:

{
  "conversation_analytics": {
    'data': {
        "data_points": [
          {
            "start": 1662174000,
            "end": 1662260400,
            "conversation": 5250,
            "cost": 45.0532
          },
          {
            "start": 1662260400,
            "end": 1662346800,
            "conversation": 2250,
            "cost": 25.0290
          },
          {
            "start": 1662346800,
            "end": 1662433200,
            "conversation": 800,
            "cost": 0.0000
          },
          {
            "start": 1662433200,
            "end": 1662519600,
            "conversation": 3150,
            "cost": 33.2015
          }
        ]
    }
  },
}

Como hemos visto antes, el parámetro data_points se incluye en el diccionario de datos. Cada punto de datos del diccionario tiene el coste y la cantidad de mensajes de una conversación.

A continuación, en cost.py, cambia la variable de la parte superior de no_of_msgs_del a cost_of_convo. En el bucle for...in, cambia el valor del método point.get de delivered a cost. A continuación se incluye un fragmento de código con el aspecto que deberías obtener después de hacer los cambios:

days = []
cost_of_convo = []

data_points = dict.get('conversation_analytics').get("data").get("data_points")

for point in data_points:
   
    x = datetime.datetime.fromtimestamp(point.get('start'))   
    y = x.strftime("%d")
    
    days.append(y)
    
    # Add the cost of messages in each data point
    cost_of_convo.append(point.get('cost'))

Now, to plot a graph visualizing it:

plt.plot(days, cost_of_convo)

plt.title('Our Graph')
plt.xlabel('Days')
plt.ylabel('Cost of messages sent')

plt.show()

Si ejecutas el código con el terminal (con python cost.py), obtendrás un gráfico como el siguiente:

Todo listo.

Para continuar avanzando, puedes seguir el mismo método para visualizar otras métricas que proporciona la API de administración de WhatsApp Business.

Conclusión

En este tutorial, usamos la biblioteca de visualización de datos Matplotlib para visualizar datos que muestran la cantidad de mensajes enviados al día, la cantidad de mensajes entregados al día y el coste de cada conversación de mensajes.

La API de administración de WhatsApp Business te ofrece estos parámetros de filtración y muchos más, los cuales puedes usar para especificar las métricas que quieras en cada solicitud. Para obtener más información, consulta la documentación completa de la API.

Como desarrollador, la API de administración de WhatsApp Business te proporciona información y métricas pertinentes de la cuenta de WhatsApp de tus usuarios. Por ejemplo, puedes mostrar a los usuarios la cantidad de mensajes de WhatsApp que enviaron en un día en concreto en su panel.

Las posibilidades son infinitas.

* Meta no se puede responsabilizar de ninguna aplicación de terceros.