Обнаружение внутренних API
Как агент обнаруживает внутренние API через анализ сетевого трафика для извлечения данных в 100 раз быстрее.
Это один из самых мощных шаблонов работы с браузером. Вместо последовательного кликания по веб-интерфейсу для каждого элемента, агент анализирует, какие API-запросы страница делает «под капотом», а затем вызывает эти API напрямую — часто достигая в 100 раз быстрее извлечения данных.
Идея
Современные веб-приложения построены как одностраничные приложения (SPA), которые общаются с backend API. Когда вы перелистываете список сотрудников, билетов или заказов в веб-интерфейсе, страница отправляет запросы `fetch()` или XHR на внутренние API-эндпоинты за кулисами.
Агент может наблюдать за этими сетевыми запросами, понимать паттерн API и вызывать эти эндпоинты напрямую — полностью обходя медленный интерфейс.
Вам не нужно просить об этом явно. Когда агент замечает, что последовательно кликает по множеству похожих элементов, он часто автоматически переключается на этот подход.
Почему это важно
| Кликание по интерфейсу | Прямой вызов API | |
|---|---|---|
| Скорость на элемент | 5–10 секунд | ~100 миллисекунд |
| Параллелизм | По одному | Все элементы сразу |
| Формат данных | Текст, извлечённый со страницы | Структурированный JSON или XML |
| Надёжность | Ломается при изменении интерфейса | Стабильные контракты API |
| Авторизация | Уже вошёл в систему | Переиспользует сессию браузера |
Для задачи вроде «получить данные об отпуске по болезни для 25 сотрудников» это означает сокращение времени с **~4 минут** кликания до **~2 секунд** параллельных вызовов API.
Как это работает
-
Навигация и взаимодействие с одним элементом
Агент загружает веб-приложение и кликает по одному элементу обычным способом — достаточно, чтобы страница отправила свои API-запросы. -
Анализ сетевого трафика
С помощью анализа сетевого трафика агент видит все HTTP-запросы, которые страница отправила. Он ищет REST или GraphQL эндпоинты, возвращающие структурированные данные.terminalbashGET /api/v1/employees/132/time-off?end=2026-12-31 → 200 (JSON, 1.2KB) GET /api/v1/employees/132?fields=department,jobTitle → 200 (JSON, 0.4KB) -
Определение паттерна API
Агент распознаёт шаблон URL — `/api/v1/employees/{id}/time-off` — и понимает, как формировать запросы для любого сотрудника. -
Тестирование одним вызовом
Перед масштабированием агент делает один прямой вызов API изнутри браузера, чтобы проверить, что всё работает:terminalbashfetch('/api/v1/employees/132/time-off?end=2026-12-31', { credentials: 'include' })Опция `credentials: 'include'` переиспользует cookies браузера — дополнительная аутентификация не требуется.
-
Получение всех элементов параллельно
После подтверждения агент получает данные для всех элементов одновременно:terminalbashPromise.all(employees.map(emp => fetch(`/api/v1/employees/${emp.id}/time-off?end=2026-12-31`, { credentials: 'include' }) .then(r => r.json()) .then(data => ({ name: emp.name, sickDays: data.sickDaysUsed })) ))Все 25 запросов отправляются одновременно и завершаются за 1–2 секунды.
-
Сбор и форматирование результатов
Агент извлекает структурированные результаты и форматирует их так, как вам нужно — в виде таблицы, электронной таблицы, сводки или сырых данных.
Пример из реальной жизни
Вот задача, в которой использовался этот шаблон:
«Зайди на наш портал HR, пролистай всех сотрудников и получи их дни больничного за последние 12 месяцев в электронной таблице».
Без обнаружения API: Агент последовательно кликает по 25 сотрудникам, переходит на каждый профиль, находит раздел больничного и читает число. ~4 минуты.
С обнаружением API: Агент кликает первого сотрудника, замечает, что страница вызывает `/api/v1/employees/132/time-off/calculator`, обнаруживает эндпоинт справочника сотрудников и получает данные всех 25 сотрудников параллельно. ~2 секунды, плюс структурированный набор данных, включающий отдел и должность в подарок.
Результат — полная электронная таблица со столбцами: имя сотрудника, отдел, должность, больничные дни за 2025 год и больничные дни с начала 2026 года — все данные, которые потребовали бы перехода по нескольким вкладкам для каждого сотрудника в интерфейсе.
Ключевые техники
| Техника | Почему это работает |
|---|---|
credentials: 'include' |
Переиспользует cookies браузера — отдельная аутентификация не требуется |
Promise.all() |
Отправляет все запросы одновременно для огромного ускорения |
Хранение результатов в переменных window.__ |
Передаёт асинхронные результаты fetch обратно агенту для извлечения |
DOMParser для XML-ответов |
Некоторые внутренние API возвращают XML вместо JSON |
| Пакетная обработка для больших наборов данных | Избегает перегрузки сервера при получении 50+ элементов |
Что насчёт аутентификации?
Поскольку агент выполняет JavaScript в контексте страницы браузера, он наследует cookies и сессию браузера. Если вы вошли в веб-приложение, вызовы API через `fetch()` автоматически аутентифицируются — никаких токенов или API-ключей не требуется.
Это работает с GraphQL?
Да. Приложения GraphQL обычно используют один эндпоинт `/graphql`. Агенту нужно проанализировать сетевой трафик, чтобы увидеть структуру запросов, а затем воспроизвести её с правильным телом запроса и переменными. Тот же шаблон `credentials: 'include'` применяется.
Что насчёт ограничений скорости?
Если вы получаете данные для сотен элементов, агент разбивает запросы на пакеты (например, 20–50 за раз) с небольшими задержками между пакетами, чтобы не перегружать сервер или не превысить лимиты скорости.
Что, если API возвращает XML?
Некоторые корпоративные приложения (такие как BambooHR, SAP и т.д.) возвращают XML вместо JSON. Агент обрабатывает это с помощью встроенного в браузер `DOMParser` для разбора XML и извлечения значений с помощью `querySelector` и `getAttribute`.
Могу ли я попросить агента использовать этот шаблон?
Конечно. Если вы знаете, что задача включает повторяющееся извлечение данных, вы можете прямо указать агенту: «Проверь сетевой трафик, чтобы найти API-эндпоинт и используй его вместо последовательного кликания по интерфейсу». Агент приоритизирует подход обнаружения API.
Что насчёт ограничений CORS?
Не проблема. Поскольку JavaScript выполняется в контексте страницы (через `browser_evaluate`), все запросы являются одноисточниковыми. Никаких ограничений междоменных запросов не существует.
Нужен такой агент в вашей компании?
Устанавливаем под ключ: настройка на компьютерах сотрудников, единый аккаунт, интеграция с 1С и внутренними системами, обучение команды. Подробнее о внедрении →