import asyncio
import os
import logging
import random
from playwright.async_api import async_playwright
# Настройка логов
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s',
handlers=[logging.FileHandler("logs/recon.log"), logging.StreamHandler()]
)
logger = logging.getLogger("GIS-Aristoteles-Recon")
USER_DATA_DIR = "/app/browser_context"
TARGET_URL = "https://dom.gosuslugi.ru/"
OBSIDIAN_BASE = "/app/obsidian/Gemini/Projects/GIS_ZHKH"
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"
try:
async with aiohttp.ClientSession() as session:
await session.post(url, json={"chat_id": chat_id, "text": message, "parse_mode": "HTML"})
except: pass
async def deep_scan():
async with async_playwright() as p:
logger.info("Launching browser (Aristoteles Mode)...")
context = await p.chromium.launch_persistent_context(
user_data_dir=USER_DATA_DIR,
headless=False,
args=["--no-sandbox", "--disable-setuid-sandbox", "--start-maximized"]
)
page = await context.new_page()
await page.set_viewport_size({"width": 1600, "height": 1024})
logger.info(f"Navigating to {TARGET_URL}")
await page.goto(TARGET_URL)
os.makedirs(f"{OBSIDIAN_BASE}/screenshots", exist_ok=True)
markers = [
"Информация о договорах по дому",
"Капитальный ремонт",
"Итоги общих собраний собственников"
]
found_marker = None
attempt = 0
while not found_marker:
attempt += 1
logger.info(f"Scan attempt {attempt}...")
# Сохраняем "глазок" в Обсидиан для отладки
debug_scr = f"{OBSIDIAN_BASE}/screenshots/current_view.png"
await page.screenshot(path=debug_scr)
# Проверяем наличие маркеров
content = await page.content()
for m in markers:
if m in content:
found_marker = m
break
if found_marker: break
if attempt % 10 == 0:
await send_tg_report(f"⏳ Жду входа... (Попытка {attempt})\nЯ смотрю на экран и не вижу разделов жильца. Проверь файл current_view.png в Обсидиане.")
await asyncio.sleep(10)
await send_tg_report(f"🎯 Цель захвачена! Увидел: {found_marker}.\nНачинаю тотальное картирование всех кнопок.")
# 1. Снимаем финальный вид
await page.screenshot(path=f"{OBSIDIAN_BASE}/screenshots/dashboard_full.png", full_page=True)
# 2. Собираем элементы (Исправленный CSS селектор!)
elements = await page.query_selector_all("a, button, [role='button']")
report_lines = ["# 🏛️ ТОТАЛЬНАЯ КАРТА ЛК: ТЫРИН АЛЕКСАНДР\n"]
report_lines.append(f"Дата сканирования: {asyncio.get_event_loop().time()}\n")
report_lines.append("![[Gemini/Projects/GIS_ZHKH/screenshots/dashboard_full.png]]\n")
report_lines.append("## 🔍 Все найденные интерактивные элементы:\n")
seen = set()
for el in elements:
try:
txt = await el.inner_text()
txt = txt.strip().replace("\n", " ")
if txt and len(txt) > 2 and txt not in seen:
seen.add(txt)
report_lines.append(f"- `{txt}`")
except: continue
with open(f"{OBSIDIAN_BASE}/TOTAL_MAP.md", "w", encoding="utf-8") as f:
f.write("\n".join(report_lines))
await send_tg_report("🏆 Миссия выполнена!\n\nФайл TOTAL_MAP.md и скриншоты в папке проекта в Obsidian.")
while True:
await asyncio.sleep(3600)
if __name__ == "__main__":
asyncio.run(deep_scan())