Python погода через api

YaWeather | Yandex Weather API

☀️🌤🌧🌩❄️ Yandex Weather API wrapper with typings and asyncio support.

⚠️ Warning: As a developer of this library, I recommend you not to use Yandex Weather API, here are some reasons:

  • Incomplete responses even for metropolises — you can have a look to all Optional fields that I had to use in models, that means you should add None checks before access literally to any attribute
  • Bad official documentation — for example, I really had to parse html code of doc pages just because tables copying was broken
  • Incomprehensible and big delay answers from support team
  • Few requests available — 50 per day on free rate and 5000 per day for one test month
  • Closed information about real prices that are accessible only via support team

Consider usage of OpenWeatherMap with 1 mln free requests every month and really good documentation which easy to understand and parse.

📝 Table of Contents

🎒 Installation

🛠 Examples

Simple

Now: 18.0 °C, feels like 15.0 °C Condition: cloudy

Simple Async

Now: 16.0 °C, feels like 16.0 °C Condition: clear

Forecasts

2020-07-30 | 32.0 °C, cloudy 2020-07-31 | 26.0 °C, light-rain 2020-08-01 | 28.0 °C, cloudy 2020-08-02 | 28.0 °C, rain 2020-08-03 | 28.0 °C, light-rain 2020-08-04 | 27.0 °C, rain 2020-08-05 | 29.0 °C, light-rain

Forecasts Async

2020-07-31 | 34.0 °C, light-rain 2020-08-01 | 34.0 °C, cloudy 2020-08-02 | 30.0 °C, heavy-rain 2020-08-03 | 33.0 °C, cloudy 2020-08-04 | 35.0 °C, cloudy 2020-08-05 | 34.0 °C, light-rain 2020-08-06 | 31.0 °C, heavy-rain

📜 Manual

Methods

Types

This library uses pydantic for parsing API responses. You can see data models in yaweather/models.

Читайте также:  Открыть tif файл python

In case of unsupported types

API results can change and the library may not parse the new result. So you can request «raw» dicts:

Ramzan Bekbulatov:

💬 Contributing

Contributions, issues and feature requests are welcome!

📝 License

This project is MIT licensed.

Источник

«Карманный синоптик за час». Пишем Telegram-бота для мониторинга погоды на Python

Хабровчане, всем привет! Меня зовут Максим Плачковский, я автор канала PythonToday. Из этой статьи вы узнаете, как написать своего Telegram-бота для получения данных о погоде в любом городе нашей планеты. Мы детально рассмотрим работу с API, парсинг JSON и напишем бота на асинхронной библиотеке aiogram. А после — загрузим его на виртуальный сервер и запустим. Если интересно, добро пожаловать под кат!

Подготовка API и рабочего окружения

Перед написанием кода нужно получить API-токены для работы с сервисом OpenWeather и Telegram-ботом, а также подготовить рабочее окружение.

Получаем токен OpenWeather

Начнем с самого простого: зарегистрируемся на официальном сайте и в разделе My API keys создадим токен.

После того, как вы создали API-ключ, дайте ему немного «отлежаться» — обычно это занимает 10-15 минут. Спустя это время можно общаться с OpenWeather с помощью сгенерированного токена.

Генерируем токен для Telegram-бота

Ключ для Telegram-бота можно получить у @BotFather, введя /newbot — команду для создания и регистрации нового бота. Во время настройки придумайте боту логин и название — например, Weather Bot. Есть также опциональные настройки: текст приветствия, изображение. Используйте, если хотите получить более уникального бота!

Импортируем необходимые библиотеки

Для работы нам понадобятся модули requests и aiogram — установим их.

pip install requests aiogram 

После импортируем модули и классы в файл нашего пет-проекта.

import os import datetime import requests from aiogram import Bot, types from aiogram.dispatcher import Dispatcher from aiogram.utils import executor bot = Bot(token='your_bot_token') dp = Dispatcher(bot) 

Создание бота

Первое сообщение

Для начала проверим, что aiogram увидел бота и мы можем с ним взаимодействовать. Создадим простую асинхронную функцию start_command для ответа на команду /start . И добавляем метод start_polling для запуска бота.

import os import datetime import requests from aiogram import Bot, types from aiogram.dispatcher import Dispatcher from aiogram.utils import executor bot = Bot(token='your_bot_token') dp = Dispatcher(bot) @dp.message.handler(commands=["start"]) async def start_command(message: types.Message): await message.reply("Привет! Напиши мне название города и я пришлю сводку погоды") if __name__ == "__main__": # С помощью метода executor.start_polling опрашиваем # Dispatcher: ожидаем команду /start executor.start_polling(dp) 

