[python] 공공데이터포털 SERVICE_KEY_IS_NOT_REGISTERED_ERROR

kodman ingzart·2022년 1월 12일
0
post-thumbnail

문제 상황

지난 포스트
https://velog.io/@ingzart/python-web-api에서-뭔가-안된다-싶으면-일단-범인은-프록시다
에서 프록시 문제는 해결했는데 다른 에러가 발생했다.

response = requests.get(url, params=params)
raw_result = response.content
try:
    converted_result = json.loads(raw_result)
except Exception as e:
    return str(e)

나는 params에 반환 데이터 타입을 JSON으로 설정했고, 내 파이썬 코드에서 예쁘게 잘 가꾸고자 json->python dict로 변신시켜주는 마법의 함수 json.loads()를 이용한 건데 웬 걸, 받아오다가 에러가 나면 아래 HTML(?)로 보이는 문자열 그대로 돌려주는듯 했다

<OpenAPI_ServiceResponse>\n
\t<cmmMsgHeader>\n
\t\t<errMsg>SERVICE ERROR</errMsg>\n
\t\t<returnAuthMsg>SERVICE_KEY_IS_NOT_REGISTERED_ERROR</returnAuthMsg>\n
\t\t<returnReasonCode>30</returnReasonCode>\n
\t</cmmMsgHeader>\n
</OpenAPI_ServiceResponse>'

중요해 보이는 메세지는 2개

SERVICE_KEY_IS_NOT_REGISTERED_ERROR
30

근데 난 분명 관련 문서의 아래 차트에서 확인한대로 인증키(encode)를 파라미터로 넘겨줬다.

service_key = self.service_key_encode


여기까지 체크해본 바로는 내가 실수한 건 없는 것 같으니 이제 왜 안되는지 십탱 개염병 화를 내도 될 것 같다.
하지만 이 쏘패같은 코드는 옆에서 내가 분노하든 울고 있든 근본적인 원인을 해결해주지 않으면 절대 동작해줄 마음이 없기 때문에 격정을 추스르고 침착하게 구박사님께 도움을 요청해야 한다.


해결책

이미 공공데이터포털에서 인코딩을 한 키값을 받아서 파라미터로 넘겨줬는데 인코딩 안된(즉 내 인코딩 키값을 디코딩 해서) 키값을 넣어줘야 한다고 한다.
공공데이터포털에서도 인코드 키값을 주고 "인코딩 없이는 넘길 수 없는 특수문자가 포함돼 있어 반드시 인코딩 해야 한다" 해놓고 왜 이런가 생각해봤는데, 내 뇌피셜에는 파이썬의 requests 라이브러리가 자체적으로 인코딩을 하고 다른 언어와 라이브러리에서는 인코딩을 안해줄 수도 있음에서 발생한 문제가 아닐까 싶다. (파이썬 requests는 인코딩 키를 넣으면 인코딩 2회, 다른 안해주는 라이브러리에서는 인코딩 키를 넣으면 인코딩 1회)

service_key = self.service_key_decode

여튼 디코드 키값을 넣어주니 해결됐다.
다른 블로그들은 직접 디코딩을 하던데 이런 문의가 많아서 공공데이터포털에서 최근에 추가했는지 나는 서비스키를 디코드 값도 받아서 그냥 그걸 넣어줬다.

profile
An optimist who becomes pessimistic while working

0개의 댓글