Назад в Центр знаний
Идентичность

Внедрение закладок: предзаполнение закладок браузера

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

BotBrowser Team

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

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

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

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

Кратко

  • Делайте JSON небольшим, проверяемым и связанным с именованным профилем.
  • Проверяйте полученное дерево в браузере, а не только успешный запуск.
  • Закладки не доказывают личность и не гарантируют поведение сайта.

Содержание

Почему пустая панель закладок даёт неровную точку старта

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

BotBrowser предоставляет флаг --bot-bookmarks, который предзаполняет хранилище закладок при запуске браузера. Флаг принимает JSON-массив записей url и folder, поэтому каждая тестовая сессия может стартовать с состояния закладок, которое вы записали и можете воспроизвести.

Закладки как один из слоёв состояния браузера

У сессии браузера несколько слоёв состояния: cookies, localStorage, IndexedDB, история просмотров, локаль, часовой пояс, сетевая конфигурация и закладки. Каждый слой представляет собой отдельные данные, и каждый можно задавать независимо. Закладки относятся к самым простым для контроля слоям: это обычные данные с небольшой структурой, и они не меняются во время работы скрипта, пока в них ничего не пишет.

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

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

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

Как Chromium хранит закладки

Файл Bookmarks

Chromium хранит закладки в JSON-файле Bookmarks внутри папки профиля в каталоге пользовательских данных, например Default/Bookmarks. Файл содержит дерево, корневые узлы которого включают bookmark_bar, который показывается на панели закладок, и other, папку «Другие закладки» (корневой узел synced хранит закладки с мобильных устройств). Страницы Chrome и BotBrowser, указанные в конце статьи, не описывают этот формат на диске, поэтому считайте названия полей ниже справочным контекстом и сверяйте их с файлом Bookmarks в собственной папке профиля.

У каждой записи дерева есть такие свойства:

  • name: Текст, отображаемый на панели или в менеджере закладок
  • url: Целевой URL для закладок типа URL
  • type: url для закладки или folder для папки с дочерними записями
  • children: Массив вложенных закладок и папок (для записей типа папка)
  • date_added: Метка времени создания закладки

При запуске браузер читает этот файл и заполняет панель и менеджер закладок. Chromium также хранит внутренние метаданные для каждой записи, например идентификатор и метку времени во внутреннем формате. Из-за этих метаданных файлы Bookmarks, написанные вручную, легко содержат незаметные ошибки.

Где видны предзаполненные закладки

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

  1. Панель закладок: Самое заметное место, под адресной строкой, когда она включена
  2. Менеджер закладок: Доступен через chrome://bookmarks
  3. Подсказки омнибокса: Адресная строка может предлагать URL из закладок при вводе

Менеджер закладок является самым надёжным местом для проверки предзаполненной записи, потому что он показывает всё дерево вместе с папками. Остальные места зависят от настроек интерфейса.

Способы заполнить закладки без флага

Ручное редактирование файла Bookmarks

Можно создать каталог пользовательских данных, написать или отредактировать JSON-файл Bookmarks и запустить браузер с этим каталогом. Это работает, но имеет свою цену:

  • Формат включает поля метаданных, такие как идентификаторы и метки времени во внутреннем формате Chromium, и они должны быть корректными
  • Каталогами пользовательских данных нужно управлять явно и следить, какой каталог принадлежит какой идентичности
  • Нет чёткого разделения между данными закладок и остальным состоянием, сохраняемым в том же каталоге

Использование API chrome.bookmarks

API chrome.bookmarks умеет создавать закладки программно, но документация Chrome относит его к API расширений. Он недоступен обычному JavaScript страниц и фреймворкам автоматизации. Чтобы им пользоваться, нужно установить расширение и выдать ему разрешение на закладки. Это добавляет компонент, который затем нужно поддерживать, проверять и синхронизировать между идентичностями.

Управление интерфейсом закладок из фреймворка

Ни Playwright, ни Puppeteer не предоставляют API закладок. Единственный встроенный путь с этими фреймворками состоит в том, чтобы открыть chrome://bookmarks и пройти по интерфейсу кликами, что медленно и хрупко, а делать это придётся в каждой новой сессии.

Как работает --bot-bookmarks

BotBrowser решает задачу предзаполнения закладок с помощью флага --bot-bookmarks, поэтому ни один из трёх путей выше не нужен.

Заполнение при запуске

Когда передан --bot-bookmarks, BotBrowser читает JSON-значение и заполняет хранилище закладок браузера при запуске. Затем записи доступны в менеджере закладок и везде, где ваша конфигурация показывает закладки.

