Open API와 python을 연동해보자
먼저 위 링크를 타고 가면 아래와 같은 페이지가 나오는데,
위 페이지에서 API key 를 클릭합니다.
회원가입을 해야 API key를 받을 수 있기 때문에 회원가입을 하고,
회원가입 후 다시 API key를 받으면,
위와 같이 자신의 키를 받을 수 있습니다. 키를 사용하기까지 키를 받고 나서 10~60분 정도 걸린다고 하니, 안된다고 화내지말고 기다립니다. 다시 API 탭으로 돌아가서 API를 선택합니다.
현재 날씨를 사용할 것이기 때문에 Current weather data의 API doc을 클릭해서 사용법을 알아봅니다.
API 문서에 여러 요청방법들이 있지만, city name을 이용해 요청하는 방법만을 알아보겠습니다.
API call 에 보면
api.openweathermap.org/data/2.5/weather?q={city name}
이라 설명이 나와있고 사실 이 뒤에 자신의 키를 더 입력해야 합니다. 또한 섭씨로 온도를 받기 위해 units=Metric 라는 요청을 추가합니다.
api.openweathermap.org/data/2.5/weather?units=Metric&q={city name}&APPID={your API key}
위 코드에서 {city name} 대신 Seoul을 입력하고 {your API key} 대신 자신의 API키를 넣어서 크롬 주소창에 입력하고 이동해보면, 아래와 같은 JSON 형식의 답변이 오게 됩니다.
{"coord":{"lon":126.98,"lat":37.57},"weather":[{"id":721,"main":"Haze","description":"haze","icon":"50n"},{"id":701,"main":"Mist","description":"mist","icon":"50n"}],"base":"stations","main":{"temp":7.9,"pressure":1020,"humidity":45,"temp_min":4,"temp_max":10},"visibility":10000,"wind":{"speed":2.1,"deg":220},"clouds":{"all":80},"dt":1490435400,"sys":{"type":1,"id":8514,"message":0.008,"country":"KR","sunrise":1490390873,"sunset":1490435317},"id":1835848,"name":"Seoul","cod":200}
Python 에서 API 요청하고 답변받기
python에서 API를 요청하고 답을 받으려면 httplib2 라이브러리가 필요하기 때문에, 콘솔창을 킨 후 다음 명령어를 입력합니다.
$ python -m pip install httplib2
라이브러리를 설치 했으니 lPython 콘솔에 다음과 같은 코드를 입력합니다.
import httplib2
import json
url = 'http://api.openweathermap.org/data/2.5/weather?units=Metric&q='
city = 'Seoul'
mykey = '&APPID=5e19e0a4433cbb1b0a6e5f0e5b784af2'
h = httplib2.Http()
myrequest = url+city+mykey
response, content = h.request(myrequest, 'GET')
result = json.loads(content.decode('utf-8'))
다시 lPython 콘솔에 result를 입력하면 다음과 같은 출력이 나옵니다.
{'base': 'stations',
'clouds': {'all': 75},
'cod': 200,
'coord': {'lat': 37.57, 'lon': 126.98},
'dt': 1490433600,
'id': 1835848,
'main': {'humidity': 65,
'pressure': 1018,
'temp': 281.16,
'temp_max': 283.15,
'temp_min': 277.15},
'name': 'Seoul',
'sys': {'country': 'KR',
'id': 8519,
'message': 0.0154,
'sunrise': 1490390875,
'sunset': 1490435315,
'type': 1},
'visibility': 9000,
'weather': [{'description': 'haze', 'icon': '50d', 'id': 721, 'main': 'Haze'},
{'description': 'mist', 'icon': '50d', 'id': 701, 'main': 'Mist'}],
'wind': {'deg': 320, 'speed': 1.5}}
result는 dictionary 형식으로 저장되어 있으므로, 우리가 원하는 정보만을 빼서 사용하겠습니다.
result 에서 "main"키의 값인 dictionary에서 습도('humidity'), 기온('temp'), 최고기온('temp_max'), 최저기온('temp_min')을 사용하고, 'weather'키에서 날씨('main')을 사용하겠습니다.
서울시의 날씨, 기온, 습도를 나타내는 코드를 다음과 같이 짜보았습니다.
# -*- coding: utf-8 -*-
"""
Created on Sat Mar 25 18:22:28 2017
@author: newkyu
"""
import httplib2
import json
url = 'http://api.openweathermap.org/data/2.5/weather?units=Metric&q='
city = 'Seoul'
mykey = '&APPID=5e19e0a4433cbb1b0a6e5f0e5b784af2'
h = httplib2.Http()
myrequest = url+city+mykey
response, content = h.request(myrequest, 'GET')
result = json.loads(content.decode('utf-8'))
humidity = result['main']['humidity']
temp = result['main']['temp']
temp_max = result['main']['temp_max']
temp_min = result['main']['temp_min']
weather = result['weather'][0]['main']
print('Seoul\'s weather is',weather)
print('Current temperature : ', temp,'°C')
print('Max temperature : ', temp_max,'°C')
print('Min temperature : ', temp_min,'°C')
print('Current humidity : ', humidity,'%')
출력 결과는 아래와 같이 나오게 됩니다.
여태까지 한 것을 통해 서울, 도쿄, 런던, 뉴욕, 파리, 시드니, 나이로비의 현재 날씨와 온도를
보여주는 코드를 짜보았습니다.
# -*- coding: utf-8 -*-
"""
Created on Sat Mar 25 18:22:28 2017
@author: newkyu
"""
import httplib2
import json
url = 'http://api.openweathermap.org/data/2.5/weather?units=Metric&q='
cities = ['Seoul','Tokyo','London','Newyork','Paris','Sydney','Nairobi']
mykey = '&APPID=5e19e0a4433cbb1b0a6e5f0e5b784af2'
h = httplib2.Http()
for city in cities:
myrequest = url+city+mykey
response, content = h.request(myrequest, 'GET')
result = json.loads(content.decode('utf-8'))
humidity = result['main']['humidity']
temp = result['main']['temp']
temp_max = result['main']['temp_max']
temp_min = result['main']['temp_min']
weather = result['weather'][0]['main']
print(city,'\'s weather is ',weather,sep='')
print('Current temperature : ', temp,'°C')
print('Max temperature : ', temp_max,'°C')
print('Min temperature : ', temp_min,'°C')
print('Current humidity : ', humidity,'%\n\n')
출력결과
Seoul's weather is Haze
Current temperature : 6.87 °C
Max temperature : 9 °C
Min temperature : 4 °C
Current humidity : 70 %
Tokyo's weather is Clouds
Current temperature : 6.92 °C
Max temperature : 9 °C
Min temperature : 5 °C
Current humidity : 57 %
London's weather is Clear
Current temperature : 11 °C
Max temperature : 12 °C
Min temperature : 10 °C
Current humidity : 50 %
Newyork's weather is Rain
Current temperature : 7.93 °C
Max temperature : 13 °C
Min temperature : 3 °C
Current humidity : 61 %
Paris's weather is Clear
Current temperature : 12.5 °C
Max temperature : 13 °C
Min temperature : 12 °C
Current humidity : 50 %
Sydney's weather is Clear
Current temperature : 23 °C
Max temperature : 23 °C
Min temperature : 23 °C
Current humidity : 73 %
Nairobi's weather is Clouds
Current temperature : 28.45 °C
Max temperature : 29 °C
Min temperature : 28 °C
Current humidity : 32 %
잘 나오는 것을 확인할 수 있습니다. 이제 API에 요청하고 답변받고, python과 연동하는 방법도 알았으니, 다른 API를 통해 자신이 만들고 싶은 프로그램을 만들 수 있을 겁니다. 아래 링크로 가보면 여러 Open API 들이 많으므로 사용해보시기 바랍니다.