Quay lại phần Tin tức dành cho nhà phát triển

Cách trực quan hóa số liệu về tài khoản WhatsApp trong ứng dụng của bạn

19 tháng 12, 2022Tác giảRashed Talukder

Thông qua API Quản lý kinh doanh của WhatsApp, bạn có thể truy cập vào số liệu và dữ liệu phân tích về Tài khoản WhatsApp Business (WABA) của mình. Bạn có thể lấy 2 loại dữ liệu về tài khoản mình sở hữu:

  • Dữ liệu phân tích tin nhắn: Số lượng tin nhắn được gửi và phân phối qua số điện thoại liên kết với một WABA cụ thể trong khoảng thời gian nhất định.
  • Dữ liệu phân tích cuộc trò chuyện: Thông tin về cuộc trò chuyện và chi phí cho những tin nhắn được gửi trong khoảng thời gian nhất định.

Khi truy vấn điểm cuối API này, bạn cần phải chỉ định xem mình muốn lấy dữ liệu phân tích tin nhắn hay cuộc trò chuyện bằng cách thêm analytics hoặc conversation_analytics làm thông số cho URL.

Ví dụ: sau đây là yêu cầu mẫu nếu bạn muốn lấy dữ liệu phân tích tin nhắn về tài khoản của mình:

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

Trong mẫu này, chúng tôi đã chỉ định rằng mình muốn truy xuất dữ liệu phân tích tin nhắn cho những số điện thoại liên kết với WABA có ID WABA riêng biệt. Bạn sẽ tìm hiểu thêm về việc lấy ID WABA và mã truy cập trong phần Yêu cầu dưới đây.

Ngoài ra, khi gửi yêu cầu, bạn có thể áp dụng các thông số lọc để tinh chỉnh kết quả. Điểm cuối API Quản lý kinh doanh hỗ trợ tổng cộng 6 thông số lọc. Bạn phải có những thông số sau đây:

  • start: Nếu bạn chỉ định ngày bắt đầu, phản hồi sẽ không bao gồm tin nhắn được gửi trước ngày cụ thể đó.

  • end: Nếu bạn chỉ định ngày kết thúc, phản hồi sẽ không bao gồm tin nhắn được gửi sau ngày cụ thể đó.

  • granularity: Bạn muốn dữ liệu phân tích được truy xuất chi tiết đến mức nào? Giá trị có thể dùng bao gồm HALF_HOUR, DAY và MONTH.

Đối với conversation_analytics, bạn có 9 thông số lọc, trong đó start, endgranularity là 3 thông số bắt buộc.

Yêu cầu

Đối với hướng dẫn này, bạn sẽ cần:

Sau khi tạo một Ứng dụng thuộc loại WhatsApp Business, bạn sẽ nhận được ID WABA và mã truy cập tạm thời. Hãy giữ 2 khóa nêu trên vì bạn sẽ cần chúng trong phần còn lại của hướng dẫn này.

Bạn có thể thêm số WhatsApp cá nhân làm người gửi hoặc sử dụng số điện thoại thử nghiệm mà WhatsApp cung cấp.

Tạo ứng dụng Python để trực quan hóa dữ liệu

Thiết lập môi trường phát triển Python và cài đặt các gói bắt buộc.

Tạo và đặt tên cho một thư mục, sau đó chuyển đến thư mục này bằng công cụ dòng lệnh. Đối với blog này, chúng tôi sẽ sử dụng thư viện yêu cầu để gửi yêu cầu HTTP cùng thư viện Matplotlib phổ biến để tạo hình ảnh tĩnh, động và tương tác. Chạy lệnh sau đây để cài đặt những thư viện nêu trên:

pip install requests matplotlib

Lúc này, bạn sẽ có thể sử dụng yêu cầu Python để truy vấn API nhằm lấy dữ liệu phân tích từ WhatsApp, sau đó dùng thư viện Matplotlib để trực quan hóa số liệu bằng cách vẽ biểu đồ dựa trên những điểm dữ liệu nhận được từ API.

Trực quan hóa số lượng tin nhắn được gửi mỗi ngày

