Как реализовать авторизацию на сайте rosrabota.ru из 1С для скачивания файлов

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

При автоматизации взаимодействия 1С с внешними веб-ресурсами, такими как порталы по поиску работы, разработчики часто сталкиваются с необходимостью программного доступа к закрытым разделам. Одной из типичных задач является скачивание резюме в формате PDF по прямой ссылке. Однако сайты защищают подобные данные, требуя обязательной авторизации пользователя. В этой статье мы подробно разберем, как правильно настроить HTTP-соединение, передать учетные данные и обработать сессионные куки (cookies) для успешного скачивания файлов.

Анализ проблемы: почему стандартный GET-запрос не работает

Рассмотрим ситуацию, когда при попытке выполнить простой HTTPЗапрос по адресу вида rosrabota.ru/my-response-download-pdf/1672783 сервер возвращает код состояния 302 Found (перенаправление). Это происходит потому, что система проверяет наличие активной сессии. Если сессия не найдена, сайт перенаправляет запрос на страницу логина: //rosrabota.ru/new/login?redirect_to=.... Следовательно, нашей первой задачей является имитация действий пользователя в окне входа.

Шаг 1: Подготовка POST-запроса для авторизации

Для входа на сайт нам необходимо отправить POST-запрос, содержащий логин и пароль. Проанализируем структуру HTML-формы на целевом сайте. Мы видим, что поля ввода имеют имена email и password. Это критически важно, так как использование неверных имен полей (например, user или login) приведет к ошибке авторизации.

Разберем типичную ошибку с кодировкой. По умолчанию многие современные системы используют UTF-8, однако старые или специфические обработчики на стороне сервера могут ожидать данные в кодировке ANSI (Windows-1251). Если вы получаете сообщение о том, что "Авторизоваться не удалось", хотя логин и пароль верны, попробуйте изменить кодировку текстового файла запроса.

Рассмотрим пример формирования тела запроса:


Логин = "job@domen.ru";
Пароль = "1337";

// Важно: используем КодировкаТекста.ANSI для корректной передачи параметров
ИмяФайлаОтправки = КаталогВременныхФайлов() + "request_auth.txt";
ЗаписьТекста = Новый ЗаписьТекста(ИмяФайлаОтправки, КодировкаТекста.ANSI); 
ЗаписьТекста.Записать("email=" + Логин + "&password=" + Пароль);
ЗаписьТекста.Закрыть();

Шаг 2: Настройка заголовков и выполнение запроса

Для того чтобы сервер воспринял наш запрос как легитимный, мы должны настроить HTTP-заголовки. Особое внимание следует уделить Content-Type, который должен иметь значение application/x-www-form-urlencoded. Также рекомендуется подставлять User-Agent современного браузера, чтобы избежать блокировок со стороны систем защиты (WAF).

Выясним причину, по которой сервер может отклонить запрос. Если мы не укажем Referer, некоторые системы безопасности могут счесть запрос подозрительным. Проанализируем программный код выполнения запроса:


АдресСервера = "rosrabota.ru";
АдресСтраницыАвторизации = "new/login";
Соединение = Новый HTTPСоединение(АдресСервера, 443, , , , , Новый ЗащищенноеСоединениеOpenSSL());

Заголовки = Новый Соответствие();
Заголовки.Вставить("Host", АдресСервера);
Заголовки.Вставить("Content-Type", "application/x-www-form-urlencoded");
Заголовки.Вставить("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36");

Попытка
    ОтветHTTP = Соединение.ОтправитьДляОбработки(ИмяФайлаОтправки, АдресСтраницыАвторизации, "answer.html", Заголовки);
Исключение
    Сообщить("Ошибка соединения: " + ОписаниеОшибки());
    Возврат;
КонецПопытки;

Шаг 3: Работа с Cookie (Сессиями)

Самый важный этап после успешного POST-запроса — получение и сохранение идентификатора сессии. Сервер передает его в заголовке Set-Cookie. Однако этот заголовок часто содержит много лишней информации (пути, домены, сроки истечения), в то время как для последующих запросов нам нужна только "чистая" часть идентификатора.

Посмотрим на пример обработки заголовков ответа для извлечения куки sess:


СтрокаКуки = ОтветHTTP.Заголовки.Получить("Set-Cookie");
// Обычно кука выглядит так: sess=хххххххххххххххххх; path=/; domain=.rosrabota.ru
// Нам нужно извлечь только часть до первой точки с запятой
ПозицияРазделителя = СтрНайти(СтрокаКуки, ";");
Если ПозицияРазделителя > 0 Тогда
    ЧистаяКука = Лев(СтрокаКуки, ПозицияРазделителя);
Иначе
    ЧистаяКука = СтрокаКуки;
КонецЕсли;

Шаг 4: Получение защищенного контента

Теперь, когда у нас есть ЧистаяКука, мы можем выполнить GET-запрос для скачивания PDF-файла. Мы должны передать полученную куку в заголовке Cookie. Это скажет серверу, что мы уже авторизованы.

Рассмотрим финальный этап получения файла:


ИмяФайлаРезюме = КаталогВременныхФайлов() + "resume_1672783.pdf";
GETЗаголовки = Новый Соответствие();
GETЗаголовки.Вставить("Cookie", ЧистаяКука);
GETЗаголовки.Вставить("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/110.0.0.0 Safari/537.36");

ОтветPDF = Соединение.Получить("/my-response-download-pdf/1672783", ИмяФайлаРезюме, GETЗаголовки);

Если ОтветPDF.КодСостояния = 200 Тогда
    Сообщить("Файл успешно скачан в: " + ИмяФайлаРезюме);
Иначе
    Сообщить("Не удалось скачать файл. Код состояния: " + ОтветPDF.КодСостояния);
КонецЕсли;

Дополнительные рекомендации для стабильной работы

При работе с высоконагруженными порталами, такими как rosrabota.ru (интегрированными с Rabota.ru), следует учитывать несколько нюансов:

  1. Использование SSL/TLS: Всегда используйте объект ЗащищенноеСоединениеOpenSSL() при создании HTTPСоединение, так как современные сайты принудительно работают через HTTPS (порт 443).
  2. Защита от CSRF: Некоторые формы авторизации содержат скрытые токены. Если простой POST не срабатывает, попробуйте сначала сделать GET-запрос на страницу логина, найти в тексте страницы скрытое поле _csrf или аналогичный токен и добавить его значение в POST-параметры.
  3. Паузы между запросами: При массовом скачивании резюме сервер может временно заблокировать ваш IP за подозрительную активность. Используйте небольшие задержки (функция Приостановить) между итерациями цикла.
  4. Обновление кук: Сессионные куки имеют свойство "протухать". Рекомендуется проверять код состояния ответа (если пришел 302 вместо 200, значит сессия истекла и нужно авторизоваться заново).

Проанализировав ситуацию, мы выяснили, что ключ к успеху лежит в трех вещах: правильные имена полей формы, кодировка ANSI для кириллических или специфических данных и аккуратная очистка кук перед повторной отправкой. Следуя этим шагам, вы сможете надежно автоматизировать сбор данных с сайта в среде 1С.

← На главную