6  아카라라이프 자사몰(카페24) API 연동

6.1 인증 절차 및 API 활용

6.1.1 인증 절차 및 API 개요

[참고 사이트]

#Client ID/Secret 얻는 방법: https://velog.io/(yl9517/Cafe24-Authentication?)-#%EC%9D%B8%EC%A6%9D%EB%B6%80%ED%84%B0-API-%ED%98%B8%EC%B6%9C%EA%B9%8C%EC%A7%80

6.1.2 Authorization Code 획득

Mall ID, Client ID와 Client Secret 필요


# To get authentication code

import requests
import base64
from urllib.parse import urlparse, parse_qs

mall_id = "xxxxxxx"
client_id = "xxxxxxxx"
client_secret = "xxxxxx"
state = "12345"
redirect_uri = "https://xxxx.com"
scope = "mall.read_product,mall.read_application,mall.write_application,mall.read_community,mall.write_community"

# 요청을 보낼 URL 설정
url = f"https://{mall_id}.cafe24api.com/api/v2/oauth/authorize?response_type=code&client_id={client_id}&state={state}&redirect_uri={redirect_uri}&scope={scope}"

print(url)

# GET 요청 보내기
response = requests.get(url)

# 응답 확인
if response.status_code == 302:
    # Location 헤더에서 authorize_code 추출
    redirect_url = response.headers['Location']
    parsed_url = urlparse(redirect_url)
    authorize_code = parse_qs(parsed_url.query)['code'][0]
    print("Authorize Code:", authorize_code)
else:
    print("Authorization failed:", response.text)

6.1.3 Access Token 획득

위에서 획득한 authorization code 사용

import requests

mall_id = "xxxxxxx"
client_id = "xxxxxxxx"
client_secret = "xxxxxx"
state = "12345"
redirect_uri = "https://xxxx.com"
scope = "mall.read_product,mall.read_application,mall.write_application,mall.read_community,mall.write_community"

authorization_code ="xxxxxxxx"


# 기본 인증 정보 생성
basic_auth = f"{client_id}:{client_secret}"
encoded_basic_auth = base64.b64encode(basic_auth.encode()).decode()

# 요청 URL 및 데이터
url = f"https://{mall_id}.cafe24api.com/api/v2/oauth/token"
headers = {
    'Authorization': f"Basic {encoded_basic_auth}",
    'Content-Type': 'application/x-www-form-urlencoded'
}
data = {
    'grant_type': 'authorization_code',
    'code': authorization_code,
    'redirect_uri': redirect_uri
}

# POST 요청 보내기
response = requests.post(url, headers=headers, data=data)

# 응답 확인
print(response.json())

6.1.4 Token 갱신하기

import requests
import base64

# 변수 설정
mall_id = "xxxxxxx"
client_id = "xxxxxxxx"
client_secret = "xxxxxx"

# 기본 인증 정보 생성
basic_auth = f"{client_id}:{client_secret}"
encoded_basic_auth = base64.b64encode(basic_auth.encode()).decode()

# 요청 URL 설정
url = f"https://{mall_id}.cafe24api.com/api/v2/oauth/token"
headers = {
    'Authorization': f"Basic {encoded_basic_auth}",
    'Content-Type': 'application/x-www-form-urlencoded'
}

# refresh.csv 파일에서 refresh token 값을 읽어옴
with open('refresh.csv', 'r') as file:
    refresh_token = file.read().strip()
    
refresh_token ="l2S54kScJFRrljTKxlZE8B"
# 요청 데이터 설정
data = {
    'grant_type': 'refresh_token',
    'refresh_token': refresh_token
}

# POST 요청 보내기
response = requests.post(url, headers=headers, data=data)

# access_token 및 refresh_token 값 읽어오기
if response.status_code == 200:
    response_data = response.json()
    access_token = response_data['access_token']
    refresh_token = response_data['refresh_token']
    print("Access Token:", access_token)
    print("Refresh Token:", refresh_token)
    print(response.json())
    # refresh token을 CSV 파일에 저장
    with open('refresh.csv', 'w') as file:
        file.write(refresh_token)
else:
    print("Error:", response.text)

6.1.5 게시판 읽어오기 - 상품 게시판

import requests
import re
import datetime
from bs4 import BeautifulSoup
import pandas as pd

bulletin = 6
url = f"https://aqarakr.cafe24api.com/api/v2/admin/boards/{bulletin}/articles"

interval=60 # 오늘부터 며칠 전까지?
payload = {}
files = {}
headers = {
    'Authorization': f'Bearer {access_token}',
    'X-Cafe24-Api-Version': '2024-03-01',
    'Content-Type': 'application/json',
    'Cookie': 'xxxxxxxxxxx'
}

# 현재 날짜를 가져옵니다.
current_date = datetime.datetime.now()

# end_date로부터 7일 전의 날짜를 구합니다.
start_date = current_date - datetime.timedelta(days=interval)

