쿠팡 파트너스 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
인터넷에서 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
오류가 해결되고, 상품정보를 정상적으로 불러오는 것 까지 성공했습니다. 아직 파이프라인을 만들기 위한 갈길은 멀었으나, 이틀 동안 고생해서 작은 성공을 이루었습니다. 도움이 되셨다면, 광고 한 번씩 클릭 부탁드립니다^^
[파이썬][아나콘다] 파이썬 버전확인 및 변경하기 (2) | 2021.12.03 |
---|---|
[파이썬][windows] 오류 ModuleNotFoundError: No module named 'requests' (0) | 2021.12.03 |
파이썬 시작하기 (주식 자동매매프로그램 만들기) (2) | 2021.03.14 |