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
class OpenWeatherDataSource(DataSources.datasource.DataSource):
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: Название города для запроса погоды.

url
city
api_key
@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 при ошибке.