Библиотека реальных примеров
В этой главе представлены пять готовых шаблонов скриптов, которые можно напрямую применять в реальных проектах. Они охватывают наиболее распространенные сценарии автоматизации для нескольких аккаунтов. Каждый случай включает в себя версии для JavaScript и Python.
Пример 1: Автозалогин и сохранение состояния
Сценарий: Автоматический вход на целевую платформу для конкретной среды Mbbrowser.
// JavaScript Версия
const { chromium } = require('playwright');
const axios = require('axios');
const API_URL = 'http://127.0.0.1:8186';
const SESSION_ID = 'вставьте_ваш_session_id';
async function autoLogin() {
// ── Открытие среды Mbbrowser ─────────────────────────────
const { data } = await axios.post(`${API_URL}/api/v1/browser/start`, {
Session_ID: SESSION_ID
});
if (data.code !== 0) throw new Error(`Ошибка запуска: ${data.message}`);
const wsEndpoint = data.data.ws;
const browser = await chromium.connectOverCDP(wsEndpoint);
const context = browser.contexts()[0];
const page = context.pages()[0] || await context.newPage();
try {
// ── Открытие страницы входа и заполнение формы ─────────────
await page.goto('https://example.com/login', { waitUntil: 'domcontentloaded' });
// getByRole — рекомендуемый метод позиционирования в Playwright
await page.getByLabel('Email').fill('my_account@email.com');
await page.getByLabel('Password').fill('my_password_123');
await page.getByRole('button', { name: 'Log In' }).click();
// Ожидание перенаправления в личный кабинет (признак успешного входа)
await page.waitForURL('**/dashboard', { timeout: 15000 });
console.log('✅ Вход выполнен! Текущий URL:', page.url());
// Mbbrowser автоматически сохраняет Cookies; при следующем запуске вход не потребуется.
console.log('🔒 Cookies автоматически сохранены в среде Mbbrowser');
} catch (e) {
console.error('❌ Ошибка входа:', e.message);
await page.screenshot({ path: 'login_error.png', fullPage: true });
} finally {
await browser.close();
}
}
autoLogin().catch(console.error);# Python Версия
import requests
from playwright.sync_api import sync_playwright
API_URL = "http://127.0.0.1:8186"
SESSION_ID = "вставьте_ваш_session_id"
def auto_login():
resp = requests.post(
f"{API_URL}/api/v1/browser/start",
json={"Session_ID": SESSION_ID}, timeout=30
)
data = resp.json()
if data["code"] != 0:
print(f"❌ Ошибка запуска: {data['message']}")
return
ws = data["data"]["ws"]
with sync_playwright() as p:
browser = p.chromium.connect_over_cdp(ws)
context = browser.contexts[0]
page = context.pages[0] if context.pages else context.new_page()
try:
page.goto("https://example.com/login", wait_until="domcontentloaded")
page.get_by_label("Email").fill("my_account@email.com")
page.get_by_label("Password").fill("my_password_123")
page.get_by_role("button", name="Log In").click()
page.wait_for_url("**/dashboard", timeout=15000)
print(f"✅ Вход выполнен! Текущий URL: {page.url}")
except Exception as e:
print(f"❌ Ошибка входа: {e}")
page.screenshot(path="login_error.png", full_page=True)
finally:
browser.close()
if __name__ == "__main__":
auto_login()Пример 2: Инъекция Cookie для мгновенного входа
Сценарий: Инъекция существующих данных Cookie для обхода форм входа и получения немедленного доступа.
// JavaScript Версия
async function injectAndLogin(page, context) {
// Примечание: Сначала нужно открыть целевой домен, чтобы установить для него Cookies
await page.goto('https://shop.example.com', { waitUntil: 'commit' });
// Инъекция подготовленного массива Cookie
await context.addCookies([
{ name: 'session_id', value: 'SID_abcdef123456', domain: '.example.com', path: '/' },
{ name: 'auth_token', value: 'Bearer_xyz789', domain: '.example.com', path: '/' }
]);
// Обновление страницы для применения Cookies
await page.reload({ waitUntil: 'domcontentloaded' });
// Проверка успешного входа
const accountEl = page.getByRole('button', { name: 'My Account' });
if (await accountEl.isVisible()) {
console.log('✅ Инъекция Cookie успешна! Вход выполнен.');
} else {
console.warn('⚠️ Срок действия Cookies мог истечь; пожалуйста, обновите их.');
}
}NOTE
Секрет Mbbrowser: После успешного входа в среде Mbbrowser, Cookies навсегда сохраняются в каталоге данных этой среды. Эта «постоянная среда» — главная ценность антидетект-браузера!
Пример 3: Парсинг данных через перехват ответов API
Сценарий: Извлечение данных напрямую из ответов XHR/Fetch, что гораздо стабильнее парсинга HTML.
// JavaScript Версия
async function interceptAndCollect(page) {
const collectedData = [];
// ── Слушаем ответы от целевого API ───────────────────────────
page.on('response', async response => {
if (response.url().includes('/api/products') && response.status() === 200) {
try {
const json = await response.json();
if (json.data?.list) {
collectedData.push(...json.data.list);
console.log(`📦 Собрано ${collectedData.length} записей о товарах`);
}
} catch (e) {}
}
});
// ── Открываем страницу товаров для запуска запросов к API ──────
await page.goto('https://example.com/products');
// ── Логика пагинации ─────────────────────────────────────────
for (let i = 0; i < 5; i++) {
const nextBtn = page.getByRole('button', { name: 'Next' });
if (!await nextBtn.isVisible()) break;
// Кликаем «Далее» и ждем ответа с данными
await Promise.all([
page.waitForResponse(r => r.url().includes('/api/products')),
nextBtn.click()
]);
}
console.log(`✅ Всего собрано ${collectedData.length} записей`);
return collectedData;
}Пример 4: Многопоточность для нескольких аккаунтов
Сценарий: Одновременное управление несколькими средами Mbbrowser для повышения параллельной эффективности.
# Python Версия —— Параллелизм через Threading
import threading
import requests
from playwright.sync_api import sync_playwright
API_URL = "http://127.0.0.1:8186"
SESSION_LIST = ["ENV_ID_1", "ENV_ID_2", "ENV_ID_3", "ENV_ID_4", "ENV_ID_5"]
def operate_one_account(session_id, thread_id):
print(f"[Поток {thread_id}] Запуск {session_id[:8]}...")
try:
resp = requests.post(f"{API_URL}/api/v1/browser/start", json={"Session_ID": session_id}, timeout=30)
data = resp.json()
if data["code"] != 0:
print(f"[Поток {thread_id}] ❌ Ошибка: {data['message']}")
return
ws = data["data"]["ws"]
with sync_playwright() as p:
browser = p.chromium.connect_over_cdp(ws)
context = browser.contexts[0]
page = context.pages[0] if context.pages else context.new_page()
# ── Бизнес-логика ──
page.goto("https://example.com")
print(f"[Поток {thread_id}] ✅ Готово: {page.title()}")
browser.close()
except Exception as e:
print(f"[Поток {thread_id}] ❌ Исключение: {e}")
finally:
requests.post(f"{API_URL}/api/v1/browser/stop", json={"Session_ID": session_id}, timeout=10)
if __name__ == "__main__":
threads = [threading.Thread(target=operate_one_account, args=(sid, i+1)) for i, sid in enumerate(SESSION_LIST)]
for t in threads: t.start()
for t in threads: t.join()
print("\n🎉 Все аккаунты обработаны!")Пример 5: Фреймворк промышленного уровня (Повторы и логирование)
# Промышленный Python-фреймворк
import threading
import requests
import logging
import time
from playwright.sync_api import sync_playwright, TimeoutError as PWTimeoutError
logging.basicConfig(level=logging.INFO, format="%(asctime)s [%(threadName)s] %(levelname)s %(message)s")
logger = logging.getLogger(__name__)
API_URL = "http://127.0.0.1:8186"
class MBPlaywrightSession:
def __init__(self, session_id: str, max_retry: int = 3):
self.session_id = session_id
self.max_retry = max_retry
self._pw = None
self._browser = None
def start(self):
for attempt in range(1, self.max_retry + 1):
try:
logger.info(f"[{self.session_id[:8]}] Попытка запуска (Попытка {attempt})")
resp = requests.post(f"{API_URL}/api/v1/browser/start", json={"Session_ID": self.session_id}, timeout=30)
data = resp.json()
if data["code"] == 0:
self._pw = sync_playwright().start()
self._browser = self._pw.chromium.connect_over_cdp(data["data"]["ws"])
logger.info(f"[{self.session_id[:8]}] ✅ Готово")
return self
except Exception as e:
logger.error(f"[{self.session_id[:8]}] Ошибка: {e}")
time.sleep(2 ** attempt)
raise RuntimeError(f"Не удалось запустить {self.session_id}")
@property
def page(self):
context = self._browser.contexts[0]
return context.pages[0] if context.pages else context.new_page()
def stop(self):
try:
if self._browser: self._browser.close()
if self._pw: self._pw.stop()
except Exception: pass
requests.post(f"{API_URL}/api/v1/browser/stop", json={"Session_ID": self.session_id}, timeout=10)
def __enter__(self): return self.start()
def __exit__(self, *args): self.stop()
# ── Использование ──
with MBPlaywrightSession("вставьте_ваш_session_id") as session:
try:
session.page.goto("https://www.mbbrowser.com")
logger.info(f"Заголовок: {session.page.title()}")
except Exception as e:
logger.error(f"Ошибка выполнения: {e}")Итоговое сравнение
| Измерение | Puppeteer | Selenium | Playwright |
|---|---|---|---|
| Поле Mbbrowser | data.ws | data.http | data.ws |
| Авто-ожидание | Вручную | Вручную | Встроено |
| Перехват сети | Базовый | Не поддерживается | Мощный |
| Рекомендация | JS разработчикам | Устаревший код | Новые проекты |
TIP
🎉 Вы освоили Mbbrowser + Playwright!
Посетите playwright.dev для официальной документации или обратитесь к Менеджеру скриптов автоматизации для управления вашими скриптами внутри клиента.
