Найден корректный robots.txt
Файл управления сканированием сайта роботами
?
Robots.txt указывает поисковым роботам, какие страницы сканировать, а какие — нет. Ошибки в файле могут случайно закрыть важные разделы от индексации.
Robots.txt настроен корректно. Размер файла: 46696 байт. Загружен за: 0сек.
Проверяемая страница не запрещена в robots.txt.
Цепочка редиректов для файла robots.txt:
http://megahardpars.ru/robots.txt
301 MovedPermanently
https://megahardpars.ru/robots.txt
200 OK
Показать содержимое robots.txt
<!doctype html>
<html lang="ru">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Hard Pars</title>
<link rel="icon" type="image/png" href="/icon.hard-pars.png">
<link rel="stylesheet" href="/styles.css">
</head>
<body class="auth-pending">
<section class="auth-gate" id="authGate" aria-labelledby="authTitle" hidden>
<form class="auth-card" id="loginForm">
<div class="auth-brand">Hard Pars</div>
<h1 id="authTitle">Вход в систему</h1>
<label>
Логин
<input id="loginUsername" type="text" autocomplete="username" required autofocus>
</label>
<label>
Пароль
<input id="loginPassword" type="password" autocomplete="current-password" required>
</label>
<button type="submit">Войти</button>
<p id="loginStatus" role="status" aria-live="polite"></p>
</form>
</section>
<aside class="history-sidebar" aria-label="История ссылок">
<div class="history-header">
<h2>История</h2>
<div class="history-header-actions">
<button id="refreshHistoryButton" type="button" hidden>Обновить</button>
<button id="clearHistoryButton" type="button">Очистить</button>
</div>
</div>
<div class="history-tabs" role="tablist" aria-label="Фильтр истории">
<button class="history-tab is-active" type="button" data-history-scope="local">Моя</button>
<button class="history-tab" type="button" data-history-scope="project">Проект</button>
</div>
<label class="history-search-label" for="historySearch">Фильтр</label>
<input
class="history-search"
id="historySearch"
name="hard-pars-history-filter"
type="search"
autocomplete="one-time-code"
data-1p-ignore
data-lpignore="true"
readonly
spellcheck="false"
placeholder="Название, ссылка или код"
>
<label class="history-search-label" for="historyLimit">Показ</label>
<select class="history-limit" id="historyLimit">
<option value="5" selected>Последние 5</option>
<option value="all">Показать все</option>
</select>
<div class="history-list" id="historyList"></div>
</aside>
<main class="compose" id="compose" aria-labelledby="page-title">
<div class="app-topbar">
<div class="mode-tabs" role="tablist" aria-label="Режим работы">
<button class="mode-tab is-active" type="button" data-tool-mode="url">Парсинг Html из ссылок</button>
<button class="mode-tab" id="userAttributesModeTab" type="button" data-tool-mode="user-attributes" hidden>Обработка</button>
<button class="mode-tab" id="autoBoundariesModeTab" type="button" data-tool-mode="auto-boundaries" hidden>Автограницы</button>
<button class="mode-tab" id="modelPricesModeTab" type="button" data-tool-mode="model-prices" hidden>Цены</button>
<button class="mode-tab" type="button" data-tool-mode="attributes">Атрибуты</button>
<button class="mode-tab" type="button" data-tool-mode="profiles">Профили</button>
<button class="mode-tab" id="adminModeTab" type="button" data-tool-mode="admin" hidden>Админ</button>
</div>
<div class="account-strip" id="accountStrip" hidden>
<button class="profile-menu-button" id="profileMenuButton" type="button" aria-label="Профиль" aria-expanded="false" aria-controls="profileMenu" title="Профиль"><span class="profile-person-icon" aria-hidden="true"></span></button>
<div class="profile-menu" id="profileMenu" hidden>
<div class="profile-summary">
<strong id="currentUserLabel"></strong>
<span id="currentUserRole"></span>
</div>
<form id="profileForm" class="profile-form">
<label>Логин<input id="profileUsername" type="text" autocomplete="username" required></label>
<label>Текущий пароль<input id="profileCurrentPassword" type="password" autocomplete="current-password" required></label>
<label>Новый пароль<input id="profileNewPassword" type="password" autocomplete="new-password" placeholder="Не менять"></label>
<label>Повторите пароль<input id="profileConfirmPassword" type="password" autocomplete="new-password" placeholder="Не менять"></label>
<button type="submit">Сохранить профиль</button>
</form>
<details class="profile-worker-settings" id="profileWorkerSettings">
<summary>Worker</summary>
<div class="profile-worker-status-row">
<span class="worker-status-dot" id="workerStatusDot" aria-hidden="true"></span>
<strong id="workerStatusLabel">Не подключен</strong>
</div>
<div class="profile-worker-token" id="workerTokenBox" hidden>
<input id="workerTokenOutput" type="text" readonly aria-label="Токен Worker">
<button id="copyWorkerTokenButton" type="button">Копировать</button>
</div>
<div class="profile-worker-actions">
<a class="worker-download-link" href="/api/worker/download" download>Скачать Worker ZIP</a>
<button id="createWorkerTokenButton" type="button">Новый токен</button>
<button id="refreshWorkerStatusButton" type="button">Проверить</button>
<button class="danger-button" id="revokeWorkerTokenButton" type="button">Отключить</button>
</div>
<p id="workerProfileStatus" role="status" aria-live="polite">Скачайте ZIP, распакуйте его, запустите setup-worker.bat и вставьте персональный токен.</p>
</details>
<p id="profileStatus" role="status" aria-live="polite"></p>
<button class="profile-logout-button" id="logoutButton" type="button">Выйти</button>
</div>
</div>
</div>
<section class="tool-panel user-attributes-panel" id="userAttributesPanel" data-tool-panel="user-attributes" aria-label="Обработка товаров" hidden>
<section class="toolbar">
<div>
<h1>Обработка товаров</h1>
<p>Выберите настройки, вставьте ссылки и получите готовый результат</p>
</div>
</section>
<section class="user-workflow-box">
<div class="user-workflow-settings">
<label>Проект<select id="userAttributeProject"></select></label>
<label>Категория<select id="userAttributeTemplate"></select></label>
<label title="Количество страниц, которые Botasaurus обрабатывает одновременно. Влияет только на загрузку HTML; ИИ обрабатывает товары по одному в очереди.">
Потоки
<select id="userAttributeThreads" title="Одновременно можно обрабатывать от 1 до 3 страниц. ИИ всегда обрабатывает товары по одному.">
<option value="1">1</option>
<option value="2" selected>2</option>
<option value="3">3</option>
</select>
</label>
<label>Пауза от, сек<input id="userAttributeDelayMin" type="number" min="0" max="300" value="0"></label>
<label>Пауза до, сек<input id="userAttributeDelayMax" type="number" min="0" max="300" value="0"></label>
</div>
<div class="user-workflow-options">
<label><input id="userAttributeAi" type="checkbox" checked><span>Обработать атрибуты ИИ</span></label>
<label><input id="userAttributeTable" type="checkbox"><span>Добавить таблицу атрибутов</span></label>
<label><input id="userAttributeDescription" type="checkbox"><span>Добавить описание</span></label>
<button id="saveAllUserAttribute" class="user-master-save-button" type="button" title="Сохранить все настройки вкладки «Обработка», ИИ-настройки и ссылки выбранного проекта">Сохранить всё</button>
</div>
<div id="userAiSettingsProcessingHost">
<details class="user-ai-settings" id="sharedUserAiSettings">
<summary>ИИ-настройки</summary>
<div class="user-ai-settings-grid">
<section class="user-ai-channel">
<h3>Атрибуты</h3>
<label class="user-ai-photo-analysis" title="Если включено, ИИ получит до пяти фотографий товара и сможет определять по ним только атрибуты с флагом «По фото».">
<input id="userAttributePhotoAnalysis" type="checkbox">
<span>Анализ по фото</span>
</label>
<label>Способ
<select id="userAttributeAiTransport">
<option value="api">OpenRouter API</option>
<option value="browser">ИИ через браузер</option>
</select>
</label>
<div id="userAttributeApiControls" class="user-ai-api-controls">
<label>ИИ-модель<select id="userAttributeAiModel"></select></label>
<label>OpenRouter API key<input id="userAttributeAiKey" type="password" autocomplete="off" placeholder="sk-or-..."></label>
</div>
<div id="userAttributeBrowserControls" class="user-ai-browser-controls" hidden>
<label>ИИ через браузер
<select id="userAttributeBrowserProvider">
<option value="chatgpt">ChatGPT</option>
<option value="deepseek">DeepSeek</option>
</select>
</label>
<button id="userOpenAttributeChatGpt" type="button">Открыть ИИ</button>
<button id="userCheckAttributeChatGpt" type="button">Проверить вход</button>
</div>
</section>
<section class="user-ai-channel">
<h3>Описание</h3>
<label>Способ
<select id="userDescriptionAiTransport">
<option value="api">OpenRouter API</option>
<option value="browser">ИИ через браузер</option>
</select>
</label>
<div id="userDescriptionApiControls" class="user-ai-api-controls">
<label>ИИ-модель<select id="userDescriptionAiModel"></select></label>
<label>OpenRouter API key<input id="userDescriptionAiKey" type="password" autocomplete="off" placeholder="Можно использовать ключ атрибутов"></label>
</div>
<div id="userDescriptionBrowserControls" class="user-ai-browser-controls" hidden>
<label>ИИ через браузер
<select id="userDescriptionBrowserProvider">
<option value="chatgpt">ChatGPT</option>
<option value="deepseek">DeepSeek</option>
</select>
</label>
<button id="userOpenDescriptionChatGpt" type="button">Открыть ИИ</button>
<button id="userCheckDescriptionChatGpt" type="button">Проверить вход</button>
</div>
</section>
</div>
<div class="user-ai-settings-footer">
<button id="saveUserAiSettings" type="button">Сохранить ИИ-настройки</button>
<button id="clearUserChatGptProcess" type="button">Очистить мой процесс</button>
<span id="userChatGptStatus" role="status" aria-live="polite"></span>
</div>
</details>
</div>
<label class="user-workflow-links">Ссылки на товары<textarea id="userAttributeLinks" placeholder="Каждая ссылка с новой строки"></textarea></label>
<div class="user-workflow-actions">
<button id="saveUserAttributeLinks" type="button">Сохранить ссылки</button>
<button id="runUserAttributeButton" type="button">Запуск</button>
<button id="cancelUserAttributeButton" type="button" hidden>Отмена</button>
</div>
<div class="user-workflow-progress" id="userAttributeProgress" hidden>
<div><span id="userAttributeProgressText">Подготовка...</span><strong id="userAttributeProgressCount">0 из 0</strong></div>
<progress id="userAttributeProgressBar" max="1" value="0"></progress>
</div>
<p id="userAttributeStatus" role="status" aria-live="polite"></p>
</section>
<section class="user-workflow-box">
<div class="user-results-heading">
<h2>Готовые ссылки</h2>
<button id="clearUserAttributeResults" type="button">Очистить</button>
</div>
<div id="userAttributeResults" class="user-attribute-results"></div>
</section>
</section>
<section class="tool-panel auto-boundaries-panel" id="autoBoundariesPanel" data-tool-panel="auto-boundaries" aria-label="Автоопределение границ" hidden>
<section class="toolbar">
<div>
<h1>Автоопределение границ</h1>
<p>Автоматическое извлечение данных товара без ручной настройки границ</p>
</div>
</section>
<section class="user-workflow-box">
<div class="user-workflow-settings auto-boundary-settings">
<label>Категория<select id="autoBoundaryTemplate"></select></label>
<label title="Количество страниц, которые Botasaurus обрабатывает одновременно. Влияет только на загрузку HTML; ИИ обрабатывает товары по одному в очереди.">
Потоки
<select id="autoBoundaryThreads" title="Одновременно можно обрабатывать от 1 до 3 страниц. ИИ всегда обрабатывает товары по одному.">
<option value="1" selected>1</option>
<option value="2">2</option>
<option value="3">3</option>
</select>
</label>
<label>Таймаут, сек<input id="autoBoundaryTimeout" type="number" min="30" max="240" value="120"></label>
</div>
<div class="user-workflow-options">
<label><input id="autoBoundaryAi" type="checkbox" checked><span>Обработать атрибуты ИИ</span></label>
<label><input id="autoBoundaryTable" type="checkbox"><span>Добавить таблицу атрибутов</span></label>
<label><input id="autoBoundaryDescription" type="checkbox"><span>Добавить описание</span></label>
<button id="saveAllAutoBoundary" class="user-master-save-button" type="button" title="Сохранить все настройки и ссылки вкладки «Автоопределение границ»">Сохранить всё</button>
</div>
<div id="userAiSettingsAutoBoundaryHost"></div>
<label class="user-workflow-links">Донорские ссылки<textarea id="autoBoundaryLinks" placeholder="Каждая ссылка с новой строки"></textarea></label>
<div class="user-workflow-actions">
<button id="saveAutoBoundaryLinks" type="button">Сохранить ссылки</button>
<button id="runAutoBoundaryButton" type="button">Запуск</button>
<button id="cancelAutoBoundaryButton" type="button" hidden>Отмена</button>
<button id="clearAutoBoundaryButton" type="button">Очистить</button>
</div>
<div class="user-workflow-progress" id="autoBoundaryProgress" hidden>
<div><span id="autoBoundaryProgressText">Подготовка...</span><strong id="autoBoundaryProgressCount">0 из 0</strong></div>
<progress id="autoBoundaryProgressBar" max="1" value="0"></progress>
</div>
<p id="autoBoundaryStatus" role="status" aria-live="polite"></p>
</section>
<section class="user-workflow-box">
<div class="user-results-heading">
<h2>Готовые ссылки</h2>
<button id="clearAutoBoundaryResults" type="button">Очистить</button>
</div>
<div id="autoBoundaryResults" class="user-attribute-results"></div>
</section>
</section>
<section class="tool-panel model-prices-panel" id="modelPricesPanel" data-tool-panel="model-prices" aria-label="Сбор цен по моделям" hidden>
<section class="toolbar">
<div>
<h1>Цены по моделям</h1>
<p>Поиск моделей на сайте донора и выгрузка текущей/старой цены</p>
</div>
</section>
<section class="user-workflow-box">
<div class="model-price-header">
<div>
<h2>Проекты цен</h2>
<p>Каждый проект хранит свои селекторы, исключения, список моделей и результаты.</p>
</div>
<button id="saveAllModelPriceSettings" class="user-master-save-button" type="button" title="Сохранить все настройки вкладки «Цены» и список моделей">Сохранить всё</button>
</div>
<select id="modelPriceProjectSelect" class="model-price-native-select" aria-label="Проект цен"></select>
<div class="model-price-project-toolbar">
<div id="modelPriceProjectChips" class="model-price-project-cards" aria-label="Проекты цен"></div>
<button id="addModelPriceProject" class="model-price-add-project-button" type="button" title="Создать новый пустой проект цен">+ проект</button>
</div>
<section id="modelPriceProjectWorkspace" class="model-price-project-workspace" hidden>
<div class="model-price-project-workspace-dialog" role="dialog" aria-modal="true" aria-labelledby="modelPriceProjectWorkspaceTitle">
<div class="model-price-project-workspace-head">
<div>
<h2 id="modelPriceProjectWorkspaceTitle">Проект цен</h2>
<p>Настройки выбранного донора, список моделей и результаты обработки.</p>
</div>
<button id="closeModelPriceProject" type="button" title="Закрыть настройки проекта">Закрыть</button>
</div>
<details class="model-price-donor-settings" id="modelPriceDonorSettings" open>
<summary>Настройки донора</summary>
<div class="model-price-project-edit-row">
<label title="Название выбранного проекта цен. Например Korting, Mvideo, DNS.">Название проекта
<input id="modelPriceProjectName" type="text" placeholder="Например Korting">
</label>
<button id="renameModelPriceProject" type="button" title="Сохранить новое название выбранного проекта">Сохранить имя</button>
<button id="deleteModelPriceProject" type="button" title="Удалить выбранный проект цен">Удалить проект</button>
</div>
<div class="model-price-settings-grid">
<label title="Главная страница донора, где бот откроет поиск. Можно не заполнять, если используете шаблон URL поиска.">Базовый URL сайта<input id="modelPriceBaseUrl" type="url" placeholder="https://site.ru/" title="Главная страница донора, где бот откроет поиск. Можно не заполнять, если используете шаблон URL поиска."></label>
<label title="CSS-селектор поля поиска на сайте. Бот вставит модель и нажмет Enter.">Селектор поиска<input id="modelPriceSearchSelector" type="text" placeholder='input[name="q"]' title="CSS-селектор поля поиска на сайте. Бот вставит модель и нажмет Enter."></label>
<label title="Запасной путь, если поиск на странице не сработал. Вместо {model} подставится модель.">Шаблон URL поиска<input id="modelPriceSearchUrlTemplate" type="text" placeholder="https://site.ru/search/?q={model}" title="Запасной путь, если поиск на странице не сработал. Вместо {model} подставится модель."></label>
<label title="Общий CSS-селектор карточки товара в выдаче поиска.">Блок результата<input id="modelPriceResultItemSelector" type="text" placeholder=".product-card" title="Общий CSS-селектор карточки товара в выдаче поиска."></label>
<label title="CSS-селектор ссылки внутри карточки результата, по которой бот откроет товар.">Ссылка результата<input id="modelPriceResultLinkSelector" type="text" placeholder=".product-card a" title="CSS-селектор ссылки внутри карточки результата, по которой бот откроет товар."></label>
<label title="CSS-селектор названия или отдельной модели на странице товара. По нему проверяется точное совпадение.">Название / модель<input id="modelPriceModelSelector" type="text" value="h1" placeholder="h1" title="CSS-селектор названия или отдельной модели на странице товара. По нему проверяется точное совпадение."></label>
<label title="CSS-селектор актуальной цены. Если товар по акции, сюда обычно попадает новая цена.">Текущая цена<input id="modelPriceCurrentPriceSelector" type="text" placeholder=".price-current" title="CSS-селектор актуальной цены. Если товар по акции, сюда обычно попадает новая цена."></label>
<label title="CSS-селектор зачеркнутой или прежней цены. Можно оставить пустым, если на сайте ее нет.">Старая цена<input id="modelPriceOldPriceSelector" type="text" placeholder=".price-old" title="CSS-селектор зачеркнутой или прежней цены. Можно оставить пустым, если на сайте ее нет."></label>
<label title="CSS-селектор текста наличия. «Под заказ» считается наличием, отсутствующие товары уйдут вниз файла.">Наличие<input id="modelPriceAvailabilitySelector" type="text" placeholder=".availability" title="CSS-селектор текста наличия. «Под заказ» считается наличием, отсутствующие товары уйдут вниз файла."></label>
<label title="Сколько моделей искать одновременно. Для этой вкладки максимум 5; остальные обработки остаются со своими лимитами.">Потоки
<select id="modelPriceThreads" title="Одновременно можно искать 1-5 моделей. Это не ИИ, только браузерный поиск и чтение цен.">
<option value="1" selected>1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
</select>
</label>
<label title="Сколько ждать загрузку поиска или карточки товара перед ошибкой по конкретной модели.">Таймаут, сек<input id="modelPriceTimeout" type="number" min="20" max="300" value="90" title="Сколько ждать загрузку поиска или карточки товара перед ошибкой по конкретной модели."></label>
</div>
<div class="model-price-fallback-donors-panel">
<div class="model-price-fallback-donors-head">
<div>
<h3>Дополнительные доноры</h3>
<p>Если модель не найдена у основного донора, бот проверит эти сайты по очереди.</p>
</div>
<button id="addModelPriceFallbackDonor" type="button" title="Добавить запасной сайт-донора с отдельными селекторами">+ доп донор</button>
</div>
<div id="modelPriceFallbackDonors" class="model-price-fallback-donors"></div>
</div>
</details>
<details class="model-price-donor-settings">
<summary>Исключения и дополнительные поля</summary>
<div class="model-price-two-columns">
<label title="Слова, которые нужно убрать из названия перед сравнением модели: бренд, тип товара, лишние приписки.">Исключения из модели<textarea id="modelPriceModelExclusions" placeholder="Бренд или лишние слова, каждое с новой строки" title="Слова, которые нужно убрать из названия перед сравнением модели: бренд, тип товара, лишние приписки."></textarea></label>
<label title="Необязательные поля для выгрузки дополнительных данных, например артикул или срок доставки.">Доп. селекторы<textarea id="modelPriceExtraSelectors" placeholder="Каждый селектор с новой строки, если нужно выгрузить доп. данные" title="Необязательные поля для выгрузки дополнительных данных, например артикул или срок доставки."></textarea></label>
</div>
</details>
<details class="model-price-donor-settings" open>
<summary>Модели для поиска</summary>
<label class="user-workflow-links" title="Одна модель на строку. Совпадение проверяется по полной буквенно-циферной маркировке.">Список моделей<textarea id="modelPriceModels" placeholder="Каждая модель с новой строки" title="Одна модель на строку. Совпадение проверяется по полной буквенно-циферной маркировке."></textarea></label>
</details>
<div class="user-workflow-actions">
<button id="saveModelPriceSettings" type="button">Сохранить</button>
<button id="runModelPriceScan" type="button">Запуск</button>
<button id="cancelModelPriceScan" type="button" hidden>Отмена</button>
<button id="downloadModelPriceResults" type="button" disabled>Скачать CSV</button>
<button id="clearModelPriceResults" type="button">Очистить</button>
</div>
<div class="user-workflow-progress" id="modelPriceProgress" hidden>
<div><span id="modelPriceProgressText">Подготовка...</span><strong id="modelPriceProgressCount">0 из 0</strong></div>
<progress id="modelPriceProgressBar" max="1" value="0"></progress>
</div>
<p id="modelPriceStatus" role="status" aria-live="polite"></p>
<section class="model-price-results-panel">
<div class="user-results-heading">
<h2>Результаты цен</h2>
<span id="modelPriceSummary"></span>
</div>
<div id="modelPriceResults" class="model-price-results"></div>
</section>
</div>
</section>
</section>
</section>
<section class="tool-panel fetch-panel is-active" data-tool-panel="url" aria-label="Получить исходный код страницы">
<section class="toolbar" aria-label="Панель создания ссылок">
<div>
<h1>Парсинг Html по ссылкам</h1>
<p>Вставьте ссылки, получите готовый список</p>
</div>
<div class="fetch-toolbar-actions">
<label class="source-threads-label" for="sourceThreads" title="Сколько ссылок обрабатывать одновременно. Чем больше потоков, тем выше нагрузка на компьютер и Botasaurus.">
Потоки
<select id="sourceThreads" class="source-threads-select" title="Сколько ссылок обрабатывать одновременно. Для тяжелых сайтов лучше 1-2.">
<option value="1" selected>1</option>
<option value="2">2</option>
<option value="3">3</option>
</select>
</label>
<label class="source-timeout-label" for="sourceTimeout" title="Сколько секунд ждать ответ по каждой отдельной ссылке. 0 означает не обрывать ожидание по времени.">
Таймаут, сек
<input
id="sourceTimeout"
class="source-timeout-input"
type="number"
min="0"
max="300"
step="10"
value="180"
title="Сколько секунд ждать ответ по каждой отдельной ссылке. 0 означает не обрывать ожидание по времени."
>
</label>
<label class="source-delay-label" for="sourceDelay" title="Пауза перед запуском следующей ссылки в каждом потоке. Помогает снизить нагрузку и реже ловить защиту сайта.">
Пауза, сек
<input
id="sourceDelay"
class="source-delay-input"
type="number"
min="0"
max="300"
step="1"
value="5"
title="Пауза перед запуском следующей ссылки в каждом потоке. 0 означает без паузы."
>
</label>
<button id="saveSourceSettingsButton" type="button">Сохранить</button>
<button id="fetchSourceButton" type="button">Создать ссылки</button>
<button id="cancelFetchButton" type="button" hidden>Отмена</button>
</div>
</section>
<div class="source-workspace">
<div class="source-main-column">
<label class="source-url-label" for="sourceUrl">Ссылки для обработки</label>
<textarea
class="source-url-input"
id="sourceUrl"
autocomplete="off"
spellcheck="false"
placeholder="Вставьте одну ссылку или список ссылок, каждая с новой строки"
></textarea>
<p id="fetchStatus" role="status" aria-live="polite"></p>
<div class="fetch-results" id="fetchResults"></div>
</div>
<aside class="source-live-panel" aria-label="Логи обработки ссылок">
<div class="source-live-header">
<h2>Логи обработки</h2>
<button id="clearSourceLogsButton" type="button">Очистить</button>
</div>
<div class="source-live-logs" id="sourceLiveLogs"></div>
</aside>
</div>
</section>
<section class="tool-panel attributes-panel" data-tool-panel="attributes" aria-label="Подготовка атрибутов товаров">
<section class="toolbar" aria-label="Панель подготовки атрибутов">
<div>
<h1>Атрибуты</h1>
<p>Извлечение характеристик донора в готовый шаблон короткой ссылки</p>
</div>
<div class="attribute-toolbar-actions">
<button id="copyAttributeLinksButton" type="button">Скопировать ссылки</button>
<button id="copyAttributeAiLinksButton" type="button">Скопировать ИИ</button>
<button id="saveAllAttributeSettingsButton" type="button" title="Сохраняет все настройки вкладки Атрибуты: запуск, ИИ, проекты, границы, сопоставления, ссылки и фильтры.">Сохранить</button>
<details class="attribute-backup-menu">
<summary title="Бэкап и восстановление атрибутов">⋯</summary>
<div class="attribute-backup-dropdown">
<button id="backupAttributeSettingsButton" type="button" title="Скачать JSON-бэкап категорий, атрибутов, проектов, границ, ссылок и последних результатов. API-ключ в бэкап не попадает.">Скачать бэкап</button>
<button id="restoreAttributeSettingsButton" type="button" title="Восстановить вкладку Атрибуты из JSON-бэкапа.">Восстановить</button>
<input id="restoreAttributeSettingsInput" type="file" accept="application/json,.json" hidden>
</div>
</details>
</div>
</section>
<div class="attributes-grid">
<section class="attribute-box attribute-run-box">
<h2>Параметры запуска</h2>
<div class="attribute-settings attribute-run-controls">
<label title="Количество страниц, которые Botasaurus обрабатывает одновременно. Влияет только на загрузку HTML; ИИ обрабатывает товары по одному в очереди.">
Потоки
<select id="attributeThreads" title="Одновременно можно обрабатывать от 1 до 3 страниц. ИИ всегда обрабатывает товары по одному.">
<option value="1">1</option>
<option value="2" selected>2</option>
<option value="3">3</option>
</select>
</label>
<label title="Пауза после обработки текущей ссылки и перед открытием следующей.">
Пауза от, сек
<input id="attributeDelayMin" type="number" min="0" max="300" step="1" value="0">
</label>
<label title="Пауза после обработки текущей ссылки и перед открытием следующей.">
Пауза до, сек
<input id="attributeDelayMax" type="number" min="0" max="300" step="1" value="0">
</label>
<label class="attribute-project-check attribute-manual-all-chip">
<input id="attributeAllProjects" type="checkbox">
<span>Все проекты</span>
</label>
<label class="attribute-run-projects">
Проекты запуска
<div id="attributeProjectSelect" class="attribute-project-picker"></div>
</label>
<div class="attribute-ai-settings-grid">
<fieldset class="attribute-ai-channel">
<legend>ИИ атрибутов</legend>
<div class="attribute-ai-channel-controls">
<label>
Способ
<select id="attributeAiTransport">
<option value="api">OpenRouter API</option>
<option value="browser">ИИ через браузер</option>
</select>
</label>
<label class="attribute-project-check attribute-auto-ai-check" title="Если включено, сервис после обработки каждой ссылки сразу отправит данные выбранному ИИ.">
<input id="attributeAutoAi" type="checkbox">
<span>Авто ИИ</span>
</label>
<label class="attribute-project-check attribute-auto-ai-check" title="Если включено, ИИ получит до пяти фотографий товара и сможет определять по ним только атрибуты с флагом «По фото».">
<input id="attributePhotoAnalysis" type="checkbox">
<span>Анализ по фото</span>
</label>
<div id="attributeApiAiControls" class="attribute-api-ai-controls">
<label>
ИИ-модель
<select id="attributeAiModel" class="ai-model-select">
<optgroup label="Бесплатные быстрые / атрибуты">
<option value="openai/gpt-oss-20b:free" selected>OpenAI GPT-OSS 20B Free (131 072 токенов)</option>
<option value="liquid/lfm-2.5-1.2b-instruct:free">Liquid LFM 2.5 1.2B Instruct Free (32 768 токенов)</option>
<option value="meta-llama/llama-3.2-3b-instruct:free">Llama 3.2 3B Instruct Free (131 072 токенов)</option>
<option value="nvidia/nemotron-nano-9b-v2:free">Nemotron Nano 9B V2 Free (128 000 токенов)</option>
<option value="poolside/laguna-xs.2:free">Poolside Laguna XS.2 Free (262 144 токенов)</option>
</optgroup>
<optgroup label="Бесплатные точнее / тяжелее">
<option value="openai/gpt-oss-120b:free">OpenAI GPT-OSS 120B Free (131 072 токенов)</option>
<option value="meta-llama/llama-3.3-70b-instruct:free">Llama 3.3 70B Instruct Free (131 072 токенов)</option>
<option value="google/gemma-4-26b-a4b-it:free">Gemma 4 26B A4B Free (262 144 токенов)</option>
<option value="google/gemma-4-31b-it:free">Gemma 4 31B Free (262 144 токенов)</option>
<option value="nvidia/nemotron-3-nano-30b-a3b:free">Nemotron 3 Nano 30B A3B Free (256 000 токенов)</option>
<option value="nvidia/nemotron-3-super-120b-a12b:free">Nemotron 3 Super 120B A12B Free (1 000 000 токенов)</option>
<option value="nvidia/nemotron-3-ultra-550b-a55b:free">Nemotron 3 Ultra 550B A55B Free (1 000 000 токенов)</option>
<option value="nousresearch/hermes-3-llama-3.1-405b:free">Hermes 3 Llama 3.1 405B Free (131 072 токенов)</option>
<option value="nex-agi/nex-n2-pro:free">Nex-N2-Pro Free (262 144 токенов)</option>
</optgroup>
<optgroup label="Бесплатные специальные">
<option value="nvidia/nemotron-nano-12b-v2-vl:free">Nemotron Nano 12B V2 VL Free (128 000 токенов)</option>
<option value="cohere/north-mini-code:free">Cohere North Mini Code Free (256 000 токенов)</option>
<option value="poolside/laguna-m.1:free">Poolside Laguna M.1 Free (262 144 токенов)</option>
</optgroup>
<optgroup label="Платные / дешевые">
<option value="openrouter/auto">OpenRouter Auto</option>
<option value="google/gemini-2.5-flash-lite">Gemini 2.5 Flash Lite</option>
<option value="google/gemini-2.5-flash">Gemini 2.5 Flash</option>
<option value="deepseek/deepseek-v4-flash">DeepSeek V4 Flash</option>
<option value="deepseek/deepseek-v3.2">DeepSeek V3.2</option>
<option value="deepseek/deepseek-v4-pro">DeepSeek V4 Pro</option>
<option value="deepseek/deepseek-chat-v3.1">DeepSeek V3.1</option>
<option value="deepseek/deepseek-r1">DeepSeek R1</option>
<option value="openai/gpt-4o-mini">GPT-4o mini</option>
<option value="anthropic/claude-3.5-haiku">Claude 3.5 Haiku</option>
</optgroup>
</select>
</label>
<label title="Можно оставить пустым, если ключ задан в переменной OPENROUTER_API_KEY на сервере.">
OpenRouter API key
<input id="attributeAiKey" type="password" autocomplete="off" placeholder="sk-or-...">
</label>
</div>
<div id="attributeBrowserAiControls" class="attribute-browser-ai-controls" hidden>
<label>ИИ через браузер
<select id="attributeAiBrowserProvider">
<option value="chatgpt">ChatGPT</option>
<option value="deepseek">DeepSeek</option>
</select>
</label>
<button id="openAttributeChatGptButton" type="button">Открыть ИИ</button>
<button id="checkAttributeChatGptButton" type="button">Проверить вход</button>
<button id="resetAttributeChatGptButton" type="button" title="Повторно найти проект Hard Pars в браузерном ИИ">Найти Hard Pars</button>
<span id="attributeChatGptStatus">Вход не проверен</span>
</div>
</div>
</fieldset>
<fieldset class="attribute-ai-channel attribute-description-channel">
<legend>ИИ описания</legend>
<div class="attribute-ai-channel-controls">
<label>
Способ
<select id="attributeDescriptionAiTransport">
<option value="api">OpenRouter API</option>
<option value="browser">ИИ через браузер</option>
</select>
</label>
<label class="attribute-project-check attribute-auto-ai-check" title="Если включено, описание создаётся автоматически из тех же данных сразу после обработки страницы.">
<input id="attributeDescriptionAutoAi" type="checkbox">
<span>Авто описание</span>
</label>
<div id="attributeDescriptionApiAiControls" class="attribute-api-ai-controls">
<label>
ИИ-модель
<select id="attributeDescriptionAiModel" class="ai-model-select"></select>
</label>
<label title="Отдельный ключ для модели описания. Можно использовать тот же ключ OpenRouter, что и для атрибутов.">
OpenRouter API key
<input id="attributeDescriptionAiKey" type="password" autocomplete="off" placeholder="sk-or-...">
</label>
</div>
<div id="attributeDescriptionBrowserAiControls" class="attribute-browser-ai-controls" hidden>
<label>ИИ через браузер
<select id="attributeDescriptionBrowserProvider">
<option value="chatgpt">ChatGPT</option>
<option value="deepseek">DeepSeek</option>
</select>
</label>
<button id="openDescriptionChatGptButton" type="button">Открыть ИИ</button>
<button id="checkDescriptionChatGptButton" type="button">Проверить вход</button>
<button id="resetDescriptionChatGptButton" type="button" title="Повторно найти проект Hard Pars в браузерном ИИ">Найти Hard Pars</button>
<span id="attributeDescriptionChatGptStatus">Вход не проверен</span>
</div>
</div>
</fieldset>
</div>
<div class="attribute-inline-actions">
<button id="clearChatGptProcessButton" class="attribute-ai-process-clear" type="button" aria-label="Очистить процесс ИИ" title="Закрыть зависший фоновый браузер ИИ. Вход, проект Hard Pars и настройки сохранятся.">⟳</button>
<button id="saveAttributeSettingsButton" type="button">Сохранить</button>
<button id="runAttributeScanButton" type="button">Запуск</button>
<button id="processAttributeAiButton" type="button">Атрибуты ИИ</button>
<button id="processAttributeDescriptionButton" type="button">Описание ИИ</button>
<button id="cancelAttributeScanButton" type="button" hidden>Отмена</button>
</div>
</div>
<p id="attributeStatus" role="status" aria-live="polite"></p>
</section>
<section class="attribute-box attribute-project-box">
<h2>Проекты</h2>
<div class="attribute-brand-form">
<input id="attributeProjectName" type="text" autocomplete="off" placeholder="Название проекта">
<input id="attributeProjectUrl" type="url" autocomplete="off" placeholder="Стартовая ссылка проекта">
<button id="addAttributeProjectButton" type="button">Добавить</button>
</div>
<div id="attributeProjectList" class="attribute-brand-list"></div>
</section>
<section class="attribute-box attribute-results-box">
<h2>Готовые короткие ссылки</h2>
<div id="attributeResults" class="attribute-results"></div>
</section>
</div>
</section>
<section class="tool-panel profiles-panel" data-tool-panel="profiles" aria-label="Профили и логи">
<section class="toolbar" aria-label="Панель профилей">
<div>
<h1>Профили и логи</h1>
<p>Проверьте защиту сайта и прогрейте профиль</p>
</div>
<button id="refreshProfilesButton" type="button">Обновить</button>
</section>
<div class="profile-scan-panel">
<label for="profileUrl">Ссылка на сайт</label>
<div class="link-row">
<input
id="profileUrl"
type="url"
autocomplete="off"
spellcheck="false"
placeholder="https://example.com/product"
>
<button id="scanProfileButton" type="button">Анализ</button>
</div>
<label class="profile-timeout-label" for="profileTimeout">Таймаут анализа</label>
<select id="profileTimeout" class="profile-timeout-select">
<option value="60">60 секунд</option>
<option value="90" selected>90 секунд</option>
<option value="120">120 секунд</option>
<option value="180">180 секунд</option>
<option value="300">300 секунд</option>
</select>
<p id="profilesStatus" role="status" aria-live="polite"></p>
</div>
<div class="profiles-grid">
<section class="profiles-box">
<h2>Профили</h2>
<div id="profilesList"></div>
</section>
<section class="profiles-box">
<h2>Логи</h2>
<div id="profilesLogs"></div>
</section>
</div>
</section>
<section class="tool-panel admin-panel" id="adminPanel" data-tool-panel="admin" aria-label="Админ-панель" hidden>
<section class="toolbar">
<div>
<h1>Админ-панель</h1>
<p>Учётные записи и журнал входов</p>
</div>
<button id="refreshAdminButton" type="button">Обновить</button>
</section>
<section class="admin-box">
<h2>Добавить пользователя</h2>
<form class="admin-user-form" id="adminUserForm">
<label>Логин<input id="adminNewUsername" type="text" autocomplete="off" required placeholder="user"></label>
<label>Пароль<input id="adminNewPassword" type="password" autocomplete="new-password" required></label>
<label>Роль<select id="adminNewRole"><option value="user">Пользователь</option><option value="tester">Тестер</option><option value="admin">Администратор</option></select></label>
<label class="admin-active-check"><input id="adminNewActive" type="checkbox" checked><span>Активен</span></label>
<button type="submit">Добавить</button>
</form>
<p id="adminStatus" role="status" aria-live="polite"></p>
</section>
<section class="admin-grid">
<section class="admin-box">
<h2>Пользователи</h2>
<div id="adminUsersList" class="admin-users-list"></div>
</section>
<section class="admin-box">
<h2>Журнал входов</h2>
<div id="adminLogsList" class="admin-logs-list"></div>
</section>
</section>
</section>
</main>
<pre class="viewer" id="viewer" hidden><code id="viewerCode"></code></pre>
<dialog class="remote-browser-dialog" id="remoteBrowserDialog">
<header class="remote-browser-header">
<div>
<strong>Браузерный ИИ</strong>
<span id="remoteBrowserUrl"></span>
</div>
<div class="remote-browser-actions">
<button id="remoteBrowserRefresh" type="button">Обновить</button>
<button id="remoteBrowserClose" type="button">Закрыть</button>
</div>
</header>
<div class="remote-browser-surface" id="remoteBrowserSurface" tabindex="0">
<img id="remoteBrowserImage" alt="Удалённый браузер ИИ" draggable="false">
<div class="remote-browser-loading" id="remoteBrowserLoading">Загрузка ИИ...</div>
</div>
<footer class="remote-browser-footer">
<span id="remoteBrowserStatus" role="status" aria-live="polite"></span>
<strong id="remoteBrowserAuthState">Вход не выполнен</strong>
</footer>
</dialog>
<script src="/app.js"></script>
</body>
</html>