개발/파이썬 API

파이썬으로 기상청 일기예보와 날씨 API 사용하기

beomcoder 2023. 2. 18. 02:15
728x90
반응형

기상청에서 제공하는 날씨 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 기타에러
728x90
반응형