Сеть

Динамическое переключение прокси: настройка контекстов

Как настроить переключение прокси в реальном времени и персональные настройки прокси для каждого контекста при одновременном управлении несколькими сетевыми идентичностями.

Документация

Нужна поддерживаемая продуктовая документация?

У этой статьи есть соответствующая страница в центре документации. Используйте docs для каноничного сценария настройки, актуальных флагов и долгосрочной справки.

Введение

Многие рабочие процессы, связанные с приватностью, требуют больше, чем один прокси на всю сессию браузера. Вам могут понадобиться разные прокси для разных аккаунтов, географических регионов или целевых доменов. Статическая конфигурация прокси, когда один прокси обслуживает весь трафик на протяжении всей жизни браузера, ограничивает в этих сценариях.

BotBrowser поддерживает динамическое переключение прокси через API контекстов Playwright и Puppeteer. Каждый контекст браузера может маршрутизировать трафик через отдельный прокси со своей географической идентичностью, и вы можете создавать и закрывать контексты в реальном времени без перезапуска браузера. В этой статье рассматриваются настройка прокси для каждого контекста, стратегии ротации прокси и конфигурации с несколькими прокси для сложных рабочих процессов.

Влияние на приватность

Когда несколько аккаунтов или идентичностей используют один прокси, их паттерны трафика связаны IP-адресом. Система отслеживания, наблюдающая один и тот же IP, обращающийся к нескольким аккаунтам в близкое время, может связать эти аккаунты. Даже если профили отпечатков разные, общая сетевая идентичность создаёт связь.

Назначение прокси для каждого контекста решает эту проблему. Каждый контекст маршрутизируется через отдельный прокси, поэтому трафик от разных идентичностей никогда не использует общий IP. В сочетании с изоляцией отпечатков BotBrowser для каждого контекста каждый контекст представляет полностью независимую идентичность: разный отпечаток, разный IP, разные географические метаданные.

Динамическое переключение прокси также важно для рабочих процессов, охватывающих несколько регионов. Идентичность, которая должна отображаться в США для одной задачи и в Германии для другой, может переключать прокси между задачами, при этом BotBrowser автоматически подстраивает часовой пояс, локаль и язык.

Техническая основа

Контексты браузера и сетевая изоляция

Контекст браузера в Playwright или Puppeteer - это изолированная сессия просмотра внутри одного экземпляра браузера. Каждый контекст имеет собственные cookies, localStorage, sessionStorage и кеш. Playwright расширяет эту изоляцию на сетевую конфигурацию: каждый контекст может иметь собственные настройки прокси.

Когда вы создаёте контекст с browser.newContext({ proxy: ... }), весь трафик из этого контекста маршрутизируется через указанный прокси. Другие контексты в том же экземпляре браузера не затрагиваются. Это настоящая сетевая изоляция на уровне контекста.

Статическая и контекстная конфигурация прокси

Статическая конфигурация задаёт прокси при запуске браузера через --proxy-server. Все контексты в этом экземпляре браузера разделяют один прокси:

chrome --bot-profile="/path/to/profile.enc" \
       --proxy-server=socks5://user:pass@proxy:1080

Контекстная конфигурация задаёт прокси при создании отдельных контекстов:

const context = await browser.newContext({
  proxy: { server: 'socks5://proxy:1080', username: 'user', password: 'pass' },
});

Контекстные прокси переопределяют прокси уровня браузера для конкретного контекста. Если контекстный прокси не указан, контекст наследует прокси уровня браузера.

Как BotBrowser расширяет контекстные прокси

Стандартный Chromium поддерживает контекстные прокси через API Playwright, но не выводит автоматически географические настройки для каждого контекста. BotBrowser расширяет это поведение: при настройке контекстного прокси BotBrowser автоматически определяет часовой пояс, локаль и язык по IP прокси для конкретного контекста.

Это означает, что каждый контекст получает полную географическую идентичность без ручной настройки каждого параметра.

Распространённые подходы и их ограничения

Запуск отдельных экземпляров браузера

Самый простой подход к мультипрокси - запуск отдельного экземпляра браузера для каждого прокси:

# Экземпляр 1
chrome --bot-profile="/profiles/profile-a.enc" \
       --proxy-server=socks5://proxy-us:1080 \
       --user-data-dir="/tmp/session-1"

# Экземпляр 2
chrome --bot-profile="/profiles/profile-b.enc" \
       --proxy-server=socks5://proxy-de:1080 \
       --user-data-dir="/tmp/session-2"

Это работает, но потребляет больше памяти и CPU. Каждый экземпляр браузера имеет собственные процессы рендеринга, GPU-процесс и вспомогательные процессы. Запуск 10 экземпляров использует значительно больше ресурсов, чем запуск 10 контекстов внутри одного экземпляра.

Ротация прокси на уровне фреймворка

Некоторые фреймворки предоставляют ротацию прокси через page.route() или API перехватчиков. Эти подходы модифицируют трафик на уровне JavaScript/CDP, что означает:

  • Начальное соединение может использовать неправильный прокси до активации перехватчика
  • WebSocket-соединения могут не покрываться
  • DNS-предвыборка может утечь через исходный путь прокси

Контекстные прокси, настроенные на уровне движка браузера, не имеют этих проблем с таймингом.

Промежуточные прокси-серверы

Запуск локального промежуточного прокси, который обрабатывает ротацию, добавляет сложность инфраструктуры и единую точку отказа. Браузер подключается к локальному посреднику, который перенаправляет на разные upstream-прокси. Это работает, но вносит задержку и требует поддержки дополнительного ПО.

Подход BotBrowser

Контекстные прокси с автоопределением

Поддержка контекстных прокси BotBrowser (ENT Tier1) обеспечивает полную географическую идентичность для каждого контекста:

const { chromium } = require('playwright-core');

const browser = await chromium.launch({
  executablePath: '/path/to/botbrowser/chrome',
  args: [
    '--bot-profile=/path/to/profile.enc',
  ],
  headless: true,
});

// Контекст США - BotBrowser автоматически определяет географические настройки США
const usContext = await browser.newContext({
  proxy: { server: 'socks5://us-proxy:1080', username: 'user', password: 'pass' },
});

// Контекст Германии - BotBrowser автоматически определяет немецкие географические настройки
const deContext = await browser.newContext({
  proxy: { server: 'socks5://de-proxy:1080', username: 'user', password: 'pass' },
});

Каждый контекст автоматически получает часовой пояс, локаль и языковые настройки, соответствующие географическому расположению его прокси.

Ручные географические переопределения для контекста

Когда вам нужны конкретные географические настройки для контекста, комбинируйте прокси с опциями локали и часового пояса Playwright:

async function createGeoContext(browser, config) {
  return browser.newContext({
    proxy: {
      server: config.proxyUrl,
      username: config.user,
      password: config.pass,
    },
    locale: config.locale,
    timezoneId: config.timezone,
  });
}

const usCtx = await createGeoContext(browser, {
  proxyUrl: 'socks5://us-east:1080',
  user: 'u', pass: 'p',
  locale: 'en-US',
  timezone: 'America/New_York',
});

const jpCtx = await createGeoContext(browser, {
  proxyUrl: 'socks5://jp-tokyo:1080',
  user: 'u', pass: 'p',
  locale: 'ja-JP',
  timezone: 'Asia/Tokyo',
});

Ротация прокси между запросами

Для рабочих процессов, требующих разнообразия IP при переходах, создавайте новый контекст при каждой ротации:

const proxyPool = [
  { server: 'socks5://proxy-1:1080', username: 'user', password: 'pass' },
  { server: 'socks5://proxy-2:1080', username: 'user', password: 'pass' },
  { server: 'socks5://proxy-3:1080', username: 'user', password: 'pass' },
];

async function navigateWithRotation(browser, url, index) {
  const proxy = proxyPool[index % proxyPool.length];
  const context = await browser.newContext({ proxy });
  const page = await context.newPage();

  try {
    await page.goto(url);
    const content = await page.content();
    return content;
  } finally {
    await context.close();
  }
}