Запускаем скрипт, заходим в Telegram и пишем команду /start — все работает: бот возвращает нужное сообщение.

Обрабатываем входные данные

Теперь добавим функцию, которая будет реагировать на текстовые сообщения с названиями городов. Она должна проверять их на корректность и выводить ошибку, если валидация не была пройдена.

@dp.message_handler() async def get_weather(message: types.Message): pass 

OpenWeather должен принимать название города через API и возвращать данные о погоде. Исходя из документации, кроме названия города запрос должен содержать API-токен.

Усовершенствуем запрос: в параметр q будем передавать город, добавим параметр lang=ru , чтобы API работал с кириллицей. А также используем units=metric для установки метрической системы:

http://api.openweathermap.org/data/2.5/weather?q=москва&lang=ru&units=metric&appid=наш_токен 

Теперь добавим блок try-except для обработки пользовательских запросов и создадим переменную для записи результатов OpenWeather, которые возвращает сервис в JSON-формате.

@dp.message_handler() async def get_weather(message: types.Message): try: response = requests.get(f"http://api.openweathermap.org/data/2.5/weather? q=москва&lang=ru&units=metric&appid=your_token") data = response.json() except: await message.reply("Проверьте название города!") 

Отправим запрос через браузер и посмотрим, какая температура, например, в Бангкоке.

В ответе получаем не только данные о температуре, но и облачность, давление, влажность, время заката, рассвета и другие величины.

Парсим JSON

Приступим к парсингу ответа OpenWeather в формате JSON: заберем данные о городе и температуре, влажности, давлении и скорости ветра.

city = data["name"] cur_temp = data["main"]["temp"] humidity = data["main"]["humidity"] pressure = data["main"]["pressure"] wind = data["wind"]["speed"] 

OpenWeather возвращает время рассвета и заката в формате unix timestamp. Извлечем эти данные и преобразуем в секунды.

# получаем время рассвета и преобразуем его в читабельный формат sunrise_timestamp = datetime.datetime.fromtimestamp(data["sys"]["sunrise"]) # то же самое проделаем со временем заката sunset_timestamp = datetime.datetime.fromtimestamp(data["sys"]["sunset"]) 

Зная время рассвета и заката, мы можем вернуть пользователю продолжительность дня. В результате получается следующее:

@dp.message_handler() async def get_weather(message: types.Message): try: response = requests.get(f"http://api.openweathermap.org/data/2.5/weather?q=москва&lang=ru&units=metric&appid=your_token") data = response.json() city = data["name"] cur_temp = data["main"]["temp"] humidity = data["main"]["humidity"] pressure = data["main"]["pressure"] wind = data["wind"]["speed"] sunrise_timestamp = datetime.datetime.fromtimestamp(data["sys"]["sunrise"]) sunset_timestamp = datetime.datetime.fromtimestamp(data["sys"]["sunset"]) # продолжительность дня length_of_the_day = datetime.datetime.fromtimestamp(data["sys"]["sunset"]) - datetime.datetime.fromtimestamp(data["sys"]["sunrise"]) except: await message.reply("Проверьте название города!") 

Декорируем сообщения

Разнообразим текст сообщений — будем выводить разные эмодзи в зависимости от погоды.

У словаря, который мы ранее спарсили, есть ключ main — он хранит описание погоды. На его основе мы можем создать свою коллекцию с эмодзи под разные ситуации.

Также напишем условие, чтобы в случае специфической погоды, для которой эмодзи не предусмотрен, программа не ломалась, а выводила специальное сообщение.

# получаем значение погоды weather_description = data["weather"][0]["main"] if weather_description in code_to_smile: wd = code_to_smile[weather_description] else: # если эмодзи для погоды нет, выводим другое сообщение wd = "Посмотри в окно, я не понимаю, что там за погода. " 

Возможно, эти тексты тоже вас заинтересуют:

Возвращаем данные пользователю

Данные собрали — время отдать их пользователю. Сформируем строки с датой и временем, погодой, влажностью и другими данными. Главное — учесть формат данных. Например, OpenWeather возвращает значение давления в гектопаскалях. Так, если вы хотите отдавать пользователю данные в миллиметрах ртутного столба, значение нужно разделить на 1.33 и округлить в большую сторону.

