8  채널톡 API 연동

8.1 API 연동

8.1.1 API 인증키 만들기

8.1.2 Access Key와 Access Secret을 이용한 API 연동

[참고] 새 API의 경우 access token 방식으로 바뀜. 여전히 아래 방식 사용 가능

import requests
import pandas as pd
from datetime import datetime, timedelta

access_key = "xxxxxxx"
access_secret = "xxxxxxx"

# 어제와 오늘의 날짜 구하기
yesterday = datetime.now() - timedelta(days=1)
today = datetime.now()

# API 엔드포인트 및 인증 정보
url = "https://api.channel.io/open/v5/user-chats"
headers = {
    "accept": "application/json",
    "x-access-key": f"{access_key}",
    "x-access-secret": f"{access_secret}"
}
params = {
    "state": "opened",
    "sortOrder": "desc",
    "limit": 100,
    "from": int(yesterday.timestamp() * 1000),  # 어제 자정부터
    "to": int(today.timestamp() * 1000)  # 현재까지
}

# API 요청 보내기
response = requests.get(url, headers=headers, params=params)

# 응답 확인
if response.status_code == 200:
    chats = response.json().get("messages", [])
    #print(chats)
    df = pd.DataFrame(chats)
    df = df[['personType','plainText', 'updatedAt', 'createdAt']].rename(columns={'plainText': 'text'})
    df = df[df['text'].str.strip() != '']
    # updatedAt과 createdAt의 timestamp 값을 datetime 형식으로 변환
    df['updatedAt'] = pd.to_datetime(df['updatedAt'], unit='ms') + pd.Timedelta(hours=9)
    df['createdAt'] = pd.to_datetime(df['createdAt'], unit='ms') + pd.Timedelta(hours=9)
    df_sorted = df.loc[df['personType']=="user", ['updatedAt', 'text','personType']].sort_values(by='updatedAt', ascending=False)
    df_sorted.loc[:,['updatedAt','text']].dropna().head(10)
else:
    print("API 요청에 실패하였습니다.")

8.2 주요 코드 분석

8.2.1 환경 변수 로드 및 인증 정보 설정

import os
from dotenv import load_dotenv
load_dotenv()

channeltalk_access_key = os.getenv('CHANNELTALK_ACCESS_KEY')
channeltalk_access_secret = os.getenv('CHANNELTALK_ACCESS_SECRET')* 
  • dotenv를 사용해 .env 파일에서 채널톡 API 인증 정보(CHANNELTALK_ACCESS_KEY, CHANNELTALK_ACCESS_SECRET)를 로드한다. 이를 통해 API 요청에 필요한 인증 정보를 설정한다.

8.2.2 날짜 설정

yesterday = datetime.now() - timedelta(days=1)
today = datetime.now()
  • yesterday는 어제의 날짜, today는 오늘의 날짜를 나타낸다. 채팅 데이터를 검색할 기간을 설정하는 데 사용된다.

8.2.3 API 요청 파라미터 설정

params = {
    "state": params_state,
    "sortOrder": params_sort,
    "limit": params_limit,
    "from": int(yesterday.timestamp() * 1000),  # 어제 자정부터
    "to": int(today.timestamp() * 1000)  # 현재까지
}

API 요청에 사용할 파라미터를 설정합니다.

  • state: 고객 지원 상태 (opened 또는 closed)

  • sortOrder: 정렬 순서 (desc 또는 asc)

  • limit: 요청할 데이터의 수 (최소 20, 최대 500)

  • from/to: 검색할 기간의 시작과 끝을 Unix timestamp 형식으로 변환한 값입니다.

8.2.4

API 요청 및 응답 처리

response = requests.get(url, headers=headers, params=params)
if response.status_code == 200:
    chats = response.json().get("messages", [])
    df = pd.DataFrame(chats)

requests.get()을 사용하여 설정된 URL과 파라미터로 API 요청을 보내고, 성공하면 응답 데이터를 JSON 형식으로 받아서 처리한다.

  • 응답 데이터에서 messages 키에 해당하는 데이터를 추출하여 pandas DataFrame으로 변환한다.

8.2.5 데이터 정제 및 변환

df = df[['plainText', 'updatedAt', 'createdAt']].rename(columns={'plainText': 'text'})
df['updatedAt'] = pd.to_datetime(df['updatedAt'], unit='ms') + pd.Timedelta(hours=9)
df['createdAt'] = pd.to_datetime(df['createdAt'], unit='ms') + pd.Timedelta(hours=9)
df_sorted = df.loc[:, ['updatedAt', 'text']].sort_values(by='updatedAt', ascending=sort_status)
  • API에서 받은 데이터를 plainText, updatedAt, createdAt 컬럼만 추출하고, 이를 적절하게 이름 변경(text)하고 정렬한다.

  • 타임스탬프 값을 datetime 형식으로 변환한 후, 시간대를 고려해 9시간을 더한다. (한국 시간 기준)