본문 바로가기
SW 개발/REST API

공공 데이터 Open API 사용법: 코로나 확진자 현황 API (sample code)

by Kibua20 2020. 11. 25.

공공 데이터 포털(Data Portal)은 행정안전부에서 운영하는 대기환경, 도로명 주소 서비스, 코로나 현황 등의 공공데이터를  REST API로 제공하는 시스템입니다.  대한민국 정부에서 운영하기 때문에 공공데이터 포털 사이트에서 아이디만 만들면 손쉽게 API를 사용할 수 있으며, '무료'로 사용 가능합니다. 

 

정부부처 및 산하기관에서 발행하는 백서, 주제별 전문가가 선정한 최신 이슈와 관련된 지식, 지역/분류체계/제공기관/활용방법 별 공공데이터 개방 현황 등이 제공됩니다.  2020년 11월 현재 6,300개의 API와 36,384개의 파일 데이터를 제공합니다.  

 

공공 데이터를 이용하는 절차는 아래와 같습니다. 

  1. 사이트 회원 가입
  2. API 분류 검색
  3. API 사용 신청 및 API key 확보
  4. API 호출 및 사용

 

1. 사이트 회원 가입

공공데이터 포털사이트에서 '회원 가입'하여 아이디를 신청합니다.  회원 가입을 위해서는 이메일 등록하고 있으며, 아래와 같이 이메일 인증을 진행해야 합니다. 

공공데이터 포털 아이디 가입

 

2. API 분류 검색

공공 데이터 포털에서는 방대한 양의 데이터를 제공하고 있어 원하는 데이터를 검색을 통해서 찾아야 합니다.  데이터 포털 사이트 상단 메뉴에서 '데이터 찾기' 메뉴를 선택하고, 키워드 검색을 진행합니다.  검색 결과에서 ③ 오픈 API를 선택하고 구현하고자 하는 항목의 '활용 신청'을 진행합니다.

 

오픈 API 분류 검색

 

3. API 사용 신청 및 API key 확보

API 사용을 위해서는 API Key를 할당받아야 합니다.  API 호출 시 서버에서 인증하는 수단으로 사용하고 있습니다. API Key는 하나의 서비스에 대해서 1인당 1개만 신청 가능하고, 트래픽과 사용 기한에 대한 제한이 있습니다. 코로나 감영 현황 서비스의 경우에는 1000/일, 10,000,00/총까지 사용 가능하며 2년간 유효합니다.  (※ 연장 신청도 가능할 것으로 보입니다.) 라이선스는 영리 또는 비영리 목적에 상관없이 제한이 없으며, 일부 서비스는 출처만 표시를 요구합니다. 

 

API 사용 신청 및 API key 요청 방법

 

4. API 호출 및 사용

API Key 인증은 신청 후 1~2 시간 정도 소요되고 이후에는 API 호출이 가능합니다.  코로나 서비스 현황 API의 경우에는 URL은 아래와 같이 요청 변수 및 출력 결과는 데이터 포털 사이트에서 문서로 첨부되어 있습니다. 

 

코로나 서비스 API URL: http://openapi.data.go.kr/openapi/service/rest/Covid19/getCovid19InfStateJson 

 

API 호출 파라미터

 

API 호출 결과 설명

API를 호출하면 서버에서 결과를 XML 파일로 전달합니다.  결과 파일 샘플은 아래와 같습니다. 

Sample result:

XML 포맷으로 API 결과를 리턴함

 

API 사용은 쉽지만 API Key값이 utf8로 URL encoding된 값으로 소스 코드에 반영 시 주의해야 합니다.  Python requests 모듈에서 param을 string을 URL encoding을 하기 때문에 결과적으로 API Key 값을 그대로 전달하는 경우  URL encoding을 '2번'한 결과이며, 서버에서 "SERVICE KEY IS NOT REGISTERED ERROR" 에러를 리턴합니다.  예를 들어, 데이터 포털에서 할당한 API Key 값이 "abcdefg123456%3D%3D"  값이라면 Python code에서는 URL decoding 한 값인 "abcdefg123456=="로 request 모듈에 전달해야 합니다. 

 

 

Python code는 아래와 같습니다. 

#!/usr/bin/env python3
# -*- coding:utf-8 -*-

import requests
import xmltodict
import json
import datetime

def getCovidKR(end_day, start_day):
    url='http://openapi.data.go.kr/openapi/service/rest/Covid19/getCovid19InfStateJson'

    #ServiceKey는 url decode 한 값임. 
    payload = {
        'ServiceKey': 'sabcd............UAEbYA==',
        'startCreateDt' : start_day,
        'endCreateDt' : end_day,
    }

    res = requests.get(url, params=payload)

    if (res.status_code == 200):
    	# Ordered dictionary type
        result = xmltodict.parse(res.text) 
        
        #dictionlay type
        dd = json.loads(json.dumps(result))
        print ('누적 확진자:', dd['response']['body']['items']['item'][0]['decideCnt'])
        print ('추가 확진자:', int(dd['response']['body']['items']['item'][0]['decideCnt']) - int(dd['response']['body']['items']['item'][1]['decideCnt']))
        print ('%s일 %s시 기준' %(dd['response']['body']['items']['item'][0]["stateDt"], dd['response']['body']['items']['item'][0]["stateTime"]))
    else:
        print ('res.status_code is NOT ok')


if __name__ == "__main__":
    today =datetime.datetime.now()
    yesterday = today - datetime.timedelta(1)
    d1 = today.strftime("%Y%m%d")
    d2 = yesterday.strftime("%Y%m%d")
    getCovidKR(d1, d2)

 

xmltodict 모듈을 pip로 설치하고 python을 구동하면 아래와 같은 결과를 얻을 수 있습니다.

Python 실행결과 : 누적 확진자와 추가 확진자 확인

 

관련 글

[블로그 관리/티스토리 블로그 관리] - 파이썬 Selenium을 활용한 네이버 서치어드바이저 URL 입력 '자동화'

[개발환경/우분투] - Docker 개념과 명령어 사용 방법 및 예제

[모바일 SW 개발/Python] - Python 명령어 처리: Argparse 모듈 (ArgumentParser 사용 예제)

[모바일 SW 개발/Android] - Android에서 Python 실행 (SL4A와 Termux 활용)

[모바일 SW 개발/Python] - Python: JSON 개념과 json 모듈 사용법

[개발환경/Web Server] - Python: Web Framework Flask 사용하기

[모바일 SW 개발/Python] - 파이썬으로 Apk Download 자동화: Selenium기반의 Apk 크롤러

[모바일 SW 개발/Python] - Python 폴더 및 파일 처리 함수 모음

[모바일 SW 개발/Python] - Python code 숨기는 방법: PyInstaller로 실행 파일 만들기

[모바일 SW 개발/Python] - Python JSON 사용 시 TypeError: Object of type bytes is not JSON serializable

[모바일 SW 개발/Python] - Python smtplib 사용한 email 발송 예제 (gmail)

[모바일 SW 개발/REST API] - Google gmail API 사용 방법 (3) - Sample code

[모바일 SW 개발/REST API] - Google Gmail API 사용 방법 (2) - Sample code

[모바일 SW 개발/REST API] - JWT(JSON Web Token) Encoding 방법 (Python sample code)

[모바일 SW 개발/Python] - [Tips] Python: XML Parsing 시 multiple elements on top level

 

 




댓글