Формат JSON

Флаг принимает JSON-строку, описывающую структуру закладок:

--bot-bookmarks='[{"title":"Google","type":"url","url":"https://www.google.com"},{"title":"News","type":"folder","children":[{"title":"BBC","type":"url","url":"https://www.bbc.com"},{"title":"Reuters","type":"url","url":"https://www.reuters.com"}]}]'

У каждой записи есть title и type. Записи url дополнительно нужен url, а записи folder нужен массив children с другими записями. Публичная документация Bookmark Seeding описывает поля так:

  • title (обязательно): Отображаемое имя закладки или папки
  • type (обязательно): url или folder
  • url (обязательно для записей url): URL закладки
  • children (обязательно для записей folder): Массив дочерних записей

Папки могут содержать другие папки, поэтому структура вроде «Работа», затем «Проекты», затем отдельные ссылки описывается одним значением.

Без расширений

Поскольку заполнение происходит внутри браузера при запуске, расширение не нужно устанавливать и поддерживать. Набор установленных расширений остаётся таким, каким вы его выбрали, а состояние закладок целиком описано аргументами запуска.

Вместе с другими настройками идентичности

Закладки естественно сочетаются с другими настройками запуска. Полная настройка идентичности может включать закладки, cookie, историю просмотров, часовой пояс, локаль и сетевую конфигурацию, причём каждый элемент задан явно, чтобы сессия была внутренне согласованной.

Запуск, проверка и контроль предзаполненных закладок

Короткая панель

chrome --bot-profile="path/to/profile.enc" \
       --bot-bookmarks='[{"title":"Google","type":"url","url":"https://www.google.com"},{"title":"YouTube","type":"url","url":"https://www.youtube.com"}]'

Вложенные папки

chrome --bot-profile="path/to/profile.enc" \
       --bot-bookmarks='[{"title":"Google","type":"url","url":"https://www.google.com"},{"title":"News","type":"folder","children":[{"title":"BBC","type":"url","url":"https://www.bbc.com"},{"title":"Reuters","type":"url","url":"https://www.reuters.com"}]},{"title":"Shopping","type":"folder","children":[{"title":"Amazon","type":"url","url":"https://www.amazon.com"}]}]'

Из Puppeteer

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

const bookmarks = JSON.stringify([
  { title: 'Google', type: 'url', url: 'https://www.google.com' },
  { title: 'YouTube', type: 'url', url: 'https://www.youtube.com' },
  {
    title: 'News',
    type: 'folder',
    children: [
      { title: 'BBC', type: 'url', url: 'https://www.bbc.com' },
      { title: 'Reuters', type: 'url', url: 'https://www.reuters.com' },
    ],
  },
]);

(async () => {
  const browser = await puppeteer.launch({
    executablePath: 'path/to/botbrowser/chrome',
    args: ['--bot-profile=path/to/profile.enc', `--bot-bookmarks=${bookmarks}`],
    headless: true,
    defaultViewport: null,
  });

  const page = await browser.newPage();
  await page.goto('https://example.com');
  await browser.close();
})();

Пример с другими настройками идентичности

chrome --bot-profile="path/to/profile.enc" \
       --bot-bookmarks='[{"title":"Google","type":"url","url":"https://www.google.de"},{"title":"Amazon","type":"url","url":"https://www.amazon.de"}]' \
       --bot-inject-random-history \
       --bot-cookies="@path/to/cookies.json" \
       --bot-timezone=Europe/Berlin \
       --bot-locale=de-DE \
       --bot-languages=de-DE,de,en \
       --proxy-server=socks5://user:pass@de-proxy:1080

В этом сочетании все региональные настройки указывают на Германию: закладки, часовой пояс, локаль, список языков и сетевой выход. Пример показывает, что слои согласуются друг с другом. Он не гарантирует, как сайт отнесётся к сессии.

Среди этих флагов --bot-cookies и --bot-inject-random-history относятся к PRO, а --bot-timezone, --bot-locale и --bot-languages к ENT Tier1, поэтому для полной комбинации нужен тариф, который их включает. Сам --bot-bookmarks относится к Core.

Как собрать JSON без ошибок с кавычками

Частый источник проблем с --bot-bookmarks - само JSON-значение. Три привычки помогают избежать почти всех таких проблем.

