본문으로 바로가기
 

공공데이터 포털

국가에서 보유하고 있는 다양한 데이터를『공공데이터의 제공 및 이용 활성화에 관한 법률(제11956호)』에 따라 개방하여 국민들이 보다 쉽고 용이하게 공유•활용할 수 있도록 공공데이터(Datase

www.data.go.kr

활용신청 및 인증키발급

데이터찾기를 누르시면 파일데이터/Open API 를 선택할 수 있고 원하는 데이터를 활용신청하여 이용하실 수 있습니다.

 

인증키를 발급받았습니다.

 

샘플코드

사이트에서 여러언어의 샘플코드를 제공해주고 있습니다.

발급받은 인증키를 넣어서 실행해봅니다.

from urllib2 import Request, urlopen
from urllib import urlencode, quote_plus

key = 'gIQmqloKO%2B9e8xRB3iSW6t9uW%2FKem822g4ELNU%2FdzkhOifcf5%2BnHj9damtop%2FCRAWlyyTlhk7W1F0Jm1GX9w%3D%3D'
url = 'http://apis.data.go.kr/B551182/pubReliefHospService/getpubReliefHospList'
queryParams = '?' + urlencode({ quote_plus('ServiceKey') : key, quote_plus('ServiceKey') : '-', quote_plus('pageNo') : '1', quote_plus('numOfRows') : '10', quote_plus('spclAdmTyCd') : 'A0' })

request = Request(url + queryParams)
request.get_method = lambda: 'GET'
response_body = urlopen(request).read()
print response_body

 

오류발생, 세상만사 쉽게 안되는 법입니다.

<OpenAPI_ServiceResponse>
        <cmmMsgHeader>
                <errMsg>SERVICE ERROR</errMsg>
                <returnAuthMsg>SERVICE_KEY_IS_NOT_REGISTERED_ERROR</returnAuthMsg>
                <returnReasonCode>30</returnReasonCode>
        </cmmMsgHeader>
</OpenAPI_ServiceResponse>

 

샘플코드를 참고하여 파이썬3 코드로 수정해봅니다.

'''
건강보험심사평가원_코로나19병원정보(국민안심병원 외)서비스
'''
import requests
from urllib import parse

url = 'http://apis.data.go.kr/B551182/pubReliefHospService/getpubReliefHospList'
key = 'gIQmqloKO%2B9e8xRB3iSW6t9u%2FKem822g4ELNU%2F3dkhOifcf5%2BnHj9damtop%2FeCRAlyyTlhk7W1F0Jm1GX9w%3D%3D'

queryParams = '?' + parse.urlencode({ 
    parse.quote_plus("ServiceKey") : key,
    parse.quote_plus('pageNo') : '1', 
    parse.quote_plus('numOfRows') : '10', 
    parse.quote_plus('spclAdmTyCd') : 'A0' 
    })

print(res.text)
print(res)
print(url + queryParams)

 

똑같이 오류가 발생합니다.

<OpenAPI_ServiceResponse>
        <cmmMsgHeader>
                <errMsg>SERVICE ERROR</errMsg>
                <returnAuthMsg>SERVICE_KEY_IS_NOT_REGISTERED_ERROR</returnAuthMsg>
                <returnReasonCode>30</returnReasonCode>
        </cmmMsgHeader>
</OpenAPI_ServiceResponse>
<Response [200]>
http://apis.data.go.kr/B551182/pubReliefHospService/getpubReliefHospList?ServiceKey=gIQmqloKO%252B9e8xRB3iSW6t9uW%252FKem822g4ELNU%252F3dzkhOifcf5%22BnHj9damto%252FeCRAWlyyTlhk7W1F0JmGX9w%253D%253D&pageNo=1&numOfRows=10&spclAdmTyCd=A0

 

API 는 URL 을 브라우저 주소창에 직접 붙여넣어서 확인할 수 있습니다.

같은 결과.

 

원인찾기 & 오류해결

원인을 찾아봅니다.

발급받은 인증키를 보면 UTF-8 로 인코딩 되었다고 나와있습니다.

 

샘플코드에 사용된 urlencode() 를 테스트해봅니다. 

인코딩된 값을 인코딩하면 전혀 다른 값이됩니다.

>>> key = '키'  
>>> key_encode = parse.urlencode({'ex': key})
>>> key_encode
'ex=%ED%82%A4'
>>>
>>> key_encode2 = parse.urlencode({'ex2': key_encode}) 
>>> key_encode2
'ex2=ex%3D%25ED%2582%25A4'

 

그래서 이 코드가 오류가 났었습니다.

'''
건강보험심사평가원_코로나19병원정보(국민안심병원 외)서비스
'''
import requests
from urllib import parse

url = 'http://apis.data.go.kr/B551182/pubReliefHospService/getpubReliefHospList'
key = 'gIQmqloKO%2B9e8xRB3iSW6t9uW%2FKem822g4ELNU%2F3dzkhOifcf5%2BnHj9damtop%2FeCRAWlyyTlhk7W1F0Jm1GX9w%3D%3D'

queryParams = '?' + parse.urlencode({ 
    parse.quote_plus("ServiceKey") : key,
    parse.quote_plus('pageNo') : '1', 
    parse.quote_plus('numOfRows') : '10', 
    parse.quote_plus('spclAdmTyCd') : 'A0' 
    })

print((url + queryParams).find(key))

결과는 -1

 

이미 인코딩된 키값을 제외하니 정상적으로 동작합니다.

'''
건강보험심사평가원_코로나19병원정보(국민안심병원 외)서비스
'''
import requests
from urllib import parse

url = 'http://apis.data.go.kr/B551182/pubReliefHospService/getpubReliefHospList'
key = 'gIQmqloKO%2B9e8xRB3iSW6t9uW%2FKem822g4ELNU%2F3dzkhOifcf5%2BnHj9damtop%2FeCRAWlyyTlhk7W1F0Jm1GX9w%3D%3D'

#1
# queryParams = '?' + parse.urlencode({ 
#     parse.quote_plus("ServiceKey") : key,
#     parse.quote_plus('pageNo') : '1', 
#     parse.quote_plus('numOfRows') : '10', 
#     parse.quote_plus('spclAdmTyCd') : 'A0' 
#     })

#2
queryParams = f'?{parse.quote_plus("ServiceKey")}={key}&' + parse.urlencode({ 
    parse.quote_plus('pageNo') : '1', 
    parse.quote_plus('numOfRows') : '10', 
    parse.quote_plus('spclAdmTyCd') : 'A0' 
    })

res = requests.get(url + queryParams)

print(res.text)
print(res)
print((url + queryParams).find(key))
더보기
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><response><header><resultCode>00</resultCode><resultMsg>NORMAL SERVICE.</resultMsg></header><body><items><item><adtFrDd>20200501</adtFrDd><hospTyTpCd>A</hospTyTpCd><sgguNm>밀양시</sgguNm><sidoNm>경남</sidoNm><spclAdmTyCd>A0</spclAdmTyCd><telno>055-351-3993</telno><yadmNm>밀양병원</yadmNm></item><item><adtFrDd>20200520</adtFrDd><hospTyTpCd>B</hospTyTpCd><sgguNm>진천군</sgguNm><sidoNm>충북</sidoNm><spclAdmTyCd>A0</spclAdmTyCd><telno>043-533-1711</telno><yadmNm>의료법인 건명의료재단 진천성모병원</yadmNm></item><item><adtFrDd>20200525</adtFrDd><hospTyTpCd>A</hospTyTpCd><sgguNm>전주시 완산구</sgguNm><sidoNm>전북</sidoNm><spclAdmTyCd>A0</spclAdmTyCd><telno>063-230-8114</telno><yadmNm>재단법인예수병원유지재단예수병원</yadmNm></item><item><adtFrDd>20200511</adtFrDd><hospTyTpCd>A</hospTyTpCd><sgguNm>수원시 권선구</sgguNm><sidoNm>경기
</sidoNm><spclAdmTyCd>A0</spclAdmTyCd><telno>031-278-0119</telno><yadmNm>의료법인 명인의료재단 화홍
병원</yadmNm></item><item><adtFrDd>20200514</adtFrDd><hospTyTpCd>B</hospTyTpCd><sgguNm>청주시 서원 
구</sgguNm><sidoNm>충북</sidoNm><spclAdmTyCd>A0</spclAdmTyCd><telno>043-279-2300</telno><yadmNm>충 
청북도 청주의료원</yadmNm></item><item><adtFrDd>20200225</adtFrDd><hospTyTpCd>B</hospTyTpCd><sgguNm>춘천시</sgguNm><sidoNm>강원</sidoNm><spclAdmTyCd>A0</spclAdmTyCd><telno>033-258-2000</telno><yadmNm>강원대학교병원</yadmNm></item><item><adtFrDd>20200302</adtFrDd><hospTyTpCd>A</hospTyTpCd><sgguNm>여수시</sgguNm><sidoNm>전남</sidoNm><spclAdmTyCd>A0</spclAdmTyCd><telno>061-690-6000</telno><yadmNm>여천전남병원</yadmNm></item><item><adtFrDd>20200306</adtFrDd><hospTyTpCd>B</hospTyTpCd><sgguNm>서 
구</sgguNm><sidoNm>대전</sidoNm><spclAdmTyCd>A0</spclAdmTyCd><telno>042-600-9999</telno><yadmNm>학 
교법인 건양교육재단 건양대학교병원</yadmNm></item><item><adtFrDd>20200305</adtFrDd><hospTyTpCd>A</hospTyTpCd><sgguNm>성남시 수정구</sgguNm><sidoNm>경기</sidoNm><spclAdmTyCd>A0</spclAdmTyCd><telno>031-756-8355</telno><yadmNm>지우병원</yadmNm></item><item><adtFrDd>20200302</adtFrDd><hospTyTpCd>B</hospTyTpCd><sgguNm>용인시 기흥구</sgguNm><sidoNm>경기</sidoNm><spclAdmTyCd>A0</spclAdmTyCd><telno>031-300-0114</telno><yadmNm>강남병원</yadmNm></item></items><numOfRows>10</numOfRows><pageNo>1</pageNo><totalCount>330</totalCount></body></response>
<Response [200]>
84