# 날짜를 원하는 형식으로 포맷팅합니다.
start_date_str = start_date.strftime('%Y-%m-%d')
end_date_str = current_date.strftime('%Y-%m-%d')

current_date = datetime.datetime.now().strftime('%Y-%m-%d')

params = {
    'start_date': start_date_str,
    'end_date': end_date_str
}

response = requests.request("GET", url, headers=headers, data=payload, files=files,params=params)
data = response.json()

articles_data = []
for article in data['articles']:
    # 각 기사의 날짜 가져오기
    article_date = article['created_date']
    # 해당 날짜의 기사 내용 가져오기
    content = article['content']
    text = BeautifulSoup(content, "html.parser").get_text()
    articles_data.append({'date': article_date, 'text': text})
    #print(f"Date: {article_date}")
    #print(text)
df = pd.DataFrame(articles_data)
print(df.head())

6.1.6 게시판 읽어오기 - 1:1 게시판

bulletin = 9
url = f"https://aqarakr.cafe24api.com/api/v2/admin/boards/{bulletin}/articles"

interval=60 # 오늘부터 며칠 전까지?
payload = {}
files = {}
headers = {
    'Authorization': f'Bearer {access_token}',
    'X-Cafe24-Api-Version': '2024-03-01',
    'Content-Type': 'application/json',
    'Cookie': 'ECSESSID=5d169e847b0b49d2ff41047129114582'
}

# 현재 날짜를 가져옵니다.
current_date = datetime.datetime.now()

# end_date로부터 7일 전의 날짜를 구합니다.
start_date = current_date - datetime.timedelta(days=interval)

# 날짜를 원하는 형식으로 포맷팅합니다.
start_date_str = start_date.strftime('%Y-%m-%d')
end_date_str = current_date.strftime('%Y-%m-%d')

current_date = datetime.datetime.now().strftime('%Y-%m-%d')

params = {
    'start_date': start_date_str,
    'end_date': end_date_str
}

response = requests.request("GET", url, headers=headers, data=payload, files=files,params=params)
data = response.json()

articles_data = []
for article in data['articles']:
    # 각 기사의 날짜 가져오기
    article_date = article['created_date']
    # 해당 날짜의 기사 내용 가져오기
    content = article['content']
    text = BeautifulSoup(content, "html.parser").get_text()
    articles_data.append({'date': article_date, 'text': text})
    #print(f"Date: {article_date}")
    #print(text)
df = pd.DataFrame(articles_data)
print(df.head())

6.2 주요 코드 분석

6.2.1 사용 라이브러리

requests, base64, dotenv, datetime, BeautifulSoup, pandas, matplotlib, konlpy 등 라이브러리:

  • requests: 외부 API에 HTTP 요청을 보내고 응답을 받아오는데 사용된다.

  • base64: 기본 인증에 필요한 클라이언트 ID와 시크릿을 Base64로 인코딩하는 데 사용된다.

  • dotenv: 환경 변수 파일(.env)에서 설정값을 불러오기 위해 사용된다.

  • datetime: 날짜 및 시간 관련 처리를 위해 사용된다.

  • BeautifulSoup: HTML에서 텍스트를 추출하는 데 사용된다.

  • pandas: 데이터를 테이블 형태로 저장하고 처리하기 위한 데이터프레임 라이브러리이다.

  • matplotlib: 그래프와 시각화를 그리기 위해 사용된다.

  • konlpy: 한국어 자연어 처리를 위한 라이브러리이다.

  • Counter: 단어 빈도수 계산을 위해 사용된다.

6.2.2 기본 인증 정보 생성

basic_auth = f"{cafe24_client_id}:{cafe24_client_secret}"
encoded_basic_auth = base64.b64encode(basic_auth.encode()).decode()
  • cafe24_client_id, cafe24_client_secret: dotenv로부터 불러온 API 접근에 필요한 인증 정보를 사용하여 Base64로 인코딩한다. 이 인증 정보를 사용해 API에 접근한다.

6.2.3 날짜 범위 설정 및 API 요청

current_date = datetime.datetime.now()
start_date = current_date - datetime.timedelta(days=params_interval)
params = {'start_date': start_date_str, 'end_date': end_date_str, 'limit': 100}
  • 날짜 범위 설정: 현재 날짜에서 사용자 입력에 따라 지정된 일수(params_interval) 만큼 이전 날짜를 계산합니다.

  • API 요청 파라미터: 지정된 날짜 범위와 다른 매개변수를 API 요청에 포함시킵니다.

6.2.4 HTML 데이터 처리 및 텍스트 추출

content = article['content']
filtered_text = BeautifulSoup(content, "html.parser").get_text()
  • BeautifulSoup: 응답받은 HTML 형식의 데이터를 파싱하여, 텍스트를 추출합니다. 여기서는 각 게시물의 본문 내용을 필터링하여 텍스트만 추출합니다.