返回開發人員最新消息

How to Visualize WhatsApp Account Metrics in Your App

2022年12月19日發佈者:Rashed Talukder

WhatsApp Business Management 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 編號和存取權杖。

此外,在發出要求時,您也可以套用篩選參數來精簡結果。Business Management API 端點總共可支援六個篩選參數。您必須提供下列參數:

  • start:如果指定開始日期,則回應不包含給定日期之前發送的訊息。

  • end:如果指定結束日期,則回應不包含給定日期之後發送的訊息。

  • granularity:您希望所擷取的分析資料多精細?可能的值包括 HALF_HOUR、DAY 和 MONTH。

至於 conversation_analytics,您有九個篩選參數,其中三個 — startendgranularity — 是必要參數。

必備條件

就此教學導覽而言,您需要:

  • 在本端開發電腦上安裝 Python 和 pip*。

  • 在 Meta for Developers 上註冊開發人員帳號、建立商業類型應用程式,並將 WhatsApp Business 帳號加入該應用程式。

  • 設定:在「新增產品到應用程式」頁面上,點擊 WhatsApp 選項上的設定按鈕。

建立 WhatsApp 商業類型應用程式後,您會取得 WABA 編號和暫時存取權杖。您在此教學導覽的其餘部分會需要這兩個密鑰,請妥善保存。

您可以加入個人的 WhatsApp 號碼做為傳送者,也可以使用 WhatsApp 提供的測試電話號碼。

建立 Python 應用程式以將資料視覺化

設定 Python 開發環境,並安裝必要的套件。

建立資料夾並為其命名,然後使用命令列工具導覽至該資料夾。在此部落格中,我們會使用 requests 資料庫來發出 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 for Developer 的開發人員帳號主控板上找到這些值。 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 的電話號碼在指定的時間範圍內發送訊息,我們會取得如下所示的回應字典物件:

{
  "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 號碼在指定日期範圍內發送和送達的訊息數量。

現在您已經有了資料,接下來您必須擷取所需的資訊。由於我們想要將每天發送的訊息數量視覺化,因此必須從每個字典取得 startsent 值。

為此,請使用 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 Management API 提供的其他衡量指標視覺化。

結論

在此教學導覽中,我們使用了 matplotlib 資料視覺化資料庫來將資料視覺化,以顯示每天發送的訊息數量、每天送達的訊息數量,以及每個訊息對話的成本。

WhatsApp Business Management API 為您提供這些篩選參數和許多功能,可讓您在每個要求中用來指定想要的衡量指標。若要進一步瞭解,請參閱完整 API 說明文件

做為開發人員,WhatsApp Business Management API 可為您提供用戶 WhatsApp 帳號的相關資訊和衡量指標。例如,您可以在用戶的主控板上為用戶顯示他們在指定日期發送的 WhatsApp 訊息數量。

可能性永無止境!

*Meta 無法為任何第三方應用程式負責。