DataSources.openweather
Источник данных OpenWeatherMap.
Предоставляет методы для получения погодных данных через API OpenWeatherMap (https://openweathermap.org).
1#!/usr/bin/env python3 2""" 3Источник данных OpenWeatherMap. 4 5Предоставляет методы для получения погодных данных через 6API OpenWeatherMap (https://openweathermap.org). 7""" 8 9import requests 10from langfuse import observe 11from loguru import logger 12 13from .datasource import DataSource 14 15 16class OpenWeatherDataSource(DataSource): 17 """Получает данные о погоде из OpenWeatherMap. 18 19 Поддерживает получение текущей температуры для указанного города 20 в метрической системе. 21 22 Attributes: 23 url: Базовый URL API OpenWeatherMap. 24 city: Название города для запроса погоды. 25 api_key: API-ключ OpenWeatherMap. 26 """ 27 28 def __init__(self, api_key: str, city: str): 29 """Инициализирует источник данных OpenWeatherMap. 30 31 Args: 32 api_key: API-ключ OpenWeatherMap. 33 city: Название города для запроса погоды. 34 """ 35 36 self.url = "https://api.openweathermap.org/data/2.5/weather" 37 self.city = city 38 self.api_key = api_key 39 40 @observe(name="Получение текущей температуры с OpenWeatherMap") 41 def get_current_temperature(self): 42 """Получает текущую температуру для заданного города. 43 44 Выполняет запрос к OpenWeatherMap API и возвращает 45 округлённую температуру в градусах Цельсия. 46 47 Returns: 48 int: Округлённая температура в °C или None при ошибке. 49 """ 50 try: 51 params = { 52 "q": self.city, 53 "appid": self.api_key, 54 "units": "metric", 55 "lang": "ru", 56 } 57 58 response = requests.get(self.url, params=params, timeout=10) 59 response.raise_for_status() 60 61 data = response.json() 62 temperature = round(data["main"]["temp"]) 63 city_name = data["name"] 64 weather_desc = data["weather"][0]["description"] 65 66 logger.debug( 67 f"Текущая температура в {city_name}: {temperature}°C ({weather_desc})" 68 ) 69 return temperature 70 71 except requests.exceptions.RequestException as e: 72 logger.error(f"Ошибка при получении температуры: {e}") 73 return None 74 except KeyError as e: 75 logger.error(f"Ошибка в формате данных погоды: {e}") 76 return None
17class OpenWeatherDataSource(DataSource): 18 """Получает данные о погоде из OpenWeatherMap. 19 20 Поддерживает получение текущей температуры для указанного города 21 в метрической системе. 22 23 Attributes: 24 url: Базовый URL API OpenWeatherMap. 25 city: Название города для запроса погоды. 26 api_key: API-ключ OpenWeatherMap. 27 """ 28 29 def __init__(self, api_key: str, city: str): 30 """Инициализирует источник данных OpenWeatherMap. 31 32 Args: 33 api_key: API-ключ OpenWeatherMap. 34 city: Название города для запроса погоды. 35 """ 36 37 self.url = "https://api.openweathermap.org/data/2.5/weather" 38 self.city = city 39 self.api_key = api_key 40 41 @observe(name="Получение текущей температуры с OpenWeatherMap") 42 def get_current_temperature(self): 43 """Получает текущую температуру для заданного города. 44 45 Выполняет запрос к OpenWeatherMap API и возвращает 46 округлённую температуру в градусах Цельсия. 47 48 Returns: 49 int: Округлённая температура в °C или None при ошибке. 50 """ 51 try: 52 params = { 53 "q": self.city, 54 "appid": self.api_key, 55 "units": "metric", 56 "lang": "ru", 57 } 58 59 response = requests.get(self.url, params=params, timeout=10) 60 response.raise_for_status() 61 62 data = response.json() 63 temperature = round(data["main"]["temp"]) 64 city_name = data["name"] 65 weather_desc = data["weather"][0]["description"] 66 67 logger.debug( 68 f"Текущая температура в {city_name}: {temperature}°C ({weather_desc})" 69 ) 70 return temperature 71 72 except requests.exceptions.RequestException as e: 73 logger.error(f"Ошибка при получении температуры: {e}") 74 return None 75 except KeyError as e: 76 logger.error(f"Ошибка в формате данных погоды: {e}") 77 return None
Получает данные о погоде из OpenWeatherMap.
Поддерживает получение текущей температуры для указанного города в метрической системе.
Attributes: url: Базовый URL API OpenWeatherMap. city: Название города для запроса погоды. api_key: API-ключ OpenWeatherMap.
OpenWeatherDataSource(api_key: str, city: str)
29 def __init__(self, api_key: str, city: str): 30 """Инициализирует источник данных OpenWeatherMap. 31 32 Args: 33 api_key: API-ключ OpenWeatherMap. 34 city: Название города для запроса погоды. 35 """ 36 37 self.url = "https://api.openweathermap.org/data/2.5/weather" 38 self.city = city 39 self.api_key = api_key
Инициализирует источник данных OpenWeatherMap.
Args: api_key: API-ключ OpenWeatherMap. city: Название города для запроса погоды.
@observe(name='Получение текущей температуры с OpenWeatherMap')
def
get_current_temperature(self):
41 @observe(name="Получение текущей температуры с OpenWeatherMap") 42 def get_current_temperature(self): 43 """Получает текущую температуру для заданного города. 44 45 Выполняет запрос к OpenWeatherMap API и возвращает 46 округлённую температуру в градусах Цельсия. 47 48 Returns: 49 int: Округлённая температура в °C или None при ошибке. 50 """ 51 try: 52 params = { 53 "q": self.city, 54 "appid": self.api_key, 55 "units": "metric", 56 "lang": "ru", 57 } 58 59 response = requests.get(self.url, params=params, timeout=10) 60 response.raise_for_status() 61 62 data = response.json() 63 temperature = round(data["main"]["temp"]) 64 city_name = data["name"] 65 weather_desc = data["weather"][0]["description"] 66 67 logger.debug( 68 f"Текущая температура в {city_name}: {temperature}°C ({weather_desc})" 69 ) 70 return temperature 71 72 except requests.exceptions.RequestException as e: 73 logger.error(f"Ошибка при получении температуры: {e}") 74 return None 75 except KeyError as e: 76 logger.error(f"Ошибка в формате данных погоды: {e}") 77 return None
Получает текущую температуру для заданного города.
Выполняет запрос к OpenWeatherMap API и возвращает округлённую температуру в градусах Цельсия.
Returns: int: Округлённая температура в °C или None при ошибке.