PowerScan
UK

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

Автоматизація · 8 хв читання · Автор: PowerOps

Фото: Unsplash

Запустіть профіль зі скрипта, отримайте точку налагодження та підключіть 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, що керує браузерами з відкритими акаунтами, заслуговує на слово про свої межі.

Шаблон, який варто скопіювати

Опитайте профілі групи, запустіть кожен, виконайте роботу, зупиніть його. Запускайте їх по кілька, а не всі одразу. Обмеження — пам’ять вашого комп’ютера, адже кожен профіль — це справжній процес браузера.

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` важить більше, ніж здається: саме коректне закриття записує стан браузера, а профіль, убитий посеред сесії, може втратити щойно встановлену сесію.

Усі статті · Запустити перевірку