디스플레이 광고 및 CRM 채널에 한 획을 그은 카카오
카카오모먼트는 이제 단순한 디스플레이 광고(이하 DA) 시장을 넘어 기업이 고객을 매니징하기 위한 수단인 CRM 채널에 한 획을 긋는 채널로 성장하게 되었다. 기존 LMS나 이메일, 온사이트에 의존하던 마케팅은 이제 고객과 직접적으로 소통하는 이미지형 메시지 광고나 푸시로 확장되어 채널은 더욱 다양해졌다. 그 역사에서 가장 큰 한 획을 그은 것이 아마 카카오일 것이다. 오늘은 이 카카오 디벨로퍼스 API를 통해 광고 성과를 가져오는 방법을 알아보고자 한다!
사전에 확인할 내용
모먼트의 경우 애플리케이션을 만들어서 진행하는 방식이 아니라, 사전에 허가된 권한을 받아야 한다. 아래 내용을 참조해서 정식적인 권한 요청을 진행해야 한다! (조금 까다로운 절차이긴 하다.)
※ 모먼트 오픈API 는 카카오 광고 공식대행사와 사전에 협의된 광고주에 한하여 권한을 부여하고 해당 권한이 있어야 사용할 수 있습니다. 광고주의 경우 담당 카카오 마케터를 통하여, 카카오 광고 공식 대행사이실 경우 카카오 채널 담당자를 통하거나, “카카오광고 통합 에이전시 > 문의게시판 > 카테고리 : 카카오모먼트 > 운영 > API 권한신청” 을 통해 모먼트 오픈API 사용 권한신청을 진행하시길 바랍니다.
참고로 권한은 비즈앱 설정 완료 후 부여가 가능하오니 비즈앱 설정도 완료해주시길 바랍니다.
모먼트 오픈API 권한이 없는 앱의 경우 답변이 늦어지거나 문의 진행이 불가하오니 이점 양해 부탁드립니다.
내가 쓸 메소드는 사실 GET밖에 없고, POST나 DELETE등의 메소드는 필요하지 않다. 광고에 대한 관리는 필요가 없으므로, 앱 키 부분에서 REST API 키를 확인하고 팀 관리에서의 권한을 확인한다. 쓰고자 하는 메소드가 GET일 경우 하위 권한이여도 그다지 상관이 없다.
[고급] 부분에서 로그인 리다이렉트 URI가 필요한 경우 설정이 필요하다. 내 경우에는 이런 식으로 설정을 진행했다.
인가 과정 진행하여 authorization code 받아오기
사전 인가 방식을 통해서 해당 API를 쓸 수 있도록 authorization code를 취득해야 한다. 나같은 경우에 아래 포맷팅 된 url 접속 후 특정 페이지로 리다이렉트 하여 코드를 받아올 수 있도록 설정했다.
# rest_api_key와 redirect_uri 설정
rest_api_key = '내 REST API KEY'
redirect_uri = 'APP에서 등록한 redirect_url'
# 위 정보를 토대로 포맷팅
url = 'kauth.kakao.com/oauth/authorize?client_id={}&redirect_uri={}&response_type=code'.format(rest_api_key, redirect_uri)
print(url)
위 authorization code로 refresh token 제공받기
url = 'https://kauth.kakao.com/oauth/token'
authorize_code = '위 url에서 받아온 코드'
data = {
'grant_type':'authorization_code',
'client_id':rest_api_key,
'redirect_uri':redirect_uri,
'code': authorize_code
}
response = requests.post(url, data=data) # 위 파라미터 값을 토대로, url에 post
tokens = response.json()
tokens
위 url에서 받아온 코드로 request하여 json 결과값을 받아온다. 여기에 refresh token이 있는 것을 기반으로 카카오의 access token 만료 이슈를 어느정도 해결할 수 있다. 다만 refresh token도 유효 기간이 있기 때문에 해당 유효 기간이 지나게 되면 다시 인가 과정을 거치게 되는 점도 주의해야 할 것이다!
request 모듈 사용하여 내가 원하는 광고 성과의 json 결과 얻기
## step 1. 필요한 라이브러리들 import
import requests
import base64
import json
import time
import json
import pandas as pd
import numpy as np
from oauth2client.service_account import ServiceAccountCredentials
from datetime import datetime, timedelta
from dateutil.relativedelta import relativedelta
## step 2. rest api key, redirect uri 설정
rest_api_key = '내 rest_api_key'
redirect_uri = 'APP에서 등록한 redirect_url'
## step 3. refresh token이 담긴 json 파일 open
with open(file_path) as json_file:
json_data = json.load(json_file)
url = "https://kauth.kakao.com/oauth/token" #토큰 url
data = {
"grant_type": "refresh_token",
"client_id": rest_api_key,
"refresh_token": json_data["refresh_token"] #위 json 파일에서 refresh token 선택
}
response = requests.post(url, data=data)
tokens = response.json()
## step 4. 액세스 토큰 취득
access_token=tokens["access_token"]
## step 5. header 설정
# header는 디벨로퍼스(https://developers.kakao.com/docs/latest/ko/kakaomoment/campaign) 에서 필요로 하는 값들을 사용한다
# 여기서는 두개의 변수를 필요로 함
header = {
'Authorization': "bearer {}".format(access_token),
'adAccountId': "내 광고 계정 ID 6자리 숫자"
}
## step 6. url 설정 진행
# host와 url 설정. 이건 레퍼런스 참조해야함
host_url = 'https://apis.moment.kakao.com'
request_url='/openapi/v4/campaigns'
url = host_url + request_url
## step 7. 위에서 작성한 header와 url 기반으로 json 형태의 response 가져오기
response = requests.get(url, headers=header)
a = response.json()
## json 결과 normalize하여 데이터프레임으로 취득하기
df_campaigns_raw = pd.json_normalize(a)
df_campaigns_raw = pd.DataFrame(df_campaigns_raw['content'][0])
campaigns_id_list = df_campaigns_raw['id'].map(str).tolist()
df_campaign_type_raw = pd.DataFrame()
for i in campaigns_id_list:
url = 'https://apis.moment.kakao.com/openapi/v4/campaigns/'
url = url + i
response = requests.get(url, headers=header)
b = pd.json_normalize(response.json())
df_campaign_type_raw = df_campaign_type_raw.append(b)
time.sleep(6)
df_campaign_type_raw = df_campaign_type_raw
# header는 디벨로퍼스(https://developers.kakao.com/docs/latest/ko/kakaomoment/campaign) 에서 필요로 하는 값들을 사용한다
# 여기서는 두개의 변수를 필요로 함
header = {
'Authorization': "bearer {}".format(access_token),
'adAccountId': "내 광고 계정 ID 6자리 숫자"
}
uri = '/openapi/v4/adAccounts/report'
url = host_url + uri
report_params = {
'datePreset' : 'YESTERDAY',
'level' : 'CAMPAIGN',
'metricsGroup' : ['BASIC','PIXEL_SDK_CONVERSION']
}
response = requests.get(url, params=report_params,headers=header)
a = response.json()
# 위의 json 형식 DataFrame화
df_report_raw = pd.json_normalize(a)
df_report = pd.DataFrame(df_report_raw['data'][0])
## 전처리 및 가공 후 스프레드 시트로 gspread 모듈 써서 export
## 해당 과정 스케줄링 진행
나같은 경우 특정 캠페인 id들이 있고, 그 광고 캠페인의 다양한 유형(ex. 디스플레이 광고 / 플러스 친구 DM 광고) 이 있는데, 그 성과에 맞는 값을 가져와야 해서 성과 지표에 맞게 파라미터의 조정이 필요했었다. 이부분은 카카오 공식 레퍼런스 가이드 문서가 충분히 설명을 잘 해주고 있어서 문서를 보고 삽질을 하면서 원하는 폼을 가져올 수 있도록 고민을 했던 것 같다. 보통 노출 / 클릭 / 비용 / 전환 이 가장 기본적인 지표가 될 것이고 클릭당 비용 같은 단순한 것들을 계산하는 것은 문제가 없다. CPC나 CPM, CPA는 가장 베이직한 지표 중에 하나다.
다만 기여 기간에 따른 전환수 잡는 부분은 마케팅 실무자와도 충분히 논의가 필요한 부분이다. 만약 마케터가 클릭 후 1일 까지 성과를 취득하는 것 뿐만 아니라, 클릭 후 7일도 간접 기여 기간으로 같이 확인하는 것이면 다른 성과 지표도 확인을 하여야 할 것이다. 특정 광고 캠페인이 당일날은 성과가 없었지만 7일동안의 성과가 타 캠페인보다 좋았다면 그날 하루만 운이 안좋게 안됐을 가능성도 있고, 소재가 문제 있어서 반려되었거나 하는 식의 디텍팅도 가능하기 때문. 퍼포먼스 마케터 입장에서는 하나의 지표만으로는 부족할 수도 있어서 충분히 논의가 필요하다.
결국에는 실제 퍼포먼스를 담당하는 마케터와의 논의가 가장 중요하다
API로 광고 데이터를 수집한다는거 자체는 어떻게 보면 수만 가지 성과 지표 속에서 내 프로덕트와 서비스를 담당하는 마케터의 기준에 맞출 데이터를 제공한다는 것을 의미한다고 본다. 위와 같은 API는 어디까지나 수단에 불과하고, 퍼포먼스를 내는 사람들의 말을 많이 듣는게 먼저일 것이다. 퍼포먼스에서는 1분 1초가 비용과 효율의 연속이기에 고민을 바로 해결해줄수 있을 정도로 꾸준히 이야기를 들어봐야 한다고 생각했다. :)