60 lines
5.2 KiB
Markdown
60 lines
5.2 KiB
Markdown
# 🏛️ Архитектура Жнеца V4: "Магистр" (ТЗ и План Работ)
|
||
|
||
**Дата:** 02.05.2026
|
||
**Автор:** Gemini CLI (на базе глубокого анализа ошибок и логики Аристотеля)
|
||
**Цель:** 100% автономный сбор критически важных юридических документов (Информационные сообщения, Обращения, Договоры) с портала ГИС ЖКХ.
|
||
|
||
## 🔬 Анализ ошибок предыдущих версий
|
||
1. **Слепота к фреймам:** ГИС ЖКХ активно использует iframe и подгрузку контента через Angular. Обычные селекторы не срабатывали.
|
||
2. **Stale Element Reference:** При возврате из карточки документа назад в список (через кнопку "Назад"), Angular полностью перерисовывает страницу. Сохраненные ранее в памяти скрипта ссылки на документы уничтожались. Скрипт кликал "в пустоту" и падал.
|
||
3. **Отсутствие четкой последовательности:** Агент пытался быть "умным" и угадывать состояние, что приводило к хаотичным прыжкам между разделами.
|
||
4. **Игнорирование конкретных указаний пользователя:** Неумение распознать кнопку входа (когда куки живы) и неспособность пройти по четко заданным разделам.
|
||
|
||
## 🏗️ Новая Архитектура: Жесткий Маршрутизатор
|
||
Вместо того чтобы "угадывать" состояние страницы, робот будет работать как **Машина Состояний (FSM)** с четким линейным планом.
|
||
|
||
### Фаза 0: Авторизация и Инициализация
|
||
- Открываем `dom.gosuslugi.ru`.
|
||
- **Проверка входа:**
|
||
- Ищем кнопку "Выйти" или ФИО пользователя. Если есть -> Идем к Фазе 1.
|
||
- Ищем кнопку "Личный кабинет" или "Войти". Если есть -> Кликаем, ждем загрузки, проверяем вход.
|
||
- Если ничего не понятно -> Пишем в Телеграм: "Нужен логин руками", ждем 60 секунд.
|
||
|
||
### Фаза 1: Информационные сообщения (Уведомления)
|
||
*Юридически значимые оповещения.*
|
||
1. Переход в раздел уведомлений.
|
||
2. Ожидание полной загрузки таблицы.
|
||
3. Скриншот всего экрана (для фиксации дат).
|
||
4. Поиск и скачивание всех прикрепленных файлов (документы, PDF, ZIP).
|
||
5. Проверка пагинации -> если есть "Следующая", кликаем, скриншотим, скачиваем.
|
||
|
||
### Фаза 2: Обращения и ответы на них
|
||
*Переписка с госорганами и УК.*
|
||
1. Переход в раздел обращений.
|
||
2. Скриншот списка.
|
||
3. Получение количества обращений на текущей странице.
|
||
4. Цикл `for i in range(count)`:
|
||
- Находим список заново (защита от Stale Element).
|
||
- Кликаем на `i`-тое обращение.
|
||
- Скриншот карточки обращения.
|
||
- Поиск и скачивание всех прикрепленных файлов.
|
||
- Возврат назад (клик по "хлебным крошкам" или `page.go_back()`).
|
||
- Ожидание прогрузки списка.
|
||
5. Обработка пагинации.
|
||
|
||
### Фаза 3: Информация о договорах по дому
|
||
1. Переход в раздел договоров.
|
||
2. Нажатие кнопки "Найти" -> ожидание таблицы.
|
||
3. Цикл `for i in range(count)` (Аналогично Фазе 2):
|
||
- Заново ищем все ссылки "Договор...".
|
||
- Кликаем `i`-тую ссылку.
|
||
- Скриншот карточки.
|
||
- Поиск всех кнопок скачивания во всех фреймах.
|
||
- Загрузка в NAS (`gis_archive/contracts/[ИМЯ]/`).
|
||
- Генерация MD-отчета в Obsidian.
|
||
- Возврат назад, ожидание таблицы.
|
||
|
||
## 🛡️ Модуль Защиты и Отчетности
|
||
- **Playwright Persistent Context:** Куки сохраняются.
|
||
- **Smart Waiters:** Использование `wait_for_load_state("networkidle")` и случайных пауз (3-7 сек) для имитации человека.
|
||
- **Telegram Logging:** Отчет о начале каждой фазы, о скачивании каждого файла, о завершении миссии.
|