Дізнаємося поточну погоду простеньким скриптом на Python'е

На Хабре є цікава стаття про те, як ентузіасти роблять погоду. Ентузіасти роблять, а ми скористаємося плодами їхньої праці — отримаємо цю саму погоду від OpenWeatherMap.org скриптом на Python'е.

Для отримання доступу до сервісу погоди доведеться пройти нескладну процедуру реєстрації на сайті OpenWeatherMap.org. Сформуємо і відправимо запит, розберемо пакет у форматі JSON, і отримаємо поточну температуру з описом стану погоди.



Зареєструватися на openweathermap.org зовсім нескладно, а решта буде зробити ще простіше.

Реєстрація потрібна для отримання ідентифікує користувача рядка App Id, що складається з набору букв і цифр (здається — тільки з шістнадцяткових цифр). Такого виду:
«6d8e495ca73d5bbc1d6bf8ebd52c4». Цей App Id використовувати не варто, тому що він створений мною випадковим чином такий рядком на Python'е:

appid = "".join(random.choice("abcdef0123456789") for x in range(29))

Формування рядка запиту
Спочатку спробуємо знайти цікавлячий нас місто в їх базі. Рядок запиту повинна бути приблизно така:

http://api.openweathermap.org/data/2.5/find?q=Petersburg&type=like&APPID=6d8e495ca73d5bbc1d6bf8ebd52c4

У запиті потрібно вказати потрібний місто (замість «Petersburg») і свій App Id (замість «6d8e495ca73d5bbc1d6bf8ebd52c4». Можна уточнити запит, вказавши ідентифікатор країни після назви міста через кому. Наприклад, так:

http://api.openweathermap.org/data/2.5/find?q=Petersburg,RU&type=like&APPID=6d8e495ca73d5bbc1d6bf8ebd52c4

Оскільки потрібно буде кілька разів формувати рядок запиту, вирішив зробити для цього функцію form_url_string:

appid = "6d8e495ca73d5bbc1d6bf8ebd52c4"
def form_url_string(s_request):
global appid
s_appid = "&APPID=" + appid
s_template = "http://api.openweathermap.org/data/2.5/" + s_request + s_appid
return s_template

Перевірка наявності в базі інформації про потрібному населеному пункті
План такий. У відповідь на сформований запит отримуємо пакет у форматі JSON. Розбираємо пакет і отримуємо потрібні значення за назвами полів.

import requests
s_city = "Petersburg"
s_country = "RU"
s_request = "find?q={},{}&type=like".format(s_city, s_country)
s_search_url = form_url_string(s_request)
print(s_search_url)
try:
res = requests.get(s_search_url)
data = res.json()
cities = ["{} ({})".format(d['name'], d['sys']['country'])
for d in data['list']]
print( "центр:", cities )
except as Exception e:
print("Exception (find):", e)
pass

У відповіді може виявитися кілька міст, відповідних нашому запитом. До речі, якщо в запиті вказати «Moscow» і прибрати країну з рядка наведеного в прикладі запиту, то гарантовано отримаємо кілька рядків у списку cities:
city: ['Moscow (UA)', 'Moscow (US)', 'Moscow (US)']
Отримання інформації про поточну погоду
Залишилося тільки отримати шукану інформацію про погоду. Якщо нас не цікавлять імперські одиниці виміру, то в запиті вказуємо, що бажаємо отримати метричні одиниці: «units=metric»

s_request = "weather?q={},{}&units=metric".format(s_city, s_country)
s_search_url = form_url_string(s_request)
try:
res = requests.get(s_search_url)
data = res.json()
print("conditions:", data['погода'][0]['description'])
print("temp:", data['main']['temp'])
print("temp_min:", data['main']['temp_min'])
print("temp_max:", data['main']['temp_max'])
except as Exception e:
print("Exception (weather):", e)
pass

Якщо вірити сервісу, зараз (14.11.2016 в 23:20) в Москві:
conditions: light snow
temp: -5.25
temp_min: -6
temp_max: -5
Як і обіцяв — все дуже просто.

На сайті OpenWeatherMap є ще маса цікавого — прогноз, архів погоди, інформація зі станцій погоди. Опис всіх доступних сервісів можна подивитися тут openweathermap.org/api
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.