Во-первых, не пишите JSON вручную внутри команды оболочки, когда записей больше нескольких. Соберите обычную структуру данных в скрипте и сериализуйте её через JSON.stringify(), как в примере с Puppeteer. Документация Bookmark Seeding даёт тот же совет: собирайте значение через JSON.stringify() и не оборачивайте его в лишние кавычки.

Во-вторых, если всё же пишете значение в оболочке, заключайте его в одинарные кавычки, чтобы двойные кавычки внутри JSON сохранились. Заголовок с апострофом ломает такую обёртку, и это ещё одна причина сериализовать из кода.

В-третьих, проверяйте структуру перед запуском. Небольшая проверка ловит две ошибки, которые документация называет типичными причинами отсутствующих закладок: записи без title или type и папки, у которых массив children содержит некорректные записи.

function validateBookmarks(entries, path = 'root') {
  if (!Array.isArray(entries)) throw new Error(`${path}: expected an array`);
  entries.forEach((entry, index) => {
    const where = `${path}[${index}]`;
    if (!entry.title) throw new Error(`${where}: missing title`);
    if (entry.type === 'url') {
      if (!entry.url) throw new Error(`${where}: url entries need a url`);
    } else if (entry.type === 'folder') {
      if (!Array.isArray(entry.children)) throw new Error(`${where}: folder entries need a children array`);
      validateBookmarks(entry.children, `${where}.children`);
    } else {
      throw new Error(`${where}: type must be "url" or "folder"`);
    }
  });
  return entries;
}

const bookmarks = JSON.stringify(validateBookmarks(entries));

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

Выбор наборов закладок для каждой идентичности

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

const sets = {
  de: [
    { title: 'Google', type: 'url', url: 'https://www.google.de' },
    { title: 'Spiegel', type: 'url', url: 'https://www.spiegel.de' },
    { title: 'Amazon', type: 'url', url: 'https://www.amazon.de' },
  ],
  us: [
    { title: 'Google', type: 'url', url: 'https://www.google.com' },
    { title: 'Reuters', type: 'url', url: 'https://www.reuters.com' },
    { title: 'Amazon', type: 'url', url: 'https://www.amazon.com' },
  ],
};

const args = ['--bot-profile=path/to/profile.enc', `--bot-bookmarks=${JSON.stringify(sets[identity])}`];

Несколько рекомендаций по составлению наборов:

  • Выбирайте сайты, которые человек с таким регионом, языком и ролью правдоподобно сохранил бы: национальное издание, местный магазин или сайт документации.
  • Используйте региональный домен, если он есть. Немецкую идентичность с немецким магазином проще объяснить, чем ту, что ведёт только на глобальный сайт.
  • Делайте наборы достаточно небольшими для проверки. От десяти до пятидесяти записей можно сопровождать вручную, а короткий набор проще сравнивать между запусками.
  • Используйте папки там, где их использовала бы персона, например рабочую папку для разработчика или папку покупок для потребительской персоны.
  • Храните каждый набор в системе контроля версий рядом с конфигурацией запуска, чтобы любой результат можно было связать с точным состоянием закладок, которое его дало.

Практический пример показывает, как это вписывается в тестовый план. Допустим, вы хотите сравнить два запуска одной и той же страницы: один с пустой панелью закладок, другой с немецким набором выше. Запустите оба с одним профилем, часовым поясом и локалью, измените только значение --bot-bookmarks и сохраните обе команды в заметках. Откройте chrome://bookmarks в каждом запуске, чтобы убедиться, что состояние действительно различалось, затем сравните результат, который вы изучаете. Если результаты совпадают, вы узнали, что состояние закладок не влияло на эту страницу. Если различаются, у вас есть документированное и воспроизводимое отличие для дальнейшего изучения. Оба исхода полезны, и ни один не требует догадок.

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

Проверка результата после запуска

После запуска с --bot-bookmarks откройте менеджер закладок и сравните его с переданным значением:

const page = await browser.newPage();
await page.goto('chrome://bookmarks');

Короткий список помогает сделать сравнение честным:

  1. Откройте chrome://bookmarks и убедитесь, что каждая запись верхнего уровня из вашего JSON присутствует, и проверьте, что порядок совпадает с ожидаемым.
  2. Разверните каждую папку и убедитесь, что число дочерних записей совпадает с массивом children.
  3. Посмотрите на саму панель закладок. Если настройки интерфейса её скрывают, закладки всё равно могут быть в менеджере.
  4. Введите в адресную строку домен предзаполненного URL и посмотрите, показывает ли список подсказок запись закладки.
  5. Запишите точное значение запуска рядом с результатом, чтобы запуск можно было повторить.