Bắt đầu bằng cách yêu cầu dữ liệu phân tích. Để làm việc đó, hãy tạo một file có tên là sent.py trong thư mục ứng dụng rồi nhập những phần phụ thuộc cần thiết cho nhiệm vụ này:

import datetime
import requests
import matplotlib.pyplot as plt

Tiếp theo, gửi yêu cầu GET đến API để lấy dữ liệu phân tích bằng ID WABA và mã truy cập của bạn. Bạn có thể tìm thấy những giá trị này trên bảng điều khiển của tài khoản nhà phát triển mà mình sở hữu trên Meta for Developers. Mã cho yêu cầu GET sẽ có dạng như sau:

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)

Trong yêu cầu ở trên, chúng tôi biểu diễn ngày bắt đầu theo kiểu UNIX như API yêu cầu. Bạn có thể sử dụng công cụ chuyển đổi miễn phí này để chuyển đổi giữa nhãn thời gian UNIX và nhãn thời gian con người đọc được. Mã này sẽ chuyển đổi phản hồi sang định dạng JSON trên dòng cuối cùng rồi in phản hồi.

Thực thi lệnh sau đây để chạy mã:

python app.py

Nếu những số điện thoại liên kết với WABA được dùng để gửi tin nhắn trong khung thời gian đã chỉ định, chúng tôi sẽ lấy đối tượng từ điển phản hồi có dạng như sau:

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

Trong trường hợp này, danh sách data_points chứa 4 từ điển. Mỗi thư mục chứa số lượng tin nhắn mà các số WhatsApp được liên kết đã gửi và phân phối trong khoảng ngày đã chỉ định.

Bây giờ, khi đã có dữ liệu, bạn phải truy xuất thông tin cần thiết. Vì muốn trực quan hóa số lượng tin nhắn được gửi mỗi ngày, chúng tôi phải lấy các giá trị startsent trong mỗi từ điển.

Để làm việc đó, hãy lặp qua các điểm dữ liệu bằng vòng lặp for...in của Python. Chuyển đổi thời gian bắt đầu của mỗi đối tượng dữ liệu từ kiểu UNIX sang phiên bản con người đọc được. Sau đó, chỉ lấy ngày dạng số trong tháng rồi thêm ngày đó vào danh sách ngày. Lưu trữ số lượng tin nhắn đã gửi trong một danh sách khác có tên là 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()

Ở đây, bạn đang vẽ một đồ thị cơ bản với các ngày dọc theo trục x và số lượng tin nhắn đã gửi dọc theo trục y.

Lưu file rồi chạy mã của bạn. Nếu bạn đang dùng Linux và gặp lỗi như sau:

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

Hãy đảm bảo rằng bạn đã cài đặt tkinter. Nếu bạn chưa cài đặt, hãy chạy lệnh sau đây để cài đặt thư viện này:

sudo apt-get install python3-tk

Nếu chạy mã, bạn sẽ nhận được một đồ thị có dạng như sau:

Tiếp theo, bạn sẽ tạo một đồ thị để trực quan hóa số lượng tin nhắn đã phân phối.

Trực quan hóa thông tin cho một số WhatsApp cụ thể

Ở phần trước, chúng tôi không thêm số điện thoại vào yêu cầu. Do đó, API trả về thông tin cho tất cả những số điện thoại liên kết với WABA trong khoảng ngày bắt đầu và ngày kết thúc đã chỉ định.

Tuy nhiên, nếu muốn truy xuất dữ liệu phân tích cho một hoặc nhiều số điện thoại chứ không phải tất cả, bạn cần đưa những số điện thoại đó vào một mảng rồi chuyển mảng này vào phương thức .phone_numbers khi tạo yêu cầu:

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

Mã còn lại trong sent.py vẫn giữ nguyên. Bạn chỉ nhận được dữ liệu phân tích cho những số điện thoại đã chỉ định khi thực thi mã đó.

Trực quan hóa số lượng tin nhắn được phân phối mỗi ngày

Ở 2 phần trước, chúng tôi đã vẽ một đồ thị để trực quan hóa số lượng tin nhắn được gửi mỗi ngày bằng những số điện thoại được liên kết qua WhatsApp. Bây giờ, hãy vẽ một đồ thị để trực quan hóa số lượng tin nhắn được phân phối mỗi ngày.

