import asyncio import os import logging from playwright.async_api import async_playwright from sqlalchemy import create_engine from models import Base # Настройка логов logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') logger = logging.getLogger("GIS-Mapper") USER_DATA_DIR = "/app/browser_context" TARGET_URL = "https://dom.gosuslugi.ru/" async def send_tg_report(message): token = os.getenv("TELEGRAM_BOT_TOKEN") chat_id = os.getenv("TELEGRAM_CHAT_ID") if not token or not chat_id: return import aiohttp url = f"https://api.telegram.org/bot{token}/sendMessage" async with aiohttp.ClientSession() as session: await session.post(url, json={"chat_id": chat_id, "text": message, "parse_mode": "HTML"}) async def map_personal_account(): async with async_playwright() as p: logger.info("Starting browser with persistent context...") context = await p.chromium.launch_persistent_context( user_data_dir=USER_DATA_DIR, headless=False, # Обязательно False, чтобы ты видел окно! args=["--no-sandbox", "--disable-setuid-sandbox"] ) page = await context.new_page() await page.goto(TARGET_URL) logger.info("Waiting for user to log in...") await send_tg_report("🌐 Браузер запущен!\n\nЗаходи по ссылке: http://192.168.10.116:6080/vnc.html\nЛогинься в ГИС ЖКХ. Я жду появления личного кабинета...") # Ждем появления элемента, который есть только в личном кабинете # Например, кнопка "Выйти" или имя пользователя try: # Ждем долго (10 минут), пока ты вводишь пароли и СМС await page.wait_for_selector("text=Выйти", timeout=600000) logger.info("User logged in successfully!") await send_tg_report("✅ Успешный вход!\n\nЯ вижу личный кабинет. Начинаю сканирование структуры разделов...") # Снимаем главный экран ЛК await page.screenshot(path="/app/screenshots/dashboard.png", full_page=True) # Собираем ссылки из главного меню menu_items = await page.query_selector_all("a") structure = [] for item in menu_items: text = await item.inner_text() href = await item.get_attribute("href") if text and href and href.startswith("/"): structure.append(f"- **{text.strip()}**: `{href}`") # Сохраняем карту в Обсидиан (через маунт) report_path = "/app/downloads/nas/GIS_STRUCTURE_MAP.md" with open(report_path, "w") as f: f.write("# 🗺️ Карта Личного Кабинета ГИС ЖКХ\n\n") f.write(f"Дата сканирования: {asyncio.get_event_loop().time()}\n\n") f.write("\n".join(set(structure))) await send_tg_report(f"🗺️ Карта ЛК составлена!\n\nНайдено разделов: {len(set(structure))}\nФайл сохранен в Obsidian.") except Exception as e: logger.error(f"Error during mapping: {e}") await send_tg_report(f"❌ Ошибка при сканировании ЛК:\n{str(e)}") await context.close() if __name__ == "__main__": asyncio.run(map_personal_account())