파이썬으로 기상청 일기예보와 날씨 API 사용하기
기상청에서 제공하는 날씨 API를 사용해보려고 한다.
현재 내가 다니고 있는 회사는 모임플래폼을 운영하고 있다.
어플에서는 모임을 만들 수 있는데 날짜와 시간, 장소를 적는다.
그러면 모임을 하는 날이 일기예보가 제공되는 날이라면
날씨를 알려주면 모임 날을 바꾸거나 픽스하는데 도움이 되지 않을까하는 생각에서 시작하게 되었다.
알려주는 곳이 없어서 직접 적어본다.이걸 보고 좋은 api를 써보면서 양질의 사이트가 나왔으면 좋겠다.
먼저 API를 사용하기 위해 공공데이터사이트에 가서 가입해준다.
공공데이터 포털
국가에서 보유하고 있는 다양한 데이터를『공공데이터의 제공 및 이용 활성화에 관한 법률(제11956호)』에 따라 개방하여 국민들이 보다 쉽고 용이하게 공유•활용할 수 있도록 공공데이터(Datase
www.data.go.kr
가입을 한 다음에 검색창에 기상청을 검색한다.
그다음 오픈 API를 눌러서 본인이 원하는 API를 찾아준다. 나는 중기예보 조회서비스를 이용한다.
활용신청 버튼을 눌러서 목적에 맞게 작성한다. 나는 '공부'라고 적었다.
활용신청을 하고 [승인] 기상청_중기예보 조회서비스를 누르면 API 키를 얻을 수 있다.
위에 보이는 일반 인증키 2개를 전부 복사해서 사용한다.
적혀있는 내용에서도 둘 중 되는거 아무거나 쓰라고 명시되어 있다.
이제 사용할 준비가 끝났는데 본인이 사용할 목적이 무엇인지에 맞게 쓰면 된다.
1. 일기예보가지고오기
○ (하늘상태) 이번 예보기간에는 대체로 맑겠으나, 22일(수)~24일(금)에는 가끔 구름많겠습니다.
○ (기온) 21일(화)~22일(수) 아침 기온은 -5~1도, 낮 기온은 3~11도로 평년(최저기온 -2~2도, 최고기온 9~12도)과 비슷하거나 조금 낮겠고, 23일(목)~27일(월) 아침 기온은 -2~4도, 낮 기온은 7~13도로 평년(최저기온 -1~3도, 최고기온 9~12도)과 비슷하겠습니다.
○ (해상) 바다의 물결은 서해남부와 남해서부 해상에서 21일(화)에 1~4m로 매우 높게 일겠고, 그 밖의 날은 1~2m로 일겠습니다.
위와 같은 일기예보를 얻고 싶으면 아래와 같은 코드를 입력하면 된다.
# Python3 샘플 코드 #
import requests
import json
url = 'http://apis.data.go.kr/1360000/MidFcstInfoService/getMidFcst'
params = {
'serviceKey' : key2, #본인 키값
'pageNo' : '1',
'numOfRows' : '10',
'dataType' : 'JSON',
'stnId' : '156', #지역코드
'tmFc' : '202302171800' #확인할 날짜
}
response = requests.get(url, params=params)
response.content.decode('utf8')
# print(response.content)
print(json.loads(response.text))
"""
기상청 예제에서는 print(response.content)로 되어있었는데,
나는 여기서 한글이 유니코드로 나와서 한글을 읽을 수가 없었다.
그래서 json을 읽을 수 있게 import json을 해주고
json으로 로드해서 읽었다.
그냥 print해서 한글이 나온다면 주석처리를 지우고 사용해도 된다.
"""
'serviceKey' 변수에는 아까 키값 2개중 하나 되는걸 입력하면 된다.
나는 인코딩키가 될때도 있었고, 디코딩키가 될때가 있었다.
'pageNo'와 'numOfRows'는 변수명과 같고,
'dataType'은 'XML' 또는 'JSON'형식으로 받을 수 있다.
'stnId'는 알고 싶은 지역을 적으면 된다.
나는 광주, 전라남도 지역을 알고 싶어서 '156'을 입력했다.
지점번호 | 구역 |
105 | 강원도 |
108 | 전국 |
109 | 서울, 인천, 경기도 |
131 | 충청북도 |
133 | 대전, 세종, 충청남도 |
146 | 전라북도 |
156 | 광주, 전라남도 |
143 | 대구, 경상북도 |
159 | 부산, 울산, 경상남도 |
184 | 제주도 |
'tmFc' 는 날짜를 적으면 된다. 이부분은 제한사항이 있다.
오늘 날짜 기준으로 1일전까지 입력가능하다.
오늘 기준으로 2023년 02월 18일이라고 한다면
202302170600 ~ 202302180600 까지 된다.
-일 2회(06:00,18:00)회 생성 되며 발표시각을 입력 YYYYMMDD0600 (1800)-최근 24시간 자료만 제공 |
만약 범위에서 벗어난 날짜를 입력하면 에러코드를 리턴받게 된다.
{'response': {'header': {'resultCode': '99',
'resultMsg': '최대 조회 기간은 오늘 기준으로 1일 전까지입니다.'}}}
2. 중기육상예보조회하기
예보구역코드, 발표시각의 조회 조건으로 예보일로부터
3일에서 10일까지 육상날씨정보를 조회하는 기능이다.
# Python3 샘플 코드 #
import requests
import json
url = 'http://apis.data.go.kr/1360000/MidFcstInfoService/getMidLandFcst'
params = {
'serviceKey' : key2, # 본인 키값
'pageNo' : '1',
'numOfRows' : '10',
'dataType' : 'JSON',
'regId' : '11F20000', # 지역코드
'tmFc' : '202302171800' # 확인할 날짜
}
response = requests.get(url, params=params)
response.content.decode('utf8')
# print(response.content)
print(json.loads(response.text))
{'response': {'header': {'resultCode': '00', 'resultMsg': 'NORMAL_SERVICE'}, 'body': {'dataType': 'JSON', 'items': {'item': [{'regId': '11F20000', 'rnSt3Am': 0, 'rnSt3Pm': 0, 'rnSt4Am': 0, 'rnSt4Pm': 0, 'rnSt5Am': 0, 'rnSt5Pm': 30, 'rnSt6Am': 30, 'rnSt6Pm': 30, 'rnSt7Am': 30, 'rnSt7Pm': 10, 'rnSt8': 20, 'rnSt9': 10, 'rnSt10': 10, 'wf3Am': '맑음', 'wf3Pm': '맑음', 'wf4Am': '맑음', 'wf4Pm': '맑음', 'wf5Am': '맑음', 'wf5Pm': '구름많음', 'wf6Am': '구름많음', 'wf6Pm': '구름많음', 'wf7Am': '구름많음', 'wf7Pm': '맑음', 'wf8': '맑음', 'wf9': '맑음', 'wf10': '맑음'}]}, 'pageNo': 1, 'numOfRows': 10, 'totalCount': 1}}} |
나머지 값들은 다 똑같으니 넘어가고
'regId'는 지역코드이다. 중기육상일기예보에서는 지역코드가 또 다르다.
예보구역코드 | 구역 |
11B00000 | 서울, 인천, 경기도 |
11D10000 | 강원도영서 |
11D20000 | 강원도영동 |
11C20000 | 대전, 세종, 충청남도 |
11C10000 | 충청북도 |
11F20000 | 광주, 전라남도 |
11F10000 | 전라북도 |
11H10000 | 대구, 경상북도 |
11H20000 | 부산, 울산, 경상남도 |
11G00000 | 제주도 |
그리고 리턴값에 대해서 조금 알려주자면
'rnSt3Am': 0 은 3일 후 오전에 비올 확률이 0%라는 뜻이다.
'rnSt3Pm': 0 은 3일 후 오후에 비올 확률이 0%라는 뜻이다.
4,5,6,7,8,9,10 은 본인이 적은 날짜의 4일후, 5일후, 10일후 라는 뜻이다.
'wf3Am': '맑음', 이건 3일 후 오전의 구름 상태이다.
상태는 아래와 같이 나타난다고 한다.
중기예보 통보문에서 구름의 양에 따라 하늘상태를 3단계(맑음, 구름많음, 흐림)으로 표현, 현상에 따라 비, 눈, 비/눈, 소나기 로 표현하고 있으며, 이를 종합하여 함께 사용하고 있음 - 맑음 - 구름많음, 구름많고 비, 구름많고 눈, 구름많고 비/눈, 구름많고 소나기 - 흐림, 흐리고 비, 흐리고 눈, 흐리고 비/눈, 흐리고 소나기 |
그 외에도 온도, 해상날씨가 있는데 그건 찾아서 해보길 바란다.
혹시라도 에러가 난다면 아래 표를 참고해서 해결하면 도움이 된다.
에러코드 | 에러메세지 | 설명 |
00 | NORMAL_SERVICE | 정상 |
01 | APPLICATION_ERROR | 어플리케이션 에러 |
02 | DB_ERROR | 데이터베이스 에러 |
03 | NODATA_ERROR | 데이터없음 에러 |
04 | HTTP_ERROR | HTTP 에러 |
05 | SERVICETIME_OUT | 서비스 연결실패 에러 |
10 | INVALID_REQUEST_PARAMETER_ERROR | 잘못된 요청 파라메터 에러 |
11 | NO_MANDATORY_REQUEST_PARAMETERS_ERROR | 필수요청 파라메터가 없음 |
12 | NO_OPENAPI_SERVICE_ERROR | 해당 오픈API서비스가 없거나 폐기됨 |
20 | SERVICE_ACCESS_DENIED_ERROR | 서비스 접근거부 |
21 | TEMPORARILY_DISABLE_THE_SERVICEKEY_ERROR | 일시적으로 사용할 수 없는 서비스 키 |
22 | LIMITED_NUMBER_OF_SERVICE_REQUESTS_EXCEEDS_ERROR | 서비스 요청제한횟수 초과에러 |
30 | SERVICE_KEY_IS_NOT_REGISTERED_ERROR | 등록되지 않은 서비스키 |
31 | DEADLINE_HAS_EXPIRED_ERROR | 기한만료된 서비스키 |
32 | UNREGISTERED_IP_ERROR | 등록되지 않은 IP |
33 | UNSIGNED_CALL_ERROR | 서명되지 않은 호출 |
99 | UNKNOWN_ERROR | 기타에러 |