Дерево закладок: панель с двумя записями url и папка «Новости» с двумя записями url.

Если чего-то не хватает, документированные шаги устранения короткие. Если закладки не появляются, проверьте, что JSON корректен и у каждой записи есть поля title и type. Если папка пустая, убедитесь, что её массив children содержит корректные записи. Если браузер сообщает об ошибке разбора JSON, соберите значение через JSON.stringify() и не добавляйте лишних кавычек вокруг.

Ограничения и привычки, которые стоит сохранить

  • Согласуйте закладки с идентичностью профиля. Профиль немецкого пользователя должен иметь немецкие закладки: google.de, spiegel.de, amazon.de.
  • Варьируйте закладки между идентичностями. У каждой идентичности должен быть свой набор, чтобы результаты случайно не смешивались между персонами.
  • Держите количество в проверяемых пределах. Очень большие наборы трудно проверять, а пустой набор лишает предзаполнение смысла.
  • Смешивайте категории. Люди сохраняют поиск, новости, покупки, соцсети и рабочие страницы. Разнообразный набор описывает персону лучше, чем одна категория.
  • Используйте папки для организации. Папки вроде «Работа», «Покупки» или «Новости» обычны и проверяют вложенный формат.
  • Задавайте остальные слои явно. Закладки работают вместе с --bot-cookies, --bot-inject-random-history и настройками локали и часового пояса. Каждый из них задаётся отдельным флагом.

BotBrowser поддерживает флаг --bot-bookmarks, который при запуске заполняет хранилище закладок браузера из JSON-массива записей url и folder, так что вы можете дать каждой тестовой сессии документированное и воспроизводимое состояние закладок без расширения. BotBrowser не может гарантировать, как сайт или система отслеживания обрабатывает состояние закладок, не заменяет cookie, историю и другие слои идентичности, а сохранение за пределами сессии зависит от вашего каталога пользовательских данных.

Вопросы о предзаполнении закладок

Какой JSON-формат принимает --bot-bookmarks?

Флаг принимает JSON-массив объектов закладок. У каждого объекта есть title, type ("url" или "folder"), а также url для записей URL или массив children для папок. JSON передаётся строкой прямо в аргументе командной строки.

Можно ли загрузить закладки из файла вместо встроенного JSON?

Справочник по CLI описывает --bot-bookmarks как флаг, принимающий JSON-строку. Для больших наборов прочитайте файл закладок в скрипте запуска, проверьте его и передайте сериализованное значение аргументом.

Когда закладки становятся доступными после запуска?

BotBrowser заполняет хранилище закладок при запуске из переданного значения. Откройте chrome://bookmarks, чтобы проверить содержимое.

Сохраняются ли закладки между сессиями?

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

Можно ли использовать флаг вместе с --bot-inject-random-history?

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

Требуется ли определённый тариф для --bot-bookmarks?

Справочник по CLI относит --bot-bookmarks к флагам Core. Актуальную доступность каждого флага смотрите на странице флагов CLI.

Сколько закладок следует включать?

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

Меняет ли предзаполнение закладок то, как сайты относятся к сессии?

Не предполагайте этого. BotBrowser задаёт состояние закладок браузера. Он не утверждает, что какой-либо сайт или система отслеживания читает или учитывает это состояние, а API chrome.bookmarks в документации Chrome относится к API расширений, а не к тому, чем пользуется JavaScript страниц.

Что стоит запомнить

Предзаполнение закладок через --bot-bookmarks даёт каждой сессии BotBrowser записанное, проверяемое и воспроизводимое состояние закладок. Вместе с cookie, историей просмотров и согласованными настройками локали оно оставляет под вашим контролем ещё один слой тестовой идентичности. Проверяйте результат в chrome://bookmarks, храните JSON под версионным контролем и считайте функцию одним из слоёв состояния среди прочих.

Смежные темы: Управление cookie для сохранения сессий, Синтетическая история просмотров для заполнения истории и Управление профилями для организации полных наборов идентичностей.

Практический итог

Используйте предзаполнение, чтобы сделать вход состояния браузера явным и повторяемым, затем проверьте видимое дерево и храните только необходимые метаданные. BotBrowser управляет входом запуска, а не тем, что сайт покажет или будет наблюдать.

Источники

#Bookmarks#Injection#Identity#Browser#приватность

Эта статья входит в руководство: Поверхности идентичности браузера: обзор согласованности

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

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