import requests from datetime import datetime class APIClient: """ Универсальный клиент для работы с API PMS. """ def __init__(self, base_url, access_token=None, username=None, password=None): """ Инициализация API клиента. :param base_url: Базовый URL API :param access_token: Токен доступа (если требуется) :param username: Имя пользователя (если используется basic auth) :param password: Пароль (если используется basic auth) """ self.base_url = base_url self.access_token = access_token self.auth = (username, password) if username and password else None def _build_headers(self): """ Создает заголовки для запроса. :return: Словарь заголовков. """ headers = {'Content-Type': 'application/json'} if self.access_token: headers['Authorization'] = f'Bearer {self.access_token}' return headers def _make_request(self, method, endpoint, params=None, data=None): """ Выполняет запрос к API. :param method: HTTP метод ('GET', 'POST', и т.д.) :param endpoint: Конечная точка API. :param params: Параметры строки запроса (для GET). :param data: Данные для тела запроса (для POST). :return: Ответ API в формате JSON. """ url = f"{self.base_url}{endpoint}" headers = self._build_headers() try: response = requests.request( method=method, url=url, headers=headers, params=params, json=data, auth=self.auth ) response.raise_for_status() # Генерирует исключение для HTTP ошибок return response.json() except requests.exceptions.RequestException as e: print(f"Ошибка при запросе {method} {url}: {e}") return None def get(self, endpoint, params=None): """ Выполняет GET запрос. :param endpoint: Конечная точка API. :param params: Параметры строки запроса. :return: Ответ API в формате JSON. """ return self._make_request('GET', endpoint, params=params) def post(self, endpoint, data=None): """ Выполняет POST запрос. :param endpoint: Конечная точка API. :param data: Данные для тела запроса. :return: Ответ API в формате JSON. """ return self._make_request('POST', endpoint, data=data) def fetch_reservations(self, endpoint, from_date, to_date, pagination_start=0, pagination_count=50): """ Получение данных о бронированиях. :param endpoint: Конечная точка API для бронирований. :param from_date: Дата начала в формате 'YYYY-MM-DDTHH:MM:SS'. :param to_date: Дата окончания в формате 'YYYY-MM-DDTHH:MM:SS'. :param pagination_start: Начальная точка пагинации. :param pagination_count: Количество записей для выборки. :return: Ответ API в формате JSON. """ data = { "from": from_date, "until": to_date, "pagination": {"from": pagination_start, "count": pagination_count} } return self.post(endpoint, data=data)