Представьте: сайт конкурента обновил интерфейс, и ваш RPA-бот, завязанный на селекторы вроде #price-block, начал выдавать ошибки. Знакомая ситуация? Мы решаем её с помощью AI-агентов, которые анализируют интерфейс как человек — через скриншот и семантику элементов. Они не ломаются при рефакторинге вёрстки и устойчивы к антибот-защите. За время работы мы реализовали 30+ проектов автоматизации для e-commerce, логистики и финансов.
Традиционный RPA-бот жёстко завязан на DOM-структуру. Изменился class кнопки — скрипт упал. AI-агент анализирует снимок экрана и семантику элементов, поэтому работает с любым интерфейсом — SPA, React, Vue, динамические элементы. Гибкость выше на порядок: рефакторинг фронтенда не ломает агента.
| Характеристика | RPA-бот | AI-агент |
|---|---|---|
| Устойчивость к изменениям вёрстки | Низкая (ломается при смене классов) | Высокая (семантический поиск) |
| Работа с CAPTCHA | Требует интеграции антикапчи | Может решать через визуальный анализ |
| Сложность настройки | Высокая (точные селекторы) | Низкая (задача на естественном языке) |
| Масштабирование | Только заданные сценарии | Адаптация под новые страницы |
Что такое AI-агент и чем он отличается от RPA?
AI-агент — это программный робот, который использует мультимодальную большую языковую модель (LLM) и компьютерное зрение для взаимодействия с веб-интерфейсом. В отличие от RPA, работающего по жёстким селекторам, AI-агент видит страницу как человек: распознаёт кнопки, поля ввода и другие элементы по их визуальному представлению и контексту. Это делает его устойчивым к изменениям вёрстки, замене фреймворков и даже к некоторым видам антибот-защиты.
Как мы строим агента: архитектура
Используем связку Playwright + LLM (Claude, GPT-4). Playwright управляет браузером, LLM принимает решения — выбирает следующее действие на основе скриншота и доступных элементов.
from playwright.async_api import async_playwright, Page from anthropic import Anthropic import asyncio import base64 import json client = Anthropic() class AIWebAgent: def __init__(self, headless: bool = True): self.headless = headless async def run(self, task: str, start_url: str) -> str: async with async_playwright() as p: browser = await p.chromium.launch(headless=self.headless) context = await browser.new_context( viewport={"width": 1280, "height": 800}, user_agent="Mozilla/5.0 (compatible; research-bot/1.0)" ) page = await context.new_page() await page.goto(start_url) result = await self._agent_loop(page, task) await browser.close() return result async def _get_page_state(self, page: Page) -> dict: screenshot = await page.screenshot(type="png") screenshot_b64 = base64.standard_b64encode(screenshot).decode() elements = await page.evaluate("""() => { const interactive = document.querySelectorAll( 'a, button, input, select, textarea, [role="button"]' ); return Array.from(interactive).slice(0, 50).map((el, idx) => ({ index: idx, tag: el.tagName.toLowerCase(), text: el.textContent?.trim().slice(0, 80) || '', type: el.type || '', placeholder: el.placeholder || '', })); }""") return { "url": page.url, "title": await page.title(), "screenshot": screenshot_b64, "elements": elements, } async def _execute_action(self, page: Page, action: dict) -> str: action_type = action.get("type") try: if action_type == "click": if "text" in action: await page.get_by_text(action["text"]).first.click() elif "element_index" in action: elements = await page.query_selector_all( 'a, button, input, select, textarea, [role="button"]' ) if action["element_index"] < len(elements): await elements[action["element_index"]].click() elif action_type == "fill": await page.fill(action["selector"], action["value"]) elif action_type == "navigate": await page.goto(action["url"]) elif action_type == "scroll": amount = action.get("amount", 500) direction = 1 if action.get("direction", "down") == "down" else -1 await page.evaluate(f"window.scrollBy(0, {direction * amount})") elif action_type == "extract": return await page.evaluate( f'document.querySelector({json.dumps(action.get("selector", "body"))})?.textContent?.trim()' ) await asyncio.sleep(0.5) return "success" except Exception as e: return f"error: {e}" async def _agent_loop(self, page: Page, task: str) -> str: messages = [] system = """Ты — AI веб-агент. Выполняй задачи в браузере. Доступные действия (верни JSON): - {"type": "click", "text": "текст кнопки"} - {"type": "fill", "selector": "CSS", "value": "текст"} - {"type": "navigate", "url": "https://..."} - {"type": "scroll", "direction": "down", "amount": 500} - {"type": "extract", "selector": ".result"} - {"type": "done", "result": "итоговый результат"} Формат ответа: REASONING: <что видишь и что планируешь> ACTION: <JSON с одним действием>""" for _ in range(20): state = await self._get_page_state(page) user_content = [ {"type": "image", "source": {"type": "base64", "media_type": "image/png", "data": state["screenshot"]}}, {"type": "text", "text": f"Задача: {task}\nURL: {state['url']}\nЭлементы:\n{json.dumps(state['elements'][:20], ensure_ascii=False)}"} ] messages.append({"role": "user", "content": user_content}) response = client.messages.create( model="claude-opus-4-5", max_tokens=1024, system=system, messages=messages, ) reply = response.content[0].text messages.append({"role": "assistant", "content": reply}) try: action_line = [l for l in reply.split("\n") if l.startswith("ACTION:")][0] action = json.loads(action_line.replace("ACTION:", "").strip()) except (IndexError, json.JSONDecodeError): continue if action.get("type") == "done": return action.get("result", "Task completed") await self._execute_action(page, action) return "Max iterations reached" Техническая реализация антибот-защиты
async def setup_stealth_context(playwright): browser = await playwright.chromium.launch( headless=False, args=["--disable-blink-features=AutomationControlled"] ) context = await browser.new_context( viewport={"width": 1366, "height": 768}, locale="ru-RU", timezone_id="Europe/Moscow", ) await context.add_init_script( "Object.defineProperty(navigator, 'webdriver', {get: () => undefined})" ) return context Современные сайты активно блокируют автоматизацию. Мы добавляем модификацию navigator.webdriver, реалистичный User-Agent, случайные задержки между действиями и ротацию прокси. Агент может обходить даже сложные схемы — Cloudflare, DataDome, Akamai.
Почему AI-агент быстрее человека?
Человек тратит на мониторинг 200 товаров у 5 конкурентов около 4 часов в день. AI-агент делает то же за 35 минут и формирует Excel-отчёт. Скорость реакции на изменение цен сокращается с 2 дней до 2 часов.
Как AI-агент обрабатывает CAPTCHA?
Для решения CAPTCHA агент делает скриншот элемента и отправляет его мультимодальной LLM. Модель распознаёт текст или выбирает правильные изображения. Это избавляет от интеграции сторонних сервисов антикапчи и ускоряет прохождение — в среднем 3–5 секунд на одну проверку.
Типовые сценарии
- Мониторинг конкурентов — цены, акции, ассортимент.
- Заполнение форм — тендеры, регистрация, госуслуги.
- Сбор отзывов — агрегация с нескольких площадок.
- Регрессионное тестирование UI — автоматическая проверка сценариев.
Кейс: сеть строительных магазинов
Наш клиент — сеть строительных магазинов — ежедневно мониторил цены 200 SKU у 5 конкурентов вручную. Мы развернули AI-агента: он обходит сайты, извлекает цены и наличие, формирует Excel с отклонениями. Задача выполняется за 35 минут. Результат: менеджер тратит 15 минут на анализ готового отчёта вместо 4 часов сбора данных. Реакция на изменение цен ускорилась с 1–2 дней до нескольких часов.
Что входит в работу
- Разработка AI-агента под ваш сценарий.
- Исходный код и документация на русском.
- Настройка антибот-защиты и прокси (при необходимости).
- Интеграция с вашими системами через API или экспорт данных.
- Обучение сотрудников работе с агентом.
- Техническая поддержка в течение первого месяца.
Процесс работы
- Анализ — изучаем целевые сайты, антибот-защиту, структуру данных.
- Проектирование — выбираем стек (модель, фреймворк, прокси).
- Реализация — кодим агента, настраиваем пайплайн.
- Тестирование — прогоняем на наборе сложных сценариев.
- Деплой — размещаем на сервере с мониторингом.
Сроки ориентировочно
- Базовый агент для одного сайта: 3–5 дней.
- Универсальный агент с визуальным восприятием: 1–2 недели.
- Мониторинг цен с отчётами: 1 неделя.
- Антибот-защита и прокси: +1 неделя.
Стоимость рассчитывается индивидуально. Гарантируем стабильную работу агента при условии неизменности целевых сайтов. Оценим ваш проект за 1 день — свяжитесь с нами. Закажите разработку AI-агента для вашего бизнеса. Получите консультацию по вашему сценарию автоматизации — напишите нам.







