84 lines
3.1 KiB
Python
84 lines
3.1 KiB
Python
|
|
#!/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())
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|