await message.reply(f""\n f"Погода в городе: \nТемпература: °C \n" f"Влажность: %\nДавление: мм.рт.ст\nВетер: м/с \n" f"Восход солнца: \nЗакат солнца: \nПродолжительность дня: \n" f"Хорошего дня!" ) 

Супер — бот работает и возвращает данные в удобочитаемом формате!

Деплой бота

Сейчас синоптик запущен на компьютере. Это неудобно, если вы хотите общаться с ним круглосуточно. Ведь тогда нужно поддерживать бесперебойную работу компьютера и постоянное соединение с интернетом.

Бота лучше перенести в облако. Поскольку затраты процессора на работу с простым Open Weather API минимальны, будет достаточно виртуального сервера с 1 vCPU и 1 ГБ оперативной памяти. С учетом выделенного IP-адреса такая конфигурация выйдет примерно в 30 ₽/день.

Для начала зарегистрируемся в панели управления и создадим новый сервер в разделе Облачная платформа. Затем настроим его.

Далее подключимся к серверу по SSH, создадим виртуальное окружение для бота и загрузим его удобным способом.

Последним шагом нужно создать .service-файл, который будет автоматически поднимать бота в случае перезагрузки сервера.

Запускаем командой: systemctl enable tg_bot.service

Проверяем статус: systemctl status tg_bot.service

И перезапускаем .service-файл: systemctl restart tg_bot.service

Все готово: бот стабильно работает на сервере и автоматически поднимается в случае перезагрузки.

Как мы видим, в разработке подобных Telegram-ботов нет ничего сложного. Также они не так затратны, как может показаться: для хостинга проекта не нужно платить полную стоимость сервера за месяц — в облаке оплачиваются только потребленные ресурсы по модели pay-as-you-go. Предлагайте идеи для новых ботов в комментариях!

Источник

Why design —> matters to our lives ? —> How To Generate Realtime Weather Data With Python How To Generate Realtime Weather Data With Python

This post will show you how to fetch and generate live weather data in Python. I’ll also show you how to use WeatherAPI to supplement the data.

Last Updated: December 29, 2022

This is an example description for this item.

This post will show you how to fetch and generate live weather data of any city in Python using a weather API. We are going to make use of the weather api from www.weatherapi.com . WeatherAPI is a service that provides weather data, including realtime weather data, forecasts, and historical data to the developers of web services and mobile applications.

Before using their API, you have to signup for a free account and generate an api key here. You will need the API key for accessing their service.

We will use the python Requests module for accessing the API.

Install the requests module by running:

Fetching live weather data

Before we make the request, first we will create these variables:

  1. base_url , which stores the API’s URL
  2. api_key, stores your api key
  3. city, the city whose weather data we need.
import requests api_key = "your_API_key" base_url = "http://api.weatherapi.com/v1" city = "london" parameters = # URL parameters r = requests.get(f"/current.json", params=parameters) data = r.json() # retrieve the json data print(data)
, 'current': , 'wind_mph': 8.1, 'wind_kph': 13.0, 'wind_degree': 200, 'wind_dir': 'SSW', 'pressure_mb': 1011.0, 'pressure_in': 30.3, 'precip_mm': 0.1, 'precip_in': 0.0, 'humidity': 82, 'cloud': 75, 'feelslike_c': 11.9, 'feelslike_f': 53.5, 'vis_km': 10.0, 'vis_miles': 6.0, 'uv': 3.0, 'gust_mph': 11.9, 'gust_kph': 19.1>>

Now lets parse this data into a nice piece

import requests api_key = "your_API_key" base_url = "http://api.weatherapi.com/v1" city = "london" parameters = # URL parameters r = requests.get(f"/current.json", params=parameters) data = r.json() # retrieve json # retriving Data location = data['location']['name'] time = data['location']['localtime'] condition = data['current']['condition']['text'] temperature_celcius = data['current']['temp_c'] temperature_farenheit = data['current']['temp_f'] feelslike_celcius = data['current']['feelslike_c'] wind_direction = data['current']['wind_dir'] # printing data print(f"Location: ") print(f"Current Time: ") print() print(f"Weather Condition: ") print(f"Temperature in Celcius: ") print(f"Temperature in farenheit: ") print() print(f"Temperature feels like: Celcius") print(f"Wind Direction: ")
Location: London Current Time: 2020-11-25 11:53 Weather Condition: Light rain Temperature in Celcius: 14.0 Temperature in farenheit: 57.2 Temperature feels like: 13.1 Celcius Wind Direction: SSW 

Источник

Оцените статью