docs: авторизация ej.sudrf.ru через ЕСИА (Browserless + n8n)

- docs/BROWSERLESS_EJ_SUDRF_ESIA_LOGIN.md: использование browserless_login_esia.js
- Вход/выход, типы ошибок, шаг 2 (SMS), технические детали
This commit is contained in:
Fedor
2026-02-04 10:54:03 +03:00
parent fd2e7cfb07
commit fd54177ada

View File

@@ -0,0 +1,124 @@
# Авторизация ej.sudrf.ru через ЕСИА (n8n + Browserless)
Скрипт `browserless_login_esia.js` выполняет в headless-браузере (Browserless) авторизацию на портале ГАС «Правосудие» через ЕСИА (Госуслуги) и доводит процесс до экрана ввода SMS-кода.
## Назначение
- Используется в n8n workflow: нода **HTTP Request** дергает Browserless по адресу вида
`http://<browserless-host>: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`), чтобы не заполнять скрытые дубликаты.
- **Таймауты**: по умолчанию используются таймауты порядка 1530 с для навигации и ожидания селекторов; при необходимости их можно увеличить в параметрах вызова 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 (подача обращений и т.д.).