개발자 소식으로 돌아가기

앱에서 WhatsApp 계정 지표를 시각화하는 방법

2022년 12월 19일제작:Rashed Talukder

WhatsApp의 Business Management API를 사용하면 WhatsApp Business 계정(WABA)에 대한 지표와 분석에 액세스할 수 있습니다. 계정에 대해 다음 두 가지 유형의 데이터를 가져올 수 있습니다.

  • 메시지에 대한 분석: 지정된 기간에 특정 WABA와 연결된 전화번호에서 전송 및 전달한 메시지의 수
  • 대화에 대한 분석: 지정된 기간에 전송된 메시지에 대한 대화 및 비용 정보

API 엔드포인트에 쿼리할 때는 analytics 또는 conversation_analytics 를 URL에 대한 매개변수로 추가하여 메시지에 대한 분석을 원하는지 대화에 대한 분석을 원하는지 지정해야 합니다.

예를 들어 계정에 대한 메시지 분석을 가져오기를 원할 경우의 요청 샘플은 다음과 같습니다.

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

이 샘플에서는 고유한 WABA ID가 있는 WABA에 연결된 전화번호에 대한 메시지 분석을 검색하기를 원한다고 지정했습니다. 그 뒤에 이어지는 요구 사항 섹션에서 WABA ID 및 액세스 토큰을 가져오는 방법에 대해 자세히 알아볼 것입니다.

또한 요청을 보낼 때 필터링 매개변수를 적용하여 결과를 세분화할 수 있습니다. Business Management API 엔드포인트는 총 6개의 필터링 매개변수를 지원합니다. 다음 매개변수는 필수입니다.

  • start: 시작 날짜를 지정하면, 지정된 날짜 이전에 전송된 메시지는 응답에 포함되지 않습니다.

  • end: 종료 날짜를 지정하면, 지정된 날짜 이후에 전송된 메시지는 응답에 포함되지 않습니다.

  • granularity: 가져온 분석의 세분화 수준입니다. 가능한 값에는 HALF_HOUR, DAY, MONTH가 포함됩니다.

  conversation_analytics의 경우 9개의 필터링 매개변수가 있습니다. 그중에서 start, end, granularity 는 필수 항목입니다.

요구 사항

이 튜토리얼에서는 다음을 미리 수행해야 합니다.

  • 로컬 개발 컴퓨터에 Python과 pip를 설치합니다.*

  • Meta for Developers에서 개발자 계정에 가입하고 비즈니스 유형 앱을 만든 다음, WhatsApp Business 계정을 앱에 추가합니다.

  • 설정 - 앱에 제품 추가 페이지에서 WhatsApp 옵션의 설정 버튼을 클릭합니다.

WhatsApp Business 유형 앱을 만들고 나면 WABA ID와 임시 액세스 토큰을 얻게 됩니다. 나머지 튜토리얼을 진행하는 동안 이 두 가지 키가 필요하므로 잊지 말고 기억하세요.

개인 WhatsApp 번호를 보내는 사람으로 추가하거나 WhatsApp에서 제공한 테스트 전화번호를 사용할 수 있습니다.

데이터를 시각화하기 위한 Python 앱 만들기

Python 개발 환경을 설정하고 필수 패키지를 설치합니다.

폴더를 만들고 이름을 지정한 다음, 명령줄 도구를 사용하여 해당 폴더로 이동합니다. 이 블로그에서는 HTTP 요청을 보내는 데는 요청 라이브러리를 사용하고, 고정 시각화, 애니메이션 시각화 및 인터랙티브 시각화에는 일반적으로 사용하는 Matplotlib 라이브러리를 사용할 것입니다. 다음 명령을 실행하여 라이브러리를 설치합니다.

pip install requests matplotlib

이제 Python 요청을 사용하여 WhatsApp으로부터 분석 데이터를 얻기 위해 API에 쿼리한 다음, Matplotlib을 사용하여 API로부터 받은 데이터 포인트로 그래프를 그려서 지표를 시각화할 수 있습니다.

하루에 전송된 메시지 수 시각화

분석 데이터를 요청하는 것으로 시작합니다. 이를 위해서는 sent.py 라는 이름의 파일을 앱 폴더에 만들고 이 작업에 필요한 종속성을 가져옵니다.

import datetime
import requests
import matplotlib.pyplot as plt

이제 WABA ID와 액세스 토큰을 사용하여 분석을 가져오기 위한 API GET 요청을 만듭니다. 이러한 값은 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 리스트에 4개의 사전이 포함됩니다. 각각에는 연결된 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 로 설정하고 granularitydaily로 설정합니다.

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는 타사 앱에 대한 책임을 지지 않습니다.