미래나무


반응형

 

쿠팡 파트너스 API를 이용하여 자동으로 상품 등록하는 프로그램을 만드는 중 공개된 소스를 바탕으로 진행하고 있으나, 'Specified signature is expired'라는 문제에 봉착하였습니다. HMAC 인증에 문제가 생긴 것 같습니다.

 

저의 파이썬 환경은 아래와 같습니다. 

(base) C:\Users\>conda -V
conda 4.10.3

(base) C:\Users\>python -V
Python 3.9.7

(base) C:\Users\>
windows10

 

기존에 공개된 소스를 실행하다 보면 아래와 같이 문제가 생깁니다.

<module>
    productdata = test.get_productsdata(method, authorization, keyword, limit) # API 호출

  File "C:\Users\HAN\.spyder-py3\temp.py", line 49, in get_productsdata
    data = jsondata['data']

KeyError: 'data'

 

쿠팡 OPEN API 사이트에 들어가 확인해 보니 아래와 같이 HMAC signaute 가 만료되었기 때문에 발생한 문제라고 합니다. 아직 생성도 하지않았는데 '벌써 만료라니?' 라는 생각과 함께, '며칠 전에 발급받은 api 가 벌써 만료가 되었나?' 라는 생각이 머릿속을 스치면서 머릿속이 하얗게 됩니다. 쿠팡 api 키를 재발급받기 위해 열심히 찾아봤으나, 재발급은 안된다고 합니다. (그렇기 때문에 key 값이 노출되지않도록 조심해야 한다고 합니다)

 

https://partners.coupang.com/#help/open-api

 

Coupang Partners

쿠팡과 함께 수익을 창출해보세요

partners.coupang.com

 

Specified signature is expired

 

인터넷에서 HMAC 만료 관련된 글을 찾아보니, 원인은 쿠팡 OPEN API에 공개된 소스가 잘못되어있었습니다. 

이 코드의 의도는 한국시간을 UTC 으로 변경한 문자열을 만들려고 했던 것 같습니다. 이게 외국인이라니 한국 쿠팡 서버와 외국 접속자가의 시간 동기화를 필요한 작업이지만, 한국 사용자와 한국 쿠팡 서버라면 UTC 시간으로 변경할 필요가 없는 절차입니다. 

    os.environ["TZ"] = "GMT+0"
    datetime = time.strftime('%y%m%d')+'T'+time.strftime('%H%M%S')+'Z'

 

그래서 코드를 아래와 같이 변경해주면 시간동기화가 정상적으로 동작해서 문제없이 HMAC 인증이 이루어지게 됩니다.

 

 

변경 전

def generateHmac(method, url, secretKey, accessKey):
    path, *query = url.split("?")
    os.environ["TZ"] = "GMT+0"
    datetime = time.strftime('%y%m%d')+'T'+time.strftime('%H%M%S')+'Z'
    message = datetime + method + path + (query[0] if query else "")
    signature = hmac.new(bytes(secretKey, "utf-8"),
                         message.encode("utf-8"),
                         hashlib.sha256).hexdigest()
    return "CEA algorithm=HmacSHA256, access-key={}, signed-date={}, signature={}".format(accessKey, datetime, signature)

 

변경 후

def generateHmac(self, method, url, secretKey, accessKey):
	path, *query = url.split("?")
	dateGMT = strftime('%y%m%d', gmtime())
	timeGMT = strftime('%H%M%S', gmtime())
	datetime = dateGMT + 'T' + timeGMT + 'Z'
	message = datetime + method + path + (query[0] if query else "")
	signature = hmac.new(bytes(secretKey, "utf-8"), message.encode("utf-8"), hashlib.sha256).hexdigest()
	return "CEA algorithm=HmacSHA256, access-key={}, signed-date={}, signature={}".format(accessKey, datetime, signature)

 

 

위에 같이 소스를 변경하니, 아래와 같은 문제가 발생합니다.

  File "C:\Users\HAN\.spyder-py3\1차성공_202112051325.py", line 44, in generateHmac
    dateGMT = strftime('%y%m%d', gmtime())

NameError: name 'strftime' is not defined

 

strftime 이 정의되지 않았다고 나오니, 또 뭐를 해야 할지 모르겠네요.

인터넷에 열심히 strftime is not defined를 찾아봅니다.

 

의외로 간단하게 헤더 부분에 아래와 같이 정의해주면 깔끔하게 해결이 됩니다.

from time import gmtime, strftime, sleep

 

오류가 해결되고, 상품정보를 정상적으로 불러오는 것 까지 성공했습니다. 아직 파이프라인을 만들기 위한 갈길은 멀었으나, 이틀 동안 고생해서 작은 성공을 이루었습니다. 도움이 되셨다면, 광고 한 번씩 클릭 부탁드립니다^^

 

쿠팡파트너스 자동프로그램

반응형

이 글을 공유합시다

facebook twitter googleplus kakaoTalk kakaostory naver band