Управление cookie в BotBrowser
Узнайте, как управлять cookie в BotBrowser для сохранения сессий, непрерывности между сессиями и изоляции по идентичности с помощью флага --bot-cookies.
Введение
Cookie являются основным механизмом поддержания состояния в браузерах. Они несут в себе токены сессий, пользовательские настройки, записи о согласии и учетные данные для аутентификации между загрузками страниц и посещениями. При создании профилей браузера для исследований конфиденциальности, тестирования или управления множественными учетными записями управление слоем cookie так же важно, как управление слоем отпечатков (fingerprint). Браузер с постоянным отпечатком, но без cookie выглядит как свежая установка при каждом запуске, что не соответствует поведению реальных браузеров.
BotBrowser предоставляет флаг --bot-cookies (уровень PRO) для предварительной загрузки cookie при запуске. Это обеспечивает наличие cookie до первой навигации, до выполнения любого JavaScript и до того, как скрипты отслеживания успеют проверить состояние браузера. В сочетании с профилями отпечатков и другими сигналами идентичности управление cookie делает браузерную сессию реалистичной и постоянной.
Влияние на приватность: почему важно управление cookie
Сайты и системы отслеживания не оценивают cookie в отрыве от других сигналов браузера; они смотрят на взаимосвязь между cookie и остальными сигналами. Браузер, который показывает отпечаток возвращающегося пользователя, но не имеет cookie, вызывает подозрения. Аналогично, браузер с сессионными cookie, но с полностью новым отпечатком выглядит несогласованно.
Для исследователей приватности, изучающих, как системы отслеживания связывают сигналы браузера, контроль над cookie критичен. Это позволяет тестировать, связывает ли система сессии по cookie, по отпечаткам, или по их сочетанию. Для управления множественными учетными записями каждая идентичность должна иметь собственное хранилище cookie, сохраняющееся между сессиями, чтобы поддерживать состояние входа и избегать повторных потоков аутентификации.
Управление cookie также важно для тестирования баннеров согласия, процессов соответствия GDPR и поведения сайтов для возвращающихся пользователей по сравнению с новыми посетителями. Без предварительной загрузки cookie каждая сессия начинается как «новый посетитель», что делает невозможным тестирование опыта возвращающегося пользователя.
Технические детали
Как браузеры хранят cookie
Chromium хранит cookie в базе данных SQLite внутри директории данных пользователя. При запуске браузер загружает cookie из этой базы в память. Каждый cookie имеет несколько атрибутов:
- Domain и Path: определяют, какие запросы включают cookie
- Name и Value: фактические данные cookie
- Expiration: когда cookie должно быть удалено (у session cookie нет времени истечения)
- Secure флаг: отправляется ли cookie только по HTTPS
- HttpOnly флаг: может ли JavaScript получить доступ к cookie
- SameSite: контролирует поведение между сайтами (Strict, Lax или None)
При загрузке страницы браузер прикрепляет совпадающие cookie ко всем HTTP-запросам. JavaScript на странице также может читать и записывать cookie через document.cookie, с учетом ограничений HttpOnly.
Проблема синхронизации (timing)
Большинство фреймворков автоматизации предоставляют управление cookie через свои API. У Playwright есть context.addCookies(), у Puppeteer — page.setCookie(). Однако эти методы добавляют cookie после создания контекста или страницы, поэтому первые сетевые запросы, включая начальную загрузку и preflight-запросы, уходят без этих cookie.
Этот временной разрыв важен, потому что некоторые системы отслеживания инспектируют начальный запрос на наличие cookie. Если первый запрос без cookie, а последующие с cookie, на сервере будет видна несогласованность.
Флаг --bot-cookies в BotBrowser решает эту проблему путем инъекции cookie во время инициализации движка, делая их доступными с самого первого запроса.
Обычные подходы и их ограничения
API управления cookie на уровне фреймворка
Playwright и Puppeteer предлагают управление cookie через API. Они подходят для многих задач, но имеют ограничения:
- Поздняя временная точка: cookie, добавленные API фреймворка, доступны только после создания контекста или страницы, упуская начальную загрузку
- Привязка к контексту: cookie связаны с контекстом браузера, а не с экземпляром. Несколько контекстов в одном экземпляре не будут делиться cookie без явной конфигурации
- Различия форматов: каждый фреймворк использует слегка различный формат объекта cookie, что усложняет обмен данными между инструментами
Ручная персистентность user-data-dir
Другой подход — повторное использование одного и того же --user-data-dir между сессиями. Это автоматически сохраняет cookie (они в SQLite), но также сохраняет весь остальной стейт: кеш, localStorage, IndexedDB, сервис-воркеры и историю. Такой подход не дает гибкого контроля над тем, какие состояния сохранять, а какие сбросить.
Расширения для cookie
Расширения могут управлять cookie, но работают на неподходящем уровне привилегий для автоматизации. Они не могут инъектировать cookie до первой загрузки страницы, а их присутствие само по себе является детектируемым сигналом.
Подход BotBrowser
BotBrowser реализует предварительную загрузку cookie на уровне движка с помощью --bot-cookies. Такая архитектура имеет ряд преимуществ по сравнению с альтернативами.
Инъекция на уровне движка
Cookie, загруженные через --bot-cookies, вставляются в хранилище cookie браузера во время инициализации, до создания контекста и до загрузки страниц. Это означает:
- Первый HTTP-запрос к любому домену уже несет соответствующие cookie
- JavaScript на загрузке страницы может читать cookie через
document.cookie - Серверные системы отслеживания видят согласованное присутствие cookie с первого запроса
Гибкие форматы ввода
Флаг --bot-cookies принимает данные cookie двумя способами:
Inline JSON для небольших наборов или динамической генерации:
--bot-cookies='[{"name":"session","value":"abc123","domain":".example.com"}]'
Ссылка на файл с префиксом @ для больших наборов:
--bot-cookies="@/path/to/cookies.json"
Файл должен содержать массив JSON объектов cookie.
Изоляция по идентичности
Каждый экземпляр BotBrowser использует собственное хранилище cookie. Сопоставляя разные файлы cookie с разными профилями отпечатков, вы создаете полностью изолированные идентичности, где и отпечаток, и cookie независимы.
Конфигурация и использование
Базовое использование в CLI
# Загрузить cookie из файла
./chrome \
--bot-profile=/path/to/profile.enc \
--bot-cookies="@/path/to/cookies.json"
# Inline cookies
./chrome \
--bot-profile=/path/to/profile.enc \
--bot-cookies='[{"name":"consent","value":"granted","domain":".example.com"}]'
Интеграция с Playwright
const { chromium } = require('playwright-core');
(async () => {
const browser = await chromium.launch({
executablePath: '/path/to/botbrowser/chrome',
args: [
'--bot-profile=/path/to/profile.enc',
'--bot-cookies=@/path/to/cookies.json',
],
headless: true,
});
const context = await browser.newContext();
const page = await context.newPage();
await page.goto('https://example.com');
// Cookies уже доступны с первого запроса
const cookies = await context.cookies();
console.log('Active cookies:', cookies.length);
await browser.close();
})();
Изоляция cookie по идентичности
async function createIdentity(profilePath, cookiesPath) {
return chromium.launch({
executablePath: '/path/to/botbrowser/chrome',
args: [
`--bot-profile=${profilePath}`,
`--bot-cookies=@${cookiesPath}`,
],
headless: true,
});
}
const userA = await createIdentity('/profiles/user-a.enc', '/cookies/user-a.json');
const userB = await createIdentity('/profiles/user-b.enc', '/cookies/user-b.json');
Экспорт cookie для сохранения сессии
Сохраните cookie в конце каждой сессии и загрузите их при следующем запуске:
// В конце сессии
const cookies = await context.cookies();
const fs = require('fs');
fs.writeFileSync('/cookies/user-a.json', JSON.stringify(cookies, null, 2));
// Следующая сессия: запуск с --bot-cookies=@/cookies/user-a.json
Проверка
После запуска с --bot-cookies проверьте корректность загрузки cookie:
const page = await context.newPage();
// Проверьте наличие cookie до навигации
const cookies = await context.cookies('https://example.com');
console.log('Pre-loaded cookies:', cookies.map(c => c.name));
// Навигация и проверка отправки cookie в запросе
await page.goto('https://example.com');
// Cookie, доступные через JavaScript
const jsCookies = await page.evaluate(() => document.cookie);
console.log('JS-visible cookies:', jsCookies);
Также можно просмотреть заголовки начального запроса через перехват сетевого трафика, чтобы убедиться, что cookie включены в первый запрос.
Лучшие практики
- Держите файлы cookie по идентичностям. Не делитесь одним файлом cookie между разными профилями отпечатков.
- Устанавливайте реалистичные даты истечения. Отдаленные даты соответствуют нормальному поведению браузера; избегайте прошлых дат.
- Включайте распространенные cookie согласия. GDPR-токены согласия предотвращают появление баннера при каждом визите, имитируя поведение возвращающегося пользователя.
- Ротируйте cookie вместе с профилями. При смене профилей отпечатков обновляйте набор cookie, чтобы он соответствовал новой идентичности.
- Корректно используйте HttpOnly и Secure. Устанавливайте флаги в соответствии с тем, что сайт реально задает в
Set-Cookie. - Используйте префикс
@для путей к файлам. Делает команду запуска чище при работе с большим числом cookie.
Часто задаваемые вопросы
Какой формат принимает --bot-cookies?
Флаг принимает JSON-массив объектов cookie. Каждый объект должен содержать как минимум name, value и domain. Дополнительные поля: path, expirationDate, secure, httpOnly, sameSite. Можно передавать JSON inline или ссылкой на файл с @.
Когда cookie доступны относительно загрузки страницы?
Cookie, загруженные через --bot-cookies, доступны до первой навигации. Они находятся в хранилище при инициализации браузера, поэтому даже первый HTTP-запрос будет их содержать.
Могу ли я использовать --bot-cookies вместе с context.addCookies() Playwright?
Да. --bot-cookies сначала загружает cookie при инициализации. При необходимости вы можете добавить дополнительные cookie позже с помощью context.addCookies().
Как экспортировать cookie для повторного использования в следующей сессии?
В конце сессии используйте API фреймворка для чтения cookie (например, context.cookies() в Playwright), сохраните результат в JSON и передайте его --bot-cookies при следующем запуске.
Работает ли --bot-cookies с несколькими контекстами?
Cookie, загруженные через --bot-cookies, доступны всем контекстам в рамках экземпляра браузера. Если вам нужны разные cookie для разных контекстов, используйте API управления cookie на уровне контекста.
Какой уровень нужен для --bot-cookies?
Флаг --bot-cookies доступен на уровне PRO.
Могу ли я комбинировать --bot-cookies с другими флагами идентичности?
Да. Комбинирование --bot-cookies с --bot-bookmarks, --bot-inject-random-history и флагами локали/часового пояса создаёт полную согласованную идентичность браузера.
Резюме
Управление cookie с помощью --bot-cookies дополняет слой идентичности в BotBrowser, обеспечивая наличие cookie с самого первого запроса. В сочетании с профилями отпечатков и другими флагами идентичности это позволяет создавать сессии браузера с согласованным состоянием на всех уровнях.
Для смежных тем смотрите Multi-Account Isolation, Proxy Configuration и Profile Management.
title: "Управление cookie в BotBrowser" description: "Узнайте, как управлять cookie в BotBrowser для сохранения сессий и изоляции по контекстам с помощью флага --bot-cookies и Playwright." date: "2025-11-11" locale: ru category: identity tags: ["cookies", "management", "identity", "session", "privacy"] published: true
Флаг --bot-cookies
BotBrowser предоставляет флаг --bot-cookies (ENT Tier1) для внедрения cookie при запуске, давая вам полный контроль над состоянием сессии до загрузки первой страницы.
./chrome \
--bot-profile=/path/to/profile.enc \
--bot-cookies=/path/to/cookies.json
Формат файла cookie
Файл cookie использует стандартный формат cookie Chromium:
[
{
"domain": ".example.com",
"path": "/",
"name": "session_id",
"value": "abc123def456",
"expirationDate": 1774000000,
"secure": true,
"httpOnly": true,
"sameSite": "Lax"
},
{
"domain": ".example.com",
"path": "/",
"name": "user_pref",
"value": "dark_mode=1&lang=en",
"expirationDate": 1774000000,
"secure": false,
"httpOnly": false,
"sameSite": "None"
}
]
Cookie доступны сразу при запуске браузера, до начала любой навигации.
Пример Playwright
const { chromium } = require('playwright-core');
(async () => {
const browser = await chromium.launch({
executablePath: '/path/to/botbrowser/chrome',
args: [
'--bot-profile=/path/to/profile.enc',
'--bot-cookies=/path/to/cookies.json',
],
headless: true,
});
const context = await browser.newContext();
const page = await context.newPage();
await page.goto('https://example.com');
const cookies = await context.cookies();
console.log('Active cookies:', cookies.length);
await browser.close();
})();
Флаг --bot-cookies загружает cookie до полной инициализации контекста браузера, делая их доступными на самых ранних этапах загрузки страницы. Это отличается от метода Playwright context.addCookies(), который добавляет cookie после создания контекста.
Изоляция cookie по идентификациям
Каждый экземпляр браузера должен иметь свой набор cookie:
async function createIdentity(profilePath, cookiesPath) {
return chromium.launch({
executablePath: '/path/to/botbrowser/chrome',
args: [
`--bot-profile=${profilePath}`,
`--bot-cookies=${cookiesPath}`,
],
headless: true,
});
}
const userA = await createIdentity('/profiles/user-a.enc', '/cookies/user-a.json');
const userB = await createIdentity('/profiles/user-b.enc', '/cookies/user-b.json');
Каждый экземпляр работает с полностью отдельным хранилищем cookie.
Экспорт cookie для сохранения сессий
Сохраняйте cookie в конце каждой сессии и загружайте их при следующем запуске:
const cookies = await context.cookies();
const fs = require('fs');
fs.writeFileSync('/cookies/user-a.json', JSON.stringify(cookies, null, 2));
При следующем запуске передайте сохраненный файл в --bot-cookies, и сессия продолжится с того места, где была прервана.
Лучшие практики
- Храните файлы cookie отдельно для каждой идентификации. Не используйте один файл cookie для разных профилей фингерпринтов.
- Устанавливайте реалистичные сроки действия. Cookie с далеким сроком истечения выглядят нормально.
- Включайте распространенные cookie согласия. Токены согласия GDPR предотвращают появление баннеров при каждом посещении.
- Ротируйте cookie вместе с профилями. При ротации профилей фингерпринтов обновляйте набор cookie для соответствия.
- Правильно используйте флаги httpOnly и secure. Сопоставляйте флаги с тем, что фактически устанавливает целевой сайт.
Дальнейшие шаги
- Изоляция нескольких аккаунтов для запуска нескольких изолированных идентификаций
- Настройка прокси для согласования сетевой идентификации с cookie и профилем