// Каждый вызов использует другой прокси
for (let i = 0; i < 10; i++) {
  await navigateWithRotation(browser, 'https://example.com', i);
}

Закрытие контекста после каждого использования обеспечивает чистое состояние: без cookies, кеша или повторного использования соединений между ротациями.

Привязка прокси к сессии

Для рабочих процессов, где каждый аккаунт нуждается в постоянном прокси для нескольких загрузок страниц, держите контекст открытым:

const accounts = [
  { name: 'account-a', proxy: 'socks5://proxy-us:1080' },
  { name: 'account-b', proxy: 'socks5://proxy-uk:1080' },
  { name: 'account-c', proxy: 'socks5://proxy-de:1080' },
];

const contexts = {};

for (const account of accounts) {
  contexts[account.name] = await browser.newContext({
    proxy: { server: account.proxy, username: 'user', password: 'pass' },
  });
}

// Каждый аккаунт использует свой выделенный контекст и прокси
const pageA = await contexts['account-a'].newPage();
await pageA.goto('https://example.com/login');
// ... вход и выполнение задач с прокси аккаунта A

const pageB = await contexts['account-b'].newPage();
await pageB.goto('https://example.com/login');
// ... вход и выполнение задач с прокси аккаунта B

Конфигурация и использование

CLI-прокси по умолчанию с переопределением для контекста

Задайте прокси по умолчанию на уровне CLI, затем переопределяйте для каждого контекста:

const browser = await chromium.launch({
  executablePath: '/path/to/botbrowser/chrome',
  args: [
    '--bot-profile=/path/to/profile.enc',
    // Прокси по умолчанию для контекстов без собственного прокси
    '--proxy-server=socks5://default-proxy:1080',
  ],
  headless: true,
});

// Этот контекст использует прокси по умолчанию
const defaultCtx = await browser.newContext();

// Этот контекст переопределяет конкретным прокси
const specialCtx = await browser.newContext({
  proxy: { server: 'socks5://special-proxy:1080', username: 'u', password: 'p' },
});

Комбинирование с флагами CLI BotBrowser

Для максимальной географической согласованности комбинируйте контекстные прокси с флагами CLI BotBrowser:

const browser = await chromium.launch({
  executablePath: '/path/to/botbrowser/chrome',
  args: [
    '--bot-profile=/path/to/profile.enc',
    '--bot-local-dns',
    '--bot-webrtc-ice=google',
  ],
  headless: true,
});

Флаги --bot-local-dns и --bot-webrtc-ice применяются глобально и защищают все контексты от утечек DNS и WebRTC.

Мультиинстансный подход Puppeteer

Puppeteer не поддерживает контекстные прокси так же, как Playwright. Для Puppeteer используйте отдельные экземпляры браузера:

const puppeteer = require('puppeteer-core');

async function createInstance(profile, proxy, timezone, locale) {
  return puppeteer.launch({
    executablePath: '/path/to/botbrowser/chrome',
    args: [
      `--bot-profile=${profile}`,
      `--proxy-server=${proxy}`,
      `--bot-config-timezone=${timezone}`,
      `--bot-config-locale=${locale}`,
      `--user-data-dir=${'/tmp/session-' + Math.random().toString(36).slice(2)}`,
    ],
    headless: true,
    defaultViewport: null,
  });
}

const usBrowser = await createInstance(
  '/profiles/us.enc', 'socks5://us-proxy:1080',
  'America/New_York', 'en-US'
);

const deBrowser = await createInstance(
  '/profiles/de.enc', 'socks5://de-proxy:1080',
  'Europe/Berlin', 'de-DE'
);

Верификация

После настройки динамического переключения прокси проверьте каждый контекст независимо:

async function verifyContext(context, expectedCountry) {
  const page = await context.newPage();

  // Проверка IP
  await page.goto('https://httpbin.org/ip');
  const ip = await page.textContent('body');
  console.log(`${expectedCountry} IP:`, ip);

  // Проверка часового пояса
  const tz = await page.evaluate(() =>
    Intl.DateTimeFormat().resolvedOptions().timeZone
  );
  console.log(`${expectedCountry} Timezone:`, tz);

  // Проверка локали
  const locale = await page.evaluate(() =>
    Intl.NumberFormat().resolvedOptions().locale
  );
  console.log(`${expectedCountry} Locale:`, locale);

  await page.close();
}

await verifyContext(usContext, 'US');
await verifyContext(deContext, 'DE');

Убедитесь, что каждый контекст показывает разный IP, часовой пояс и локаль. Подтвердите, что трафик одного контекста не утекает в другой.

Лучшие практики

  1. Закрывайте контексты после использования. Открытые контексты потребляют память. Закрывайте их после использования для освобождения ресурсов.

  2. Используйте Playwright для контекстных прокси. Нативная поддержка контекстных прокси Playwright эффективнее, чем запуск отдельных экземпляров браузера.

  3. Сопоставляйте географию прокси с локалью. Всегда согласовывайте часовой пояс, локаль и язык с расположением прокси. BotBrowser делает это автоматически при использовании контекстных прокси.

  4. Устанавливайте --bot-local-dns и --bot-webrtc-ice глобально. Эти флаги защищают все контексты от сетевых утечек независимо от конфигурации прокси.

  5. Используйте разные профили отпечатков для разных аккаунтов. Контекстные прокси изолируют сетевую идентичность, но использование разных профилей для каждого аккаунта обеспечивает также изоляцию отпечатка.

  6. Не используйте page.authenticate() с BotBrowser. API page.authenticate() может мешать автоматическому географическому определению BotBrowser. Используйте встроенные учётные данные в URL прокси.

Часто задаваемые вопросы

Можно ли изменить прокси контекста после создания? Нет. Настройки прокси фиксируются при создании контекста. Для переключения прокси закройте текущий контекст и создайте новый.

Сколько контекстов могут работать одновременно? Жёсткого ограничения нет. Каждый контекст потребляет память, пропорциональную его открытым страницам и кешированным ресурсам. На практике сотни контекстов могут работать внутри одного экземпляра браузера на машине с достаточным объёмом RAM.

Поддерживают ли контекстные прокси SOCKS5H? Да. Все протоколы прокси, поддерживаемые --proxy-server, также поддерживаются в конфигурации контекстных прокси.

Определяет ли BotBrowser географию для контекстных прокси автоматически? Да (ENT Tier1). Когда вы задаёте контекстный прокси, BotBrowser определяет IP прокси и автоматически выводит часовой пояс, локаль и язык для этого контекста.

Можно ли смешивать статические и контекстные прокси? Да. Задайте прокси по умолчанию через --proxy-server при запуске. Контексты, указывающие собственный прокси, переопределяют значение по умолчанию. Контексты без настройки прокси наследуют умолчание уровня браузера.

Что происходит с cookies при закрытии контекста? Все cookies, localStorage и кеш этого контекста удаляются. Если вам нужно сохранить cookies, экспортируйте их перед закрытием контекста.

Поддерживается ли переключение контекстных прокси в Puppeteer? Puppeteer имеет ограниченную поддержку контекстных прокси. Для полного контроля контекстных прокси используйте Playwright. Для Puppeteer запускайте отдельные экземпляры браузера с разными значениями --proxy-server.

Итоги

Динамическое переключение прокси позволяет организовать сложные мультиидентичностные рабочие процессы внутри одного экземпляра браузера. Поддержка контекстных прокси BotBrowser в сочетании с автоматическим географическим определением обеспечивает каждый контекст полной сетевой идентичностью: уникальный IP, соответствующий часовой пояс, подходящая локаль и согласованные языковые настройки.

Для основ работы с прокси смотрите Конфигурация прокси. Для предотвращения сетевых утечек во всех контекстах комбинируйте с Предотвращение утечек DNS и Предотвращение утечек WebRTC. Для полной изоляции идентичности смотрите Изоляция мультиаккаунтного браузера.

#прокси#Dynamic#Switching#Per-Context#Network

Переведите BotBrowser из исследований в продакшн

Используйте эти руководства, чтобы понять модель, а затем перейти к кроссплатформенной валидации, изолированным контекстам и масштабируемому браузерному развертыванию.