Разработка механизмов автоматического перевода внутри учетных систем 1С — задача довольно востребованная, особенно в конфигурациях, работающих с международными справочниками номенклатуры или внешними заказами. Однако при попытке «в лоб» получить текст перевода путем парсинга страницы translate.google.com разработчики часто сталкиваются с техническими преградами: от ошибок перенаправления (302 Moved) до получения пустого HTML-кода без самого результата перевода. В этой статье мы детально разберем, почему стандартный подход с парсингом тегов не работает, и рассмотрим эффективные альтернативы.
Первая проблема, с которой сталкивается программист при отправке запроса к Google — получение статуса ответа 302 Moved Temporarily. Разберем ситуацию: этот код состояния означает, что запрашиваемый ресурс временно находится по другому адресу. В контексте сервисов Google это чаще всего связано с автоматическим перенаправлением с протокола HTTP на HTTPS или с одного регионального домена на другой (например, с .ru на .com).
Для корректной работы в 1С при создании объекта HTTPСоединение мы обязательно должны использовать защищенное соединение. В современных версиях платформы 1С:Предприятие 8.3 это реализуется через объект ЗащищенноеСоединениеOpenSSL. Если не инициализировать этот параметр, сервер Google будет постоянно «отфутболивать» запрос, пытаясь перевести сессию в защищенный режим.
Рассмотрим правильный способ инициализации соединения:
// Определяем настройки защищенного соединения
СертификатыУдостоверяющихЦентров = Новый СертификатыУдостоверяющихЦентровWindows();
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL(Неопределено, СертификатыУдостоверяющихЦентров);
// Создаем соединение с указанием защищенного протокола
HTTPСервис = Новый HTTPСоединение("translate.google.com", 443, , , , 30, ЗащищенноеСоединение);
Даже если мы успешно обойдем редиректы и получим тело страницы (код 200 OK), мы обнаружим, что в тексте HTML-документа нет переведенного слова. Проанализируем архитектуру современного Google Переводчика: это так называемое SPA (Single Page Application). При открытии ссылки в браузере сначала загружается тяжелый каркас из JavaScript-скриптов и CSS-стилей, и только потом, через фоновые AJAX-запросы, браузер обращается к серверному API за самим переводом.
Метод HTTPСоединение.Получить() в 1С не является браузером — он не исполняет JavaScript. Он просто скачивает статический код. Именно поэтому попытки использовать ПостроительDOM или ЧтениеHTML для поиска нужного тега с результатом перевода бесполезны — этого текста просто нет в исходном коде страницы в момент загрузки.
Вместо того чтобы пытаться имитировать действия пользователя на сайте, мы можем использовать служебный эндпоинт, который Google использует для своих расширений. Этот метод возвращает данные в формате JSON, который легко обрабатывается встроенными средствами 1С. Рассмотрим этот метод подробнее.
Для реализации нам потребуется сформировать GET-запрос к адресу translate.googleapis.com/translate_a/single. Ключевым параметром здесь является client=gtx, который позволяет выполнять простые запросы без необходимости сложной генерации токенов безопасности.
Разберем по шагам создание функции перевода:
Функция ПолучитьПереводТекста(ИсходныйТекст, ЯзыкС, ЯзыкНа)
Домен = "translate.googleapis.com";
// Кодируем текст для передачи в URL
ТекстURL = КодироватьСтроку(ИсходныйТекст, СпособКодированияСтроки.КодированиеURL);
ЗапросТекст = "/translate_a/single?client=gtx&sl=" + ЯзыкС + "&tl=" + ЯзыкНа + "&dt=t&q=" + ТекстURL;
// Настройка соединения (обязательно HTTPS)
Защита = Новый ЗащищенноеСоединениеOpenSSL();
Соединение = Новый HTTPСоединение(Домен, 443, , , , 15, Защита);
Запрос = Новый HTTPЗапрос(ЗапросТекст);
Попытка
Ответ = Соединение.Получить(Запрос);
Если Ответ.КодСостояния = 200 Тогда
// Google возвращает специфический массив массивов
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());
Данные = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
// Результат обычно находится в первом элементе
Попытка
Возврат Данные[0][0][0];
Исключение
Возврат "Ошибка структуры данных";
КонецПопытки;
Иначе
Возврат "Ошибка сервера: " + Ответ.КодСостояния;
КонецПопытки;
Исключение
Возврат "Ошибка связи: " + ОписаниеОшибки();
КонецПопытки;
КонецФункции
Если мы планируем переводить большие объемы данных (например, тысячи карточек товаров), Google быстро распознает в нас бота и заблокирует IP-адрес, выдав капчу. Выясним, как сделать наш запрос более «человекоподобным».
Использование User-Agent. По умолчанию 1С не передает заголовок User-Agent, либо передает свой собственный. Серверы Google сразу видят, что запрос идет не из браузера. Нам необходимо добавить заголовок, имитирующий популярный браузер (Chrome или Firefox).
Заголовок GOOGLE_ABUSE_EXEMPTION. Как упоминалось в обсуждении, если вы уже получили блокировку, иногда помогает передача специального токена в куках. Однако для автоматизации в 1С это сложнореализуемо, так как токен нужно сначала получить вручную в браузере. Лучшая стратегия — делать паузы между запросами (использовать Приостановить(1)) или использовать прокси-серверы.
Пример добавления заголовков в запрос:
Запрос = Новый HTTPЗапрос(ЗапросТекст);
Запрос.Заголовки.Вставить("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36");
Запрос.Заголовки.Вставить("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
Проанализируем ситуацию: стоит ли тратить время на поддержку «бесплатного» парсинга Google, который может сломаться в любой момент при изменении алгоритмов защиты? Профессиональное решение подразумевает использование официальных API.
Подводя итог, можно сказать: прямой парсинг HTML-страницы Google Translate — это тупиковый путь для 1С. Рациональнее использовать либо скрытые эндпоинты (как в примере с client=gtx), либо переходить на официальные API-сервисы, которые обеспечивают стабильность работы вашей системы.