Автоматизація профілів браузера через локальне API

Запустіть профіль зі скрипта, отримайте точку налагодження та підключіть Playwright або Puppeteer до браузера, який уже має свою ідентичність і проксі.
Автоматизацію антидетект-браузера зазвичай подають як складну задачу. Це не так, якщо інструмент дає вам єдине, що ваша бібліотека автоматизації вже вміє використовувати: точку налагодження.
Як це влаштовано
PowerOps запускає HTTP API, прив’язане до адреси loopback. Ваш скрипт просить його запустити профіль; воно стартує браузер з ідентичністю, сховищем і проксі цього профілю, уже підключеними, і повертає WebSocket-точку запущеного браузера. Ваш скрипт підключається до цієї точки через Playwright, Puppeteer або будь-що інше, що розуміє протокол DevTools.
Бібліотеці автоматизації ніколи не потрібно знати, що таке відбиток. Коли вона підключається, середовище вже готове.
Запуск профілю
curl -s -H "Authorization: Bearer $POWEROPS_API_KEY" \
http://127.0.0.1:50326/status
Кожен маршрут, окрім перевірки стану, вимагає bearer-ключа. Запуск браузера повертає точку, до якої слід підключитися:
curl -s -X POST \
-H "Authorization: Bearer $POWEROPS_API_KEY" \
-H "Content-Type: application/json" \
-d '{"profileId": "..."}' \
http://127.0.0.1:50326/browser/start
Підключення вашої бібліотеки
import { chromium } from "playwright";
const res = await fetch("http://127.0.0.1:50326/browser/start", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.POWEROPS_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ profileId }),
});
const { ws } = await res.json();
// The profile's identity, storage and proxy are already in place.
const browser = await chromium.connectOverCDP(ws);
const [context] = browser.contexts();
const page = context.pages()[0] ?? await context.newPage();
await page.goto("https://example.com");
Найважливіший рядок — коментар. У вашому скрипті немає жодного налаштування відбитка, бо налаштування середовища — не робота скрипта. Воно належить профілю й лишається однаковим, чи відкриває профіль людина кліком по рядку, чи заплановане завдання о третій ночі.
Що охоплює API
- Маршрут стану — перевірка працездатності й єдиний, якому не потрібен ключ.
- Маршрути браузера запускають, зупиняють і опитують браузери, що зараз працюють.
- Маршрути профілів створюють, оновлюють, опитують і видаляють профілі.
- Маршрути проксі керують бібліотекою проксі та призначають маршрути.
- Маршрути груп організовують профілі масово.
- Маршрути розширень імпортують і призначають розширення.
Як воно лишається локальним
API, що керує браузерами з відкритими акаунтами, заслуговує на слово про свої межі.
- Воно прив’язується до 127.0.0.1. Немає налаштування, яке змусило б його слухати на іншому інтерфейсі.
- На кожному маршруті, окрім перевірки стану, потрібен bearer-ключ.
- Воно перевіряє заголовок Host і не надсилає заголовків CORS, тож вебсторінка, відкрита у вашому повсякденному браузері, не може до нього дістатися.
- Секрети лише для запису: паролі профілів, секрети двофакторної автентифікації та паролі проксі ніколи не повертаються маршрутом запиту.
Шаблон, який варто скопіювати
Опитайте профілі групи, запустіть кожен, виконайте роботу, зупиніть його. Запускайте їх по кілька, а не всі одразу. Обмеження — пам’ять вашого комп’ютера, адже кожен профіль — це справжній процес браузера.
const { profiles } = await api("/profiles?groupId=" + groupId);
for (const batch of chunk(profiles, 5)) {
await Promise.all(batch.map(async (profile) => {
const { ws } = await api("/browser/start", { profileId: profile.id });
try {
await doTheWork(ws);
} finally {
await api("/browser/stop", { profileId: profile.id });
}
}));
}
Зупинка профілю в `finally` важить більше, ніж здається: саме коректне закриття записує стан браузера, а профіль, убитий посеред сесії, може втратити щойно встановлену сесію.
