Volver a las novedades para desarrolladores

Cómo visualizar métricas de la cuenta de WhatsApp en tu app

19 de diciembre de 2022DeRashed Talukder

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

  • Estadísticas de mensajes: la cantidad de mensajes enviados y entregados por los números de teléfono asociados a una WABA específica durante un período determinado.
  • Estadísticas de conversaciones: información sobre la conversación y los costos de los mensajes enviados durante un período determinado.

Cuando consultas el punto de conexión de la API, se te solicita que especifiques si quieres ver estadísticas de mensajes o de conversaciones. Para ello, debes agregar analytics o conversation_analytics como parámetro de la URL.

Por ejemplo, si quieres ver estadísticas de mensajes de tu cuenta, debes hacer la siguiente solicitud:

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

En este ejemplo, especificamos que queremos recuperar estadísticas de mensajes de los números de teléfono vinculados con la WABA que tiene un identificador de WABA único. Aprenderás a obtener tu identificador de WABA y el token de acceso en la sección Requisitos que aparece a continuación.

Además, cuando realizas una solicitud, puedes aplicar parámetros de filtrado para acotar el resultado. El punto de conexión de la API de administración de WhatsApp Business admite seis parámetros de filtrado en total. Debes contar con los siguientes:

  • start: si especificas una fecha de inicio, la respuesta no incluye los mensajes enviados antes de esa fecha.

  • end: si especificas una fecha de finalización, la respuesta no incluye los mensajes enviados después de esa fecha.

  • granularity: ¿qué granularidad quieres que tenga la estadística? Los valores posibles incluyen HALF_HOUR, DAY y MONTH.

En cuanto a conversation_analytics, puedes usar nueve parámetros de filtrado, de los cuales tres, start, end y granularity, son obligatorios.

Requisitos

En este tutorial, necesitarás lo siguiente:

  • Instala Python y pip en tu equipo de desarrollador local.*

  • Regístrate para obtener una cuenta de desarrollador en Meta for Developers, crea una app de negocios y agrega una cuenta de WhatsApp Business a la app.

  • Configuración: en la página "Agrega productos a tu app", haz clic en el botón Configurar en la opción WhatsApp.

Después de crear una app de negocios, obtendrás un identificador de WABA y un token de acceso temporal. Necesitarás estas dos claves en el resto de este tutorial, por lo que te recomendamos tenerlas a mano.

Puedes agregar tu número de WhatsApp personal como remitente o usar el número de teléfono proporcionado por WhatsApp.

Crear una app de Python para visualizar datos

Configura un entorno de desarrollo de Python y, luego, instala los paquetes necesarios.

Crea una carpeta, asígnale un nombre y navega hacia la carpeta mediante la herramienta de línea de comandos. En el caso de este blog, usaremos la biblioteca de solicitudes para realizar solicitudes HTTP y la conocida biblioteca Matplotlib para crear visualizaciones estáticas, interactivas y animadas. Ejecuta el siguiente comando para instalarlas:

pip install requests matplotlib

Ahora, podrás usar solicitudes de Python para consultar la API en busca de datos de estadísticas de WhatsApp y usar Matplotlib para visualizar las métricas mediante la creación de un gráfico con los puntos de datos recibidos de la API.

Visualizar la cantidad de mensajes enviados por día

Primero, solicita datos de estadísticas. Para ello, crea un archivo con el nombre sent.py en tu carpeta de aplicaciones e importa las dependencias obligatorias de esta tarea:

import datetime
import requests
import matplotlib.pyplot as plt

Luego, crea la solicitud GET de la API para ver las estadísticas usando tu identificador de WABA y el token de acceso. Puedes ver estos valores en el panel de tu cuenta de desarrollador en Meta for Developers. El código de la solicitud GET tiene el siguiente aspecto:

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 con estilo UNIX, tal como lo requiere la API. Puedes usar este conversor gratuito para convertir marcas de tiempo de formato legible a UNIX. El código convierte la respuesta a formato JSON en la última línea y la imprime.

Usa el siguiente comando para ejecutar el código:

python app.py

Si los números de teléfono vinculados con la WABA se usan para enviar mensajes en el período especificado, recibimos 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 contiene cuatro diccionarios. Cada uno contiene la cantidad de mensajes que los números de WhatsApp vinculados enviaron y entregaron 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 start y sent de cada diccionario.

Para ello, reproduce en bucle los puntos de datos con el bucle for...in de Python. Convierte la fecha de inicio con estilo UNIX a una versión legible en cada objeto de datos. Luego, obtén solo el día numérico del mes y agrégalo a la lista de días. Almacena el número de mensajes enviados en otra lista llamada 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í, crearás 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 estás usando Linux y ves otro error que dice lo siguiente:

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

Asegúrate de tener el paquete tkinter instalado. De lo contrario, ejecuta el siguiente comando para instalarlo:

sudo apt-get install python3-tk

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

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

Visualizar información de un número de WhatsApp específico

En la sección anterior, no incluimos los 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 WABA dentro de las fechas de inicio y finalización especificadas.

Sin embargo, si quieres recuperar datos de estadísticas de uno o varios números de teléfono, pero no todos, debes colocar los números de teléfono en una matriz y pasarla al método .phone_numbers cuando creas 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 resto del código de sent.py permanece sin modificaciones. Solo verás estadísticas de los números de teléfono especificados cuando lo ejecutes.

Visualizar la cantidad de mensajes entregados por día

En las últimas dos secciones, creamos un gráfico para visualizar la cantidad de mensajes enviados por día por los números de teléfono vinculados mediante WhatsApp. Ahora, vamos a crear un gráfico para visualizar la cantidad de mensajes entregados diariamente.

Crea un archivo nuevo y asígnale el nombre delivered.py. Luego, copia el código de sent.py a delivered.py.

A continuación, realiza algunos cambios en el código de delivered.py. Primero, cambia el nombre de la variable en la parte superior de no_of_msgs_sent a no_of_msgs_del para reflejar el tipo de datos que estás almacenando.

Luego, en el bucle for...in , cambia el valor del método point.get de sent a delivered. Aquí, puedes ver un fragmento de cómo debería verse tu código 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 que ejecutes el código en tu terminal (con python delivered.py), verás un gráfico como el que aparece a continuación.

Ahora que representaste dos conjuntos de datos de estadísticas de mensajes, representarás el costo de los mensajes mediante conversation_analytics.

Visualizar el costo de los mensajes enviados por día

De nuevo, crea un archivo nuevo para esta sección y asígnale el nombre cost.py. Copia el código de sent.py a cost.py. Ahora, realicemos algunas modificaciones.

Primero, modifica el código de solicitud. Como estás recibiendo la información de la conversación, configura el parámetro fields en conversation_analytics y ajusta el valor 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 otros parámetros de filtrado para obtener otros tipos de información. Para conocer más, lee la documentación completa.

Después de realizar la solicitud anterior, deberías obtener un objeto de respuesta 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 vimos más arriba, los valores de data_points se encuentran dentro de los diccionarios de datos. Cada punto de datos del diccionario tiene un importe y un costo de conversación.

Luego, 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. Aquí, puedes ver un fragmento de cómo debería verse tu código 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 la terminal (con python cost.py), verás un gráfico como el siguiente:

¡Eso es todo!

Si quieres avanzar con el tema, puedes seguir el mismo método para ver 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 por día, la cantidad de mensajes entregados por día y el costo de cada conversación con mensajes.

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

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

Las posibilidades son infinitas.

*Meta no se hace responsable por ninguna app de terceros.