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
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 = {
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: Название города для запроса погоды.

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 = {
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 при ошибке.