이번 글에서는 쿠팡 오픈 API를 활용하여 특정 키워드를 기반으로 제품을 검색하는 Python 쿠팡 상품 조회 코드를 살펴보도록 하겠습니다. 이 코드는 API의 인증을 위한 HMAC 구성과 제품 정보를 요청하고 파싱하는 방법을 포함하고 있습니다.
Python 쿠팡 상품 조회
쿠팡 파트너스 API 가져오기
쿠팡 파트너스 API를 가져와야 됩니다. 추가 기능 –> 파트너스 API에서 Access Key와 Secret Key를 복사합니다.
API 인증을 위한 HMAC 생성
쿠팡 API는 보안을 위해 HMAC(Hash-based Message Authentication Code) 인증 방식을 사용합니다. generate_hmac
함수는 요청 메서드(method), URL, 비밀키(secret_key), 접근키(access_key)를 입력으로 받아, HTTP 요청을 위한 인증 문자열을 반환합니다. 이 함수를 통해 생성된 문자열은 요청 헤더의 Authorization 필드에 추가됩니다.
def generate_hmac(method, url, secret_key, access_key): path, *query = url.split("?") datetime_gmt = strftime('%y%m%d', gmtime()) + 'T' + strftime('%H%M%S', gmtime()) + 'Z' message = datetime_gmt + method + path + (query[0] if query else "") signature = hmac.new(bytes(secret_key, "utf-8"), message.encode("utf-8"), hashlib.sha256).hexdigest() return f"CEA algorithm=HmacSHA256, access-key={access_key}, signed-date={datetime_gmt}, signature={signature}"
제품 데이터 요청과 응답 처리
get_products_data
함수는 API로부터 제품 데이터를 가져오는 역할을 합니다. 이 함수는 요청 메서드(method), 인증 문자열(authorization), 키워드(keyword), 도메인(domain), 그리고 가져올 제품의 수 제한(limit)을 인자로 받습니다. API가 성공적으로 데이터를 반환하면, JSON 형식으로 응답을 파싱하고 데이터를 반환합니다.
def get_products_data(method, authorization, keyword, domain, limit=10): url = f"{domain}/v2/providers/affiliate_open_api/apis/openapi/products/search?keyword={urllib.parse.quote(keyword)}&limit={limit}" response = requests.request(method=method, url=url, headers={"Authorization": authorization, "Content-Type": "application/json;charset=UTF-8"}) if response.status_code == 200: try: return response.json().get('data', {}).get('productData', []) except KeyError: print("Error: Unexpected response format") return [] else: print(f"Error {response.status_code}: {response.text}") return []
제품 정보 파싱 및 출력
응답받은 제품 데이터를 출력하기 위해 item_parser
함수를 사용합니다. 이 함수는 제품 ID, 이름, 가격, 이미지, URL 등과 같은 정보들을 콘솔에 출력합니다. 추가적으로, 키워드, 랭크, 로켓배송 여부, 무료 배송 여부와 같은 추가 정보를 포함하고 있습니다.
def item_parser(product_data): for item in product_data: print(f"Product ID: {item['productId']}") print(f"Product Name: {item['productName']}") print(f"Product Price: {item['productPrice']}") print(f"Product Image: {item['productImage']}") print(f"Product URL: {item['productUrl']}") print(f"Keyword: {item.get('keyword', 'N/A')}") print(f"Rank: {item.get('rank', 'N/A')}") print(f"Is Rocket: {item.get('isRocket', 'N/A')}") print(f"Is Free Shipping: {item.get('isFreeShipping', 'N/A')}")
제품 검색 실행
마지막으로, run_search
함수는 검색 키워드와 가져올 제품의 수를 인자로 받아, 위의 프로세스를 종합적으로 실행합니다. 인증 문자열을 먼저 생성하고, 제품 데이터를 요청한 후, 이를 파싱하여 출력합니다. 여기서는 ‘아이폰’이라는 키워드를 사용하여 검색을 진행하며, 최대 두 개의 제품 정보를 가져오도록 설정하였습니다.
def run_search(keyword, limit): method = 'GET' url = f"/v2/providers/affiliate_open_api/apis/openapi/products/search?keyword={urllib.parse.quote(keyword)}&limit={limit}" auth = generate_hmac(method, url, SECRET_KEY, ACCESS_KEY) product_data = get_products_data(method, auth, keyword, DOMAIN, limit) item_parser(product_data)
마무리
이번 포스트에서는 쿠팡 오픈 API를 활용하여 제품 정보를 검색하고 파싱하는 방법에 대해 설명하였습니다. API 인증 방식을 이해하고, 데이터 요청 및 응답을 처리하는 일련의 과정을 통해 여러분은 API를 효과적으로 사용할 수 있을 것입니다. 아래는 코드 전체입니다.
import hashlib import hmac import urllib.parse from time import gmtime, strftime import requests ACCESS_KEY = '' # API Access Key SECRET_KEY = '' # API Secret Key DOMAIN = 'https://api-gateway.coupang.com' def generate_hmac(method, url, secret_key, access_key): path, *query = url.split("?") datetime_gmt = strftime('%y%m%d', gmtime()) + 'T' + strftime('%H%M%S', gmtime()) + 'Z' message = datetime_gmt + method + path + (query[0] if query else "") signature = hmac.new(bytes(secret_key, "utf-8"), message.encode("utf-8"), hashlib.sha256).hexdigest() return f"CEA algorithm=HmacSHA256, access-key={access_key}, signed-date={datetime_gmt}, signature={signature}" def get_products_data(method, authorization, keyword, domain, limit=10): url = f"{domain}/v2/providers/affiliate_open_api/apis/openapi/products/search?keyword={urllib.parse.quote(keyword)}&limit={limit}" response = requests.request(method=method, url=url, headers={"Authorization": authorization, "Content-Type": "application/json;charset=UTF-8"}) if response.status_code == 200: try: return response.json().get('data', {}).get('productData', []) except KeyError: print("Error: Unexpected response format") return [] else: print(f"Error {response.status_code}: {response.text}") return [] def item_parser(product_data): for item in product_data: print(f"Product ID: {item['productId']}") print(f"Product Name: {item['productName']}") print(f"Product Price: {item['productPrice']}") print(f"Product Image: {item['productImage']}") print(f"Product URL: {item['productUrl']}") print(f"Keyword: {item.get('keyword', 'N/A')}") print(f"Rank: {item.get('rank', 'N/A')}") print(f"Is Rocket: {item.get('isRocket', 'N/A')}") print(f"Is Free Shipping: {item.get('isFreeShipping', 'N/A')}") def run_search(keyword, limit): method = 'GET' url = f"/v2/providers/affiliate_open_api/apis/openapi/products/search?keyword={urllib.parse.quote(keyword)}&limit={limit}" auth = generate_hmac(method, url, SECRET_KEY, ACCESS_KEY) product_data = get_products_data(method, auth, keyword, DOMAIN, limit) item_parser(product_data) if __name__ == "__main__": run_search(keyword='아이폰', limit=2)