#!/usr/bin/env python3 """Скрипт для поиска API endpoint'ов""" import asyncio import json from playwright.async_api import async_playwright async def find_api_endpoints(): api_calls = [] async with async_playwright() as p: browser = await p.chromium.launch(headless=True) page = await browser.new_page() # Перехватываем все запросы async def log_request(response): url = response.url # Интересуют только API запросы if '/api/' in url: try: status = response.status method = response.request.method data = { 'url': url, 'method': method, 'status': status, } # Пытаемся получить тело ответа для успешных запросов if status == 200: try: body = await response.json() data['response_sample'] = str(body)[:500] # Первые 500 символов except: pass api_calls.append(data) print(f"[{method}] {status} - {url}") except Exception as e: print(f"Error processing {url}: {e}") page.on('response', log_request) print("Загружаем страницу со списком отелей...") await page.goto('https://tourism.fsa.gov.ru/ru/resorts/showcase/hotels', wait_until='networkidle', timeout=60000) print("\nОжидаем загрузку данных...") await page.wait_for_timeout(5000) # Пробуем прокрутить страницу для загрузки дополнительных данных await page.evaluate('window.scrollTo(0, document.body.scrollHeight)') await page.wait_for_timeout(2000) await browser.close() # Сохраняем результаты with open('api_endpoints.json', 'w', encoding='utf-8') as f: json.dump(api_calls, f, ensure_ascii=False, indent=2) print(f"\n\nНайдено {len(api_calls)} API запросов") print("Результаты сохранены в api_endpoints.json") # Выводим уникальные endpoint'ы unique_endpoints = set() for call in api_calls: # Убираем параметры запроса для группировки url = call['url'].split('?')[0] unique_endpoints.add((call['method'], url)) print("\n=== Уникальные endpoint'ы ===") for method, url in sorted(unique_endpoints): print(f"[{method}] {url}") if __name__ == "__main__": asyncio.run(find_api_endpoints())