CDP расширения
Введение
В Vision стандартный Chrome DevTools Protocol расширен собственными командами человекоподобного ввода и виртуальной мыши. Они помогают сделать автоматизацию менее заметной для антифрод-систем: вместо мгновенных «роботизированных» действий ввод текста и движения курсора выглядят естественно — так, как если бы их выполнял реальный пользователь.
Доступно два расширения:
- Human Type — человекоподобный ввод текста с естественными задержками между нажатиями.
- VirtualMouse — виртуальный курсор с плавной, естественной траекторией движения — как у реального пользователя.
Эти команды являются расширениями Vision и недоступны в обычном Chromium или Chrome.
CDP Extras доступны начиная с тарифа Base и выше.
Подключение
Команды отправляются в рамках обычной CDP-сессии к уже запущенному профилю — через любую библиотеку автоматизации, которая поддерживает Chrome DevTools Protocol (Playwright, Puppeteer и др.).
Подключаться можно только к профилям, запущенным через API. Адрес и порт для подключения возвращаются в ответе на запрос запуска профиля.
Подключение к браузеру
Как подключиться к запущенному профилю через Playwright, Puppeteer и другие библиотеки
Human Type
Команда Input.typeText печатает текст в текущий сфокусированный редактируемый элемент, имитируя ручной ввод: символы появляются по одному со случайной задержкой между нажатиями.
Параметры
Prop
Type
Пример
const { chromium } = require('playwright');
(async () => {
const browser = await chromium.connectOverCDP('http://127.0.0.1:19397');
const context = browser.contexts()[0];
const page = await context.newPage();
const client = await context.newCDPSession(page);
await page.goto('https://example.com');
// Текст вводится в текущий сфокусированный редактируемый элемент
await client.send('Input.typeText', {
text: 'Введено с помощью Human Type',
minDelay: 55,
maxDelay: 130,
});
await browser.close();
})();import asyncio
from playwright.async_api import async_playwright
async def main():
async with async_playwright() as p:
browser = await p.chromium.connect_over_cdp('http://127.0.0.1:19397')
context = browser.contexts[0]
page = await context.new_page()
client = await context.new_cdp_session(page)
await page.goto('https://example.com')
# Текст вводится в текущий сфокусированный редактируемый элемент
await client.send('Input.typeText', {
'text': 'Введено с помощью Human Type',
'minDelay': 55,
'maxDelay': 130,
})
await browser.close()
asyncio.get_event_loop().run_until_complete(main())VirtualMouse
VirtualMouse — это настоящий курсор внутри браузера, который движется так, будто им управляет живой человек: плавная траектория и естественные микроотклонения. Никаких мгновенных телепортов и идеально прямых линий, по которым антифрод-системы вычисляют автоматизацию.
Доступные команды:
VirtualMouse.create— создаёт виртуальный курсор.VirtualMouse.configure— меняет настройки движения для последующих команд.VirtualMouse.move— перемещает курсор в точкуx,y.VirtualMouse.click— перемещает курсор (если переданы координаты) и выполняет левый клик. Без координат используется текущая позиция курсора.VirtualMouse.destroy— удаляет виртуальный курсор.
Параметры движения
Передаются в VirtualMouse.create и VirtualMouse.configure.
Prop
Type
Параметры клика
Передаются в VirtualMouse.click.
Prop
Type
Пример
const { chromium } = require('playwright');
(async () => {
const browser = await chromium.connectOverCDP('http://127.0.0.1:19397');
const context = browser.contexts()[0];
const page = await context.newPage();
const client = await context.newCDPSession(page);
await page.goto('https://example.com');
// Создаём виртуальный курсор
await client.send('VirtualMouse.create', {
speed: 1.2,
samplingRateHz: 125,
trajectory: 'lognormal-ou',
x: 100,
y: 100,
noiseScale: 1.0,
includeReaction: true,
seed: 12345,
});
try {
await client.send('VirtualMouse.move', { x: 500, y: 240 });
await client.send('VirtualMouse.click', { delay: 40, duration: 40 });
} finally {
// Удаляем курсор в любом случае
await client.send('VirtualMouse.destroy');
}
await browser.close();
})();import asyncio
from playwright.async_api import async_playwright
async def main():
async with async_playwright() as p:
browser = await p.chromium.connect_over_cdp('http://127.0.0.1:19397')
context = browser.contexts[0]
page = await context.new_page()
client = await context.new_cdp_session(page)
await page.goto('https://example.com')
# Создаём виртуальный курсор
await client.send('VirtualMouse.create', {
'speed': 1.2,
'samplingRateHz': 125,
'trajectory': 'lognormal-ou',
'x': 100,
'y': 100,
'noiseScale': 1.0,
'includeReaction': True,
'seed': 12345,
})
try:
await client.send('VirtualMouse.move', {'x': 500, 'y': 240})
await client.send('VirtualMouse.click', {'delay': 40, 'duration': 40})
finally:
# Удаляем курсор в любом случае
await client.send('VirtualMouse.destroy')
await browser.close()
asyncio.get_event_loop().run_until_complete(main())Перетаскивание
VirtualMouse умеет не только кликать, но и работать с элементами, которые нужно перетаскивать (сценарий drag-and-drop). Для таких случаев предусмотрен параметр release: одним кликом с release: false кнопка зажимается, курсор перемещается к цели с удержанием, а следующим кликом с release: true — отпускается.
const { chromium } = require('playwright');
(async () => {
const browser = await chromium.connectOverCDP('http://127.0.0.1:19397');
const context = browser.contexts()[0];
const page = await context.newPage();
const client = await context.newCDPSession(page);
await page.goto('https://example.com');
await client.send('VirtualMouse.create', { x: 120, y: 200 });
try {
// Нажимаем и удерживаем кнопку в начальной точке
await client.send('VirtualMouse.click', { x: 120, y: 200, release: false });
// Перетаскиваем к цели с зажатой кнопкой
await client.send('VirtualMouse.move', { x: 480, y: 360 });
// Отпускаем кнопку — сбрасываем в точку
await client.send('VirtualMouse.click', { release: true });
} finally {
await client.send('VirtualMouse.destroy');
}
await browser.close();
})();import asyncio
from playwright.async_api import async_playwright
async def main():
async with async_playwright() as p:
browser = await p.chromium.connect_over_cdp('http://127.0.0.1:19397')
context = browser.contexts[0]
page = await context.new_page()
client = await context.new_cdp_session(page)
await page.goto('https://example.com')
await client.send('VirtualMouse.create', {'x': 120, 'y': 200})
try:
# Нажимаем и удерживаем кнопку в начальной точке
await client.send('VirtualMouse.click', {'x': 120, 'y': 200, 'release': False})
# Перетаскиваем к цели с зажатой кнопкой
await client.send('VirtualMouse.move', {'x': 480, 'y': 360})
# Отпускаем кнопку — сбрасываем в точку
await client.send('VirtualMouse.click', {'release': True})
finally:
await client.send('VirtualMouse.destroy')
await browser.close()
asyncio.get_event_loop().run_until_complete(main())Готовые примеры
Полные рабочие примеры для JavaScript и Python собраны в отдельном репозитории.
browser-vision/cdp-extras
Примеры использования Human Type и VirtualMouse из собственного кода автоматизации