Tạo một file mới rồi đặt tên cho file đó là delivered.py. Tiếp theo, sao chép mã từ sent.py vào delivered.py.

Sau đó, thay đổi mã một chút trong delivered.py. Trước tiên, đổi tên cho biến ở trên cùng từ no_of_msgs_sent thành no_of_msgs_del để phản ánh loại dữ liệu bạn đang lưu trữ.

Tiếp theo, trong vòng lặp for...in , hãy thay đổi giá trị trong phương thức point.get từ sent thành delivered. Đoạn mã của bạn sẽ có dạng như dưới đây sau khi bạn thay đổi:

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

Sau khi chạy mã trên cửa sổ dòng lệnh (bằng delivered.py của python), bạn sẽ nhận được một đồ thị có dạng như sau.

Bây giờ, khi đã biểu diễn 2 tập hợp dữ liệu phân tích tin nhắn, tiếp theo, bạn sẽ biểu diễn chi phí của tin nhắn bằng conversation_analytics.

Trực quan hóa chi phí của tin nhắn được gửi mỗi ngày

Một lần nữa, hãy tạo một file mới cho phần này rồi đặt tên cho file đó là cost.py. Sao chép mã từ sent.py vào cost.py. Bây giờ, hãy sửa đổi một chút.

Trước tiên, hãy sửa đổi mã yêu cầu. Do bạn sẽ lấy thông tin về cuộc trò chuyện, hãy đặt thông số fields thành conversation_analytics rồi đặt granularity thành 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}')

Lưu ý rằng trường conversation_anaytics hỗ trợ một vài thông số lọc khác để lấy các loại thông tin khác. Để tìm hiểu thêm, hãy đọc toàn bộ tài liệu.

Sau khi gửi yêu cầu ở trên, bạn sẽ nhận được một đối tượng phản hồi tương tự như sau:

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

Như bạn thấy ở trên, data_points nằm trong từ điển dữ liệu. Mỗi điểm dữ liệu trong từ điển có số lượng và chi phí của cuộc trò chuyện.

Tiếp theo, trong cost.py, hãy thay đổi biến ở trên cùng từ no_of_msgs_del thành cost_of_convo. Trong vòng lặp for...in , hãy thay đổi giá trị trong phương thức point.get từ delivered thành cost. Đoạn mã của bạn sẽ có dạng như dưới đây sau khi bạn thay đổi:

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

Nếu chạy mã trên cửa sổ dòng lệnh (bằng cost.py của python), bạn sẽ nhận được một đồ thị có dạng như sau:

Vậy là xong!

Để hiểu rõ hơn, bạn có thể làm theo phương pháp tương tự để trực quan hóa các số liệu khác mà API Quản lý kinh doanh của WhatsApp cung cấp.

Kết luận

Trong hướng dẫn này, chúng tôi sử dụng thư viện trực quan hóa dữ liệu có tên là matplotlib để trực quan hóa dữ liệu cho biết số lượng tin nhắn được gửi mỗi ngày, số lượng tin nhắn được phân phối mỗi ngày, cũng như chi phí của mỗi cuộc trò chuyện qua tin nhắn.

API Quản lý kinh doanh của WhatsApp cung cấp cho bạn các thông số lọc nêu trên cùng nhiều thông số khác mà bạn có thể dùng để chỉ định những số liệu mình muốn nhận được trong mỗi yêu cầu. Để tìm hiểu thêm, hãy xem toàn bộ tài liệu về API.

Với vai trò nhà phát triển, API Quản lý kinh doanh của WhatsApp cung cấp cho bạn những thông tin và số liệu phù hợp từ tài khoản WhatsApp của người dùng. Ví dụ: bạn có thể cho người dùng thấy số lượng tin nhắn WhatsApp mà họ đã gửi trong một ngày cụ thể trên bảng điều khiển.

Bạn có vô số lựa chọn!

*Meta không chịu trách nhiệm về bất kỳ ứng dụng nào của bên thứ ba.