DataSources.openweather
Источник данных OpenWeatherMap.
Предоставляет методы для получения погодных данных через API OpenWeatherMap (https://openweathermap.org).
1""" 2Источник данных OpenWeatherMap. 3 4Предоставляет методы для получения погодных данных через 5API OpenWeatherMap (https://openweathermap.org). 6""" 7 8import requests 9 10from langfuse.decorators 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 = {"q": self.city, "appid": self.api_key, "units": "metric", "lang": "ru"} 52 53 response = requests.get(self.url, params=params, timeout=10) 54 response.raise_for_status() 55 56 data = response.json() 57 temperature = round(data["main"]["temp"]) 58 city_name = data["name"] 59 weather_desc = data["weather"][0]["description"] 60 61 logger.debug(f"Текущая температура в {city_name}: {temperature}°C ({weather_desc})") 62 return temperature 63 64 except requests.exceptions.RequestException as e: 65 logger.error(f"Ошибка при получении температуры: {e}") 66 return None 67 except KeyError as e: 68 logger.error(f"Ошибка в формате данных погоды: {e}") 69 return None 70 except Exception as e: 71 logger.error(f"Неожиданная ошибка при получении температуры: {e}") 72 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 = {"q": self.city, "appid": self.api_key, "units": "metric", "lang": "ru"} 53 54 response = requests.get(self.url, params=params, timeout=10) 55 response.raise_for_status() 56 57 data = response.json() 58 temperature = round(data["main"]["temp"]) 59 city_name = data["name"] 60 weather_desc = data["weather"][0]["description"] 61 62 logger.debug(f"Текущая температура в {city_name}: {temperature}°C ({weather_desc})") 63 return temperature 64 65 except requests.exceptions.RequestException as e: 66 logger.error(f"Ошибка при получении температуры: {e}") 67 return None 68 except KeyError as e: 69 logger.error(f"Ошибка в формате данных погоды: {e}") 70 return None 71 except Exception as e: 72 logger.error(f"Неожиданная ошибка при получении температуры: {e}") 73 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 = {"q": self.city, "appid": self.api_key, "units": "metric", "lang": "ru"} 53 54 response = requests.get(self.url, params=params, timeout=10) 55 response.raise_for_status() 56 57 data = response.json() 58 temperature = round(data["main"]["temp"]) 59 city_name = data["name"] 60 weather_desc = data["weather"][0]["description"] 61 62 logger.debug(f"Текущая температура в {city_name}: {temperature}°C ({weather_desc})") 63 return temperature 64 65 except requests.exceptions.RequestException as e: 66 logger.error(f"Ошибка при получении температуры: {e}") 67 return None 68 except KeyError as e: 69 logger.error(f"Ошибка в формате данных погоды: {e}") 70 return None 71 except Exception as e: 72 logger.error(f"Неожиданная ошибка при получении температуры: {e}") 73 return None
Получает текущую температуру для заданного города.
Выполняет запрос к OpenWeatherMap API и возвращает округлённую температуру в градусах Цельсия.
Returns: int: Округлённая температура в °C или None при ошибке.