Представьте: сайт конкурента обновил интерфейс, и ваш 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-агента для вашего бизнеса. Получите консультацию по вашему сценарию автоматизации — напишите нам.







