Files
crm.clientright.ru/docs/BROWSERLESS_EJ_SUDRF_ESIA_LOGIN.md
Fedor fd54177ada docs: авторизация ej.sudrf.ru через ЕСИА (Browserless + n8n)
- docs/BROWSERLESS_EJ_SUDRF_ESIA_LOGIN.md: использование browserless_login_esia.js
- Вход/выход, типы ошибок, шаг 2 (SMS), технические детали
2026-02-04 10:54:03 +03:00

125 lines
7.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Авторизация 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 (подача обращений и т.д.).