Files
hotels/find_api.py

84 lines
3.1 KiB
Python
Raw Normal View History

#!/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())