iOS/WeatherKit

WeatherKit REST API 사용해보기

bereben 2022. 12. 3. 14:01

주의! 현재 제가 테스트한 날짜기준(22.12.03) Weather API 1.0+ Beta입니다.

이번 wwdc22에서 WeatherKit이 정식으로 출시했다.
weatherkit은 iOS16부터 사용가능하며 iOS16미만이거나 다른 플랫폼에서는 WeatherKit REST API를 사용하여 날씨데이터를 받을 수 있다.
나 같은 경우는 장고서버에서 사용을 하기 위해 WeatherKit REST API를 사용했다.
WeatherKit REST API를 사용하기 위해선 애플 개발자 계정이 있어야 하며 2개를 추가하여 weatherkit을 사용할 수 있게 설정해줘야 한다.
WeatherKit REST API 키 발급받기
설정이 끝났으면 api를 요청해야 하는데 요청할 때, 키를 포함한 정보들을 JWT라는 토큰으로 바꿔서 url 뒤에 토큰을 넣어 api를 요청해야 한다.

JWT란? json web token으로써 헤더, 내용, 서명으로 구성되어있으며 안에 있는 키값들을 암호화하여 토큰을 만든 후 api를 요청한다.
토큰을 생성할 때 꼭 WeatherKit REST API에 맞는 JWT 형태의 토큰으로 생성해야 하며 이를 지키지 않을 경우 401에러가 뜨며 거절당한다.(여기서 삽질을 많이했다 ㅠㅠ (API문서를 잘 확인하자!)

weatherkit rest api의 키를 다운받고 열어보면 이렇게 되어있다.

-----BEGIN PRIVATE KEY-----
...
...
-----END PRIVATE KEY-----

키 파일의 확장자는 p8이며 되어 있는데 암호화 되어있지 않은 PKCS#8 데이터라 이런 형식으로 시작합니다.


JWT를 만들기 전에 애플 공식문서에서 어떤 키들이 있는지 보고나서 만들면 이해하기 더 쉽습니다.
https://developer.apple.com/documentation/weatherkitrestapi/request_authentication_for_weatherkit_rest_api


장고서버만들기

JWT를 사용해주기 위해 PyJWT를 그리고 ES256암호화를 사용하기 위해 cryptography 를 api요청을 위한 requests를 설치해줍니다.
pip install PyJWT
pip install cryptography
pip install requests

장고(Python) 기준으로 JWT 토큰 형식을 만드는 방법입니다.

from django.http import HttpResponse
import jwt
import requests
from time import time

current_time = int(time())
expiry_time = current_time + 3600
team_ID = "App ID Prefix"
Bundle_ID = "Bundle ID"
key_ID = "Key ID"
algorithm = "ES256"

payload = {
     "iss": team_ID,
     'iat': current_time,
     'exp': expiry_time,
     "sub": Bundle_ID,
}
key = open("파일.p8","r").read()
headers = {
   "kid": key_ID,
   "id": f"{team_ID}.{Bundle_ID}",
}

token = jwt.encode(payload, key, algorithm, headers)

이렇게 하면 api인증을 위한 JWT를 만드는 것은 끝이납니다.


열심히 만든 토큰을 headers에 이러한 형태로 넣습니다.

headers = {
    "Authorization": f"Bearer {token}"
}

이제 api요청이 정상적으로 되는지 테스트 가보자고~

url = "https://weatherkit.apple.com/api/v1/availability/36.0160483/129.3256235?country=US"
res = requests.get(url, headers = headers)
print(res.json())

response code는 200으로 OK


그런데 왼쪽 시간이 이상하다?? 장고 세팅에서 한국시간으로 바꿔주도록 합시다.
settings.py

LANGUAGE_CODE = 'ko-kr'
TIME_ZONE = 'Asia/Seoul'

이제 현재시간으로 잘 들어오는군!!!

토큰이 정상적으로 작동하는것을 확인했으니 이제 진짜! 정보를 요청해보겠습니다.
기본 형태는 이러합니다.

GET https://weatherkit.apple.com/api/v1/weather/{language}/{latitude}/{longitude}

이제 데이터 요청을 위해 url을 커스텀 해봅시다.
일단 url그릇을 만듭니다.

language = "ko"
latitude = "36.0160483"
longitude = "129.3256235"
url = "https://weatherkit.apple.com/api/v1/weather/{language}/{latitude}/{longitude}"

그리고 대망의 파라미터 만들시간~~

api문서에보면 5가지가 있는데 즉, 한번 요청으로 5가지의 데이터셋을 받을 수 있습니다.
https://developer.apple.com/documentation/weatherkitrestapi/dataset
나는 욕심이 많으니 5개를 다 받아버릴거다!!!
그런데 weatherAlerts는 다른 GET으로 빠져 버려서 데이터를 주지 않아 지워주도록 합시다.
그리고 필수로 적어야 하는 timezone이 있습니다. 이것을 서울시간으로 적어줍시다~

countryCode = "KR"
timezone = "Asia/Seoul"
dataSets = ["currentWeather", "forecastDaily", "forecastHourly", "forecastNextHour"]

params = {
"countryCode": countryCode,
"dataSets": ",".join(dataSets),
"timezone": timezone,
}

이제 요청을 해봅시다!!!

res = requests.get(url, headers = headers, params= params)
print(res.json())

데이터 참 잘들어오네 ~

UTC 0기준으로 되어 있으니 데이터를 잘? 가공해서 사용합시다!

끝~

참고
https://www.youtube.com/watch?v=7mg42_Fix9k
https://github.com/davecom/PyWeatherKit
https://developer.apple.com/documentation/weatherkitrestapi

'iOS > WeatherKit' 카테고리의 다른 글

WeatherKit REST API 키 발급받기  (0) 2022.12.03