返回开发者新闻

如何在应用中可视化 WhatsApp 帐户指标

2022年12月19日发布者:Rashed Talukder

通过使用 WhatsApp Business 管理 API,您能够访问有关 WhatsApp Business 商业帐号 (WABA) 的指标和分析数据。您可以取得关于帐户的两类数据:

  • 消息分析数据:在指定时段内,由与特定 WABA 关联的电话号码所发送和送达的消息数量。
  • 对话分析数据:在指定时段内,已发送消息的对话和成本信息。

查询 API 端点时,您需要添加 analytics conversation_analytics 作为网址参数,以指定要取得消息还是对话的分析数据。

例如,以下请求示例显示了如何取得帐户相关的消息分析数据:

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

在此示例中,我们指定要检索与具有唯一 WABA 编号的 WABA 相关联的电话号码的消息分析数据。随后的“要求”部分将进一步介绍如何获取 WABA 编号和访问口令。

此外,在提出请求时,您可以应用筛选参数来细化结果。WhatsApp Business 管理 API 端点共支持六个筛选参数。您必须采用以下参数:

  • start:如果您指定开始日期,则响应不包括在指定日期之前发送的消息。

  • end:如果您指定结束日期,则响应不包括在指定日期之后发送的消息。

  • granularity:您希望以何种精确程度检索分析数据?可能的值包括 HALF_HOUR、DAY 和 MONTH。

对于 conversation_analytics,您可以应用九个筛选参数,其中 startendgranularity 这三个为必要参数。

要求

在本教程中,您将需要:

  • 在本地开发机上安装 Python 和 pip。*

  • 在 Meta 开发者上注册开发者帐户、创建业务类应用,并将 WhatsApp Business 商业帐号添加至该应用。

  • 设置—在“为应用添加产品”页面上,点击 WhatsApp 选项上的设置按钮。

创建 WhatsApp 业务类应用后,您会获得 WABA 编号和临时访问口令。在本教程的余下部分,您会需要用到这两者,因此请妥善保管。

您可以新增个人 WhatsApp 号码作为发件人,也可使用 WhatsApp 提供的测试电话号码。

创建 Python 应用以可视化数据

请设置 Python 开发环境,并安装所需的包。

创建文件夹并为其命名,然后使用命令行工具前往该文件夹。在本博客中,我们会使用请求库来发起 HTTP 请求,并使用热门的 Matplotlib 库来建立静态、动画和可互动的可视化图表。运行以下命令以进行安装:

pip install requests matplotlib

现在,您可使用 Python 请求查询 API,以从 WhatsApp 取得分析数据,然后使用 Matplotlib 将从 API 接收的数据点绘制成图表,以可视化指标。

可视化每天发送的消息数量

首先,请求获取分析数据。为此,请在应用文件夹中创建名为 sent.py 的文件,然后导入此任务所需的依赖项:

import datetime
import requests
import matplotlib.pyplot as plt

接着,创建 API GET 请求,以使用您的 WABA 编号和访问口令获取分析数据。您可在 Meta 开发者的开发者帐户面板找到这些值。 GET 请求的代码如下所示:

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)

在上方的请求中,我们根据 API 的要求以 UNIX 样式表示开始日期。您可以使用这款免费转换工具来转换人类可读时间戳与 UNIX 时间戳。代码在最后一行将响应转换为 JSON 格式并输出响应。

执行以下命令以运行代码:

python app.py

如果在指定时间范围内使用了与 WABA 相关联的电话号码发送消息,我们会得到响应字典 (dictionary) 对象,如下所示:

{
  "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"
}

在此情况下, data_points 清单包含四个字典,其中每个都包含已关联 WhatsApp 电话号码在指定日期范围内发送和送达的消息数量。

现在您已取得数据,因此必须检索必要信息。我们的目标是可视化每天的已发送消息数量,因此我们必须从每个字典中获取 start sent 值。

为此,请使用 Python for...in 循环来浏览所有数据点。将每个数据对象的开始时间从 UNIX 样式转换为人类可读的版本。然后,仅获取月份中的数字日期并将其加到日期清单。将已发送消息的数量存储在另一个名为 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()

在此,您会绘制一个基本图表,其中 x 轴为天数,y 轴为已发送消息的数量。

保存文件并运行代码。如果您使用的是 Linux,并收到以下错误消息:

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

请确认您已安装 tkinter。如果尚未安装,请运行以下命令进行安装:

sudo apt-get install python3-tk

运行代码后,您会得到如下所示的图表:

接下来,您需要创建图表来可视化已送达消息的数量。

可视化特定 WhatsApp 电话号码的信息

在上一部分,我们没有在请求中加入电话号码。因此,API 返回了指定开始日期和结束日期内与 WABA 相关联的所有电话号码的信息。

不过,如要检索一个或多个电话号码的分析数据,而不是所有电话号码,则需要将电话号码放在数组中,并在创建请求时将其传送给 .phone_numbers 方法:

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}')

sent.py 中的余下代码保持不变。运行代码时,您只会得到指定电话号码的分析数据。

可视化每天的已送达消息数量

在前面两个部分,我们绘制了一张图表,以可视化已关联的电话号码每天通过 WhatsApp 发送的消息数量。接下来,让我们绘制图表来可视化每天的已送达消息数量。

新建文件并将其命名为 delivered.py。接着,将 sent.py 中的代码复制至 delivered.py

然后,对 delivered.py 中的代码作出一些变更。首先,将顶部的变量从 no_of_msgs_sent 重新命名为 no_of_msgs_del ,以反映您要存储的数据类型。

接着,在 for...in 循环中,将 point.get 方法中的值从 sent 变更为 delivered。以下代码片段展示了代码变更后的情况:

# 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()

在终端上运行代码(使用 python delivered.py)后,您会得到如下所示的图表。

现在您已用图表形式呈现两组消息分析数据,接下来使用 conversation_analytics 呈现消息的成本。

可视化每天已发送消息的成本

再次为此部分新建文件,并将其命名为 cost.py。将 sent.py 中的代码复制至 cost.py。接下来,我们会作出一些修改。

首先,修改请求代码。由于您要获取对话信息,因此请将 fields 参数设为 conversation_analytics ,并将 granularity 设为 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}')

请注意, conversation_anaytics 字段支持其他几个筛选参数以获取其他类型的信息。详情请参阅完整文档

发起上述请求后,您应该会收到一个非常类似于以下内容的响应对象:

{
  "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
          }
        ]
    }
  },
}

如上所示, data_points 位于数据字典内。字典中的每个数据点都拥有对话数量和成本。

接着,在 cost.py 中,将顶部的变量从 no_of_msgs_del 变更为 cost_of_convo。在 for...in 循环中,将 point.get 方法中的值从 delivered 变更为 cost。以下代码片段展示了代码变更后的情况:

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()

使用终端运行代码(使用 python cost.py)后,您会得到如下所示的图表:

现在就可以了!

除上述操作以外,您亦可按照相同的方法可视化 WhatsApp Business 管理 API 提供的其他指标。

结论

在本教程中,我们使用 matplotlib 数据可视化库来制作图表,以可视化每天的已发送消息数量、每天的已送达消息数量,以及各个消息对话的成本。

WhatsApp Business 管理 API 为您提供了本文所述的筛选参数和其他更多参数,供您用来在每个请求中指定您想要的指标。详情请参阅完整 API 文档

作为开发者,WhatsApp Business 管理 API 为您提供来自用户 WhatsApp 帐户的相关信息和指标。举例来说,您可以在用户的面板上显示他们在指定日期发送的 WhatsApp 消息数量。

还有其他无限可能性等您来探索!

*Meta 不对任何第三方应用负责。