diff --git a/docs/BROWSERLESS_EJ_SUDRF_ESIA_LOGIN.md b/docs/BROWSERLESS_EJ_SUDRF_ESIA_LOGIN.md new file mode 100644 index 00000000..981fc50a --- /dev/null +++ b/docs/BROWSERLESS_EJ_SUDRF_ESIA_LOGIN.md @@ -0,0 +1,124 @@ +# Авторизация ej.sudrf.ru через ЕСИА (n8n + Browserless) + +Скрипт `browserless_login_esia.js` выполняет в headless-браузере (Browserless) авторизацию на портале ГАС «Правосудие» через ЕСИА (Госуслуги) и доводит процесс до экрана ввода SMS-кода. + +## Назначение + +- Используется в n8n workflow: нода **HTTP Request** дергает Browserless по адресу вида + `http://:3000/function?token=...&timeout=180000`. +- Вход: логин (телефон/почта/СНИЛС) и пароль от ЕСИА. +- Выход: статус `waiting_for_sms`, куки сессии и скриншот — для следующего шага (ввод SMS и получение финальных кук ej.sudrf.ru). + +## Требования + +- **Browserless** (Puppeteer): endpoint `/function` с передачей кода и опционально `context`/полей в body. +- **n8n**: предыдущая нода (например, Set) передаёт `login` и `pass` (или они задаются в body запроса к Browserless). + +## Шаг 1: До экрана SMS (этот скрипт) + +### Что делает скрипт + +1. Открывает `https://ej.sudrf.ru/?fromOa=16RS0018`. +2. Если нужно — кликает «Вход» и переходит на страницу «Авторизация пользователя». +3. Ставит галочку согласия (`#iAgree`), ждёт активации кнопки «Войти», нажимает её. +4. На ЕСИА заполняет логин и пароль (видимые поля, ввод через клавиатуру + blur/change). +5. Нажимает «Войти» на ЕСИА. +6. Ждёт появления полей для ввода SMS-кода (или перехода на другую страницу). +7. Возвращает куки через `page.cookies()` и скриншот. + +### Входные данные + +Скрипт принимает второй аргумент `input` (объект из body запроса к Browserless): + +| Поле | Описание | +|------------|------------------------------------| +| `login` | Телефон / эл. почта / СНИЛС (ЕСИА) | +| `pass` или `password` | Пароль ЕСИА | + +Либо те же поля внутри `input.context` (например `context.login`, `context.pass`). + +В n8n в **Body** запроса к Browserless можно передать: + +- Отдельные поля (рекомендуется, без спецсимволов в коде): + ```json + { + "code": "<содержимое browserless_login_esia.js>", + "login": "={{ $json.login }}", + "pass": "={{ $json.pass }}" + } + ``` +- Либо один объект `context`: + ```json + { + "code": "...", + "context": { + "login": "={{ $json.login }}", + "pass": "={{ $json.pass }}" + } + } + ``` + +Пароль может содержать спецсимволы (например `!`); передавать его отдельным полем в body предпочтительно, чтобы не ломать разбор кода. + +### Выходные данные + +При успехе: + +- `status`: `"waiting_for_sms"` +- `url`: текущий URL (страница ЕСИА с полями SMS). +- `cookies`: массив кук (для передачи во второй скрипт или сохранения). +- `screenshot`: base64 скриншот страницы. +- `sms_inputs_count`: число полей для ввода кода. +- `session_data`: заметка по использованию кук. + +При ошибке: + +- `status`: `"error"` +- `error_type`: тип ошибки (см. ниже). +- `error_message`: текст. +- `current_url`, `page_text`, `screenshot` — для отладки. +- Для `login_failed` дополнительно может быть объект `debug` (какой инпут использовался). + +### Типы ошибок + +| error_type | Описание | +|---------------------------|----------| +| `login_button_not_found` | Не найдена кнопка «Вход» на ej.sudrf.ru. | +| `esia_redirect_failed` | После «Войти» не произошёл редирект на ЕСИА. | +| `login_input_not_found` | Не найдено поле логина на странице ЕСИА. | +| `password_input_not_found`| Не найдено поле пароля на ЕСИА. | +| `login_failed` | После нажатия «Войти» на ЕСИА остались на /login/ (форма не приняла логин/пароль или валидация). | +| `sms_page_not_found` | Не найдены поля для ввода SMS-кода. | + +## Шаг 2: Ввод SMS и получение кук ej.sudrf.ru + +Отдельный скрипт (или вторая нода) должен: + +1. Принять от пользователя SMS-код (например через Telegram или Webhook). +2. Восстановить сессию: передать в Browserless сохранённые `cookies` из шага 1. +3. Открыть страницу ЕСИА с полями SMS (или текущий URL из шага 1). +4. Ввести код по цифре в каждое поле (или в одно поле, в зависимости от разметки ЕСИА). +5. Дождаться редиректа на `ej.sudrf.ru`. +6. Собрать куки для ej.sudrf.ru (`PHPSESSID`, `fromOa` и др.) и вернуть их (например записать в файл или передать в следующую ноду). + +Формат кук для последующих запросов к ej.sudrf.ru: + +``` +PHPSESSID=...; fromOa=16RS0018 +``` + +## Технические детали + +- **Куки в Browserless**: в окружении `/function` используется `page.cookies()`, а не `browserContext.cookies()`. +- **Видимость полей**: на ЕСИА выбираются только видимые инпуты (проверка по `boundingBox`), чтобы не заполнять скрытые дубликаты. +- **Таймауты**: по умолчанию используются таймауты порядка 15–30 с для навигации и ожидания селекторов; при необходимости их можно увеличить в параметрах вызова Browserless (`timeout` в URL). + +## Файлы + +- `browserless_login_esia.js` — скрипт шага 1 (до SMS). +- Документация: этот файл (`docs/BROWSERLESS_EJ_SUDRF_ESIA_LOGIN.md`). + +## См. также + +- Настройка n8n: передача `login`/`pass` из предыдущей ноды (Set) или из Credentials (Custom Auth) в body HTTP Request к Browserless. +- Сохранение кук: после шага 2 записать строку кук в файл или переменную для использования в запросах к ej.sudrf.ru (подача обращений и т.д.).