docs: авторизация ej.sudrf.ru через ЕСИА (Browserless + n8n)
- docs/BROWSERLESS_EJ_SUDRF_ESIA_LOGIN.md: использование browserless_login_esia.js - Вход/выход, типы ошибок, шаг 2 (SMS), технические детали
This commit is contained in:
124
docs/BROWSERLESS_EJ_SUDRF_ESIA_LOGIN.md
Normal file
124
docs/BROWSERLESS_EJ_SUDRF_ESIA_LOGIN.md
Normal 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`), чтобы не заполнять скрытые дубликаты.
|
||||
- **Таймауты**: по умолчанию используются таймауты порядка 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 (подача обращений и т.д.).
|
||||
Reference in New Issue
Block a user