返回開發人員最新消息

How to Visualize WhatsApp Account Metrics in Your App

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

WhatsApp Business 管理 API 讓您能夠存取有關 WhatsApp Business 帳戶 (WABA) 的衡量數據和分析資料。您可以取得關於帳戶的兩種資料:

  • 訊息分析資料:在指定時段內,由特定 WhatsApp Business 帳戶關聯的手機號碼所傳送和送達的訊息數量。
  • 對話分析資料:在指定時段內,已傳送訊息的對話和成本資訊。

查詢 API 端點時,您需要新增 analytics conversation_analytics 為網址參數,以指定要取得訊息還是對話的分析資料。

例如,下方範例要求顯示如何取得帳戶相關的訊息分析資料:

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

在此範例中,我們指定了要檢索訊息分析資料,這則資料與連結到 WhatsApp Business 帳戶(具有不重複 WhatsApp Business 帳戶編號)之手機號碼相關。隨後的「要求」部分將進一步介紹如何獲取 WhatsApp Business 帳戶編號和存取憑證。

此外,在提出要求時,您可以套用篩選參數來精簡結果。WhatsApp Business 管理 API 端點一共支援六個篩選參數。您必須採用以下參數:

  • start:如果您指定開始日期,則回應不包括在指定日期之前傳送的訊息。

  • end:如果您指定結束日期,則回應不包括在指定日期之後傳送的訊息。

  • granularity:您希望檢索到的分析資料有多精確?可能的值包括 HALF_HOUR、DAY 和 MONTH。

如果是 conversation_analytics,您可以套用九個篩選參數,其中三個參數 startendgranularity 為必要參數。

必要條件

在本教學導覽中,您將需要:

  • 在本機開發人員機器上安裝 Python 和 pip。*

  • 在 Meta for Developers 上註冊開發人員帳戶、建立一個商業類型應用程式,並將 WhatsApp Business 帳戶新增至該應用程式。

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

建立 WhatsApp Business 類型應用程式後,您會取得 WhatsApp Business 帳戶編號和臨時存取憑證。在本教學導覽的餘下部分,您會需要用到這兩個密鑰,因此請保管好它們。

您可以新增個人 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 要求,以使用您的 WhatsApp Business 帳戶編號和存取憑證取得分析資料。您可在 Meta for Developers 的開發人員帳戶管理中心找到這些值。 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

如果連結到 WhatsApp Business 帳戶的手機號碼用於在指定時間範圍內傳送訊息,我們會得到一個回應字典物件,如下所示:

{
  "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 傳回了指定開始日期和結束日期內連結到 WhatsApp Business 帳戶的所有手機號碼之資訊。

不過,如要檢索一個或多個手機號碼的分析資料,而不是所有手機號碼,則需要將手機號碼放在一個陣列中,並在建立要求時將其傳遞給 .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 不對任何第三方應用程式負責。