> For the complete documentation index, see [llms.txt](https://farmnet.gitbook.io/youtube-uploader-documentation/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://farmnet.gitbook.io/youtube-uploader-documentation/anti-detekt-brauzer.md).

# Анти-детект браузер

## **Преимущества**

### **Fingerprint spoofing**

* Подмена свойств `navigator` (устройство, браузер, локаль и т.д.)
* Поддержка эмуляции размера и разрешения экрана и т.д.
* Подмена параметров WebGL, поддерживаемых расширений, атрибутов контекста и форматов точности шейдеров
* Подмена размеров внутреннего и внешнего viewport окна
* Подмена sample rate AudioContext, output latency и максимального числа каналов
* Подмена голосов устройства и скоростей воспроизведения
* Подмена количества доступных микрофонов, веб-камер и динамиков
* Сетевые заголовки (`Accept-Language` и `User-Agent`) подменяются в соответствии со свойствами navigator
* Подмена WebRTC IP на уровне протокола
* Подмена геолокации, часового пояса и локали
* Подмена Battery API

### **Stealth patches**

* Устраняет утечки при выполнении кода в main world — весь JavaScript страницы изолирован в sandbox
* Устраняет утечки execution context фреймов
* Исправляет детектирование `navigator.webdriver`
* Исправляет детектирование headless Firefox через тип указателя
* Удалены патчи обработки meta viewport, потенциально раскрывающие информацию
* Используются нестандартные размеры экрана и окна
* Включены обратно fission content isolations
* Включён обратно PDF.js
* Изменены другие «утекающие» конфигурационные параметры
* Человекоподобное движение курсора

### **Защита от font fingerprinting**

* Автоматически использует корректные системные шрифты для вашего User-Agent
* В комплекте — системные шрифты Windows, Mac и Linux
* Предотвращает font metrics fingerprinting за счёт случайного смещения межбуквенного интервала

### **Оптимизации**

* Удалены/отключены *очень многие* сервисы Mozilla. Работает быстрее оригинального Firefox и потребляет меньше памяти (\~200 МБ)
* Патчи от LibreWolf и Ghostery для удаления телеметрии и bloat
* Debloat config из PeskyFox, LibreWolf и других проектов
* Оптимизации скорости и сети из FastFox
* Удалены все CSS-анимации
* Минималистичная тема оформления

### **Аддоны**

* Загрузка Firefox-аддонов без debug-сервера — просто передайте список путей в свойство `addons`
* Встроен uBlock Origin с кастомными privacy-фильтрами
* Аддонам запрещено открывать новые вкладки
* Аддоны автоматически включаются в режиме приватного просмотра
* Аддоны автоматически закрепляются на тулбаре
* Исправлены DNS-утечки при prefetch'инге uBO

<details>

<summary>Обзор stealth-возможностей</summary>

**Текущий статус по состоянию на 2026 год**

{% hint style="info" %}
В обслуживании проекта был перерыв на год по личным обстоятельствам. Производительность Camoufox снизилась из-за базовой версии Firefox и вновь обнаруженных несоответствий в fingerprint'ах (автор объясняет это в своей статье). **Camoufox в настоящее время находится в активной разработке.**
{% endhint %}

### **Как Camoufox скрывает свою библиотеку автоматизации**

В Camoufox весь внутренний код Page Agent'а Playwright'а изолирован в sandbox. Это делает невозможным обнаружение присутствия Playwright через JavaScript-инспекцию страницы.

Обычно Playwright внедряет JavaScript в страницу — например, `window.__playwright__binding__` — для выполнения таких действий, как запрос элементов, выполнение JavaScript или запуск init-скриптов. Всё это можно обнаружить. В Camoufox эти действия выполняются в изолированной области вне страницы. Иными словами, сайты больше не «видят» никакого JavaScript, который Playwright обычно внедряет. Это полностью устраняет следы Playwright.

Тем не менее, даже скрывая библиотеку автоматизации, Camoufox не застрахован от несоответствий при ротации fingerprint'ов — это требует постоянного мониторинга и исправлений.

### **Взаимодействие со страницей**

Anti-bot системы также запускают клиентские скрипты для мониторинга поведения пользователя: они ищут паттерны в движениях мыши, кликах, скроллинге и тайминге между действиями.

Camoufox делает всё возможное с помощью алгоритма человекоподобного движения мыши. Алгоритм естественного движения изначально взят из [HumanCursor от riflosnake](https://github.com/riflosnake/HumanCursor), переписан на C++ и доработан для более реалистичных траекторий с учётом расстояния.

Однако это не идеально — достаточно сложный анализ всё ещё может его обнаружить. (В планах на будущее)

***

### **Как Camoufox ротирует идентичности**

Помимо скрытия библиотеки автоматизации, в каждом экземпляре необходимо также рандомизировать identity, чтобы избежать rate limiting'а и обнаружения. Ротация IP-адреса ничего не значит, если по остальным признакам это явно один и тот же пользователь. Существуют тысячи параметров, формирующих уникальный **fingerprint**.

### **Распределение рыночной доли**

Даже при ротации IP для каждого bot-экземпляра web application firewall'ы могут использовать машинное обучение для анализа входящего трафика и выявления аномалий. Если рыночная доля Linux составляла 5%, а внезапно стала 20% — это red flag. Системы безусловно потребуют от всех таких пользователей пройти captcha.

Camoufox использует генератор fingerprint'ов [BrowserForge](https://github.com/daijro/browserforge), чтобы имитировать статистическое распределение данных устройств в реальном трафике. Например, браузер будет выглядеть как Linux-пользователь в 5% случаев. Из этих 5%, разрешение экрана 2560×1440 будет имитироваться в 9,5% случаев, а GPU Intel HD — в 27,5%.

### **Как Camoufox можно обнаружить?**

Camoufox может подделывать fingerprint'ы с корректным распределением по рыночной доле. Однако **fingerprint'ы должны быть внутренне согласованными.** Windows user agent с GPU Apple M1, MacOS user agent с Windows DirectX renderer'ом, мобильное устройство с десктопным разрешением экрана — всё это невозможные комбинации, которые будут помечены как подозрительные.

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

***

### Как Camoufox сравнивается с другими решениями?

***

#### **JavaScript-based решения**

Раньше разработчики пытались внедрять JavaScript для подмены значений, но это работает ненадёжно: JavaScript не может подменить всё. Неполное покрытие приводит к несогласованным fingerprint'ам. Например, anti-bot система поймает вас, если User-Agent сетевого запроса не совпадает с User-Agent'ом navigator'а.

Кроме того, любой внедрённый JavaScript обнаружим. Anti-bot системы могут проверить: не раскрывает ли `Object.getOwnPropertyDescriptor` перезаписанное свойство, не перестал ли `toString()` функции возвращать `[native code]` (что выдаёт подмену), не расходятся ли данные в window context с контекстом worker thread'а. Обходные пути дают лишь временный результат — при достаточно глубоком поиске JS-инъекцию всегда можно обнаружить.

#### **Подход Camoufox**

Поскольку Camoufox перехватывает вызовы на уровне C++-реализации браузера, все подменённые объекты и свойства выглядят нативными. Никакого JavaScript-hijacking'а для обнаружения нет.

Camoufox также пытается генерировать согласованные и правдоподобные fingerprint'ы с помощью BrowserForge. Однако сложные методы fingerprint-детектирования всё ещё могут это выявить (как описано выше).

***

#### **CDP-based библиотеки**

CDP (Chrome DevTools Protocol) — протокол автоматизации, встроенный в Chromium и Firefox. Однако CDP не делает никаких попыток скрыть факт своего использования и выставляет большую часть своей функциональности в scope страницы. Среди распространённых методов обнаружения: проверка `navigator.webdriver`, поимка stack debugger'а, проверка переменных, которые ChromeDriver внедряет в объект document для внутренней коммуникации, и т.д.

#### **Подход Camoufox**

Playwright использует CDP для управления Chromium, но для Firefox использует *Juggler* — кастомный протокол, разработанный до того, как Firefox добавил поддержку CDP ([оригинальный репозиторий](https://github.com/puppeteer/juggler)). Это отдельный модуль внутри Firefox, не являющийся частью его ядра, что упрощает контроль над тем, что раскрывается странице.

Camoufox патчит Juggler так, что тот работает с собственной изолированной «копией» страницы. Playwright может свободно читать и редактировать свою версию страницы — для него всё работает как обычно, но реальная страница при этом никак не затрагивается. Страница также не может обнаружить факт чтения (через tricks вроде hijacking'а геттеров) или добавленных listener'ов для наблюдения за элементами.

Кроме того, Juggler отправляет input'ы напрямую через оригинальные обработчики пользовательского ввода Firefox — они обрабатываются точно так же, как при обычном использовании браузера. Camoufox также патчит headless-режим Firefox, чтобы он выглядел так же, как при запуске в обычном окне. А в качестве запасного варианта Python-библиотека может запускать Camoufox через [virtual display](https://camoufox.com/python/virtual-display/), если headless-режим всё же даёт утечку.

</details>

## Какие риски покрывает FARMNET Uploader?

***

### Ротация отпечатков и прокси, инициализация и поведение блоков.

* Сохранение идентификатора устройства: Атомарное хранение Fingerprint в каждом профиле - fingerprint.json генерируется один раз при создании профиля и переиспользуется при каждом следующем запуске. Все поля fp согласованы между собой как единая связка.
* Сохранение локали - BCP-47 локаль (например, de-DE) выводится из страны прокси при первой генерации и лочится в sidecar профиля.
* Сохранение состояния ОС - выводится из fp.navigator.platform и передаётся в Camoufox через os= при каждом запуске.
* Сохранение WebGL - webgl\_vendor и webgl\_renderer берутся из fp.videoCard при первой генерации и передаются в Camoufox. Иначе Camoufox сэмплировал бы новую видеокарту каждый запуск, выдавая разные WebGL-подписи между сессиями одного аккаунта.
* Стабилизация canvas font fingerprint - fonts\_spacing\_seed лочится в профиле и передаётся в Camoufox. Без этого Camoufox генерировал бы новый seed каждый запуск, что меняло бы пиксельную подпись отрисовки шрифтов.

### Калибровка по гео

* Локаль = страна прокси. Перед запуском профиля программа ищет в пуле прокси с exit-IP в стране, на которую залочен fingerprint. Обеспечивает координированность IP-геолокации и заявленной локали браузера.
* Предупреждение в логе о расхождении страны текущего прокси и страны залоченной в fingerprint. Регенерация fp в такой ситуации не делается — это вызвало бы device change event с точки зрения платформы.
* timezone, latitude, longitude — определяются автоматически через geoip=True по exit-IP прокси.

### Валидация

* Перед каждым запуском браузера выполняется проверка конфига: наличие Fingerprint правильного типа, наличие locale/os/webgl\_config, наличие fonts\_spacing\_seed, отсутствие конфликтующих с persistent state значений (fonts, screen). Если что-то не так — запуск блокируется с понятной ошибкой.
* Пользовательские настройки идентичности (os, locale, webgl\_config, fonts, screen) из глобального settings.json игнорируются — per-profile persistent state приоритетнее. В логе выводится warning, чтобы юзер знал что его настройка не применена.

### Поведение

* Гуманизированные паузы между шагами автоматизации: 1-4с между блоками, 5-15с между задачами, 8% шанс залипания 10-30с. Симулируют естественные паузы пользователя между действиями.
* Гуманизированная траектория мыши через Camoufox humanize=True. Движения и клики реализованы C++ алгоритмом внутри Camoufox, а не через Playwright API — отсутствуют типичные автоматизационные паттерны.
* Stagger при запуске параллельных потоков — каждый worker ждёт от 1.5 до 6 секунд случайной задержки перед первым запуском браузера. Без этого N браузеров запускались бы в одну миллисекунду, что детектируется как co-launch correlation на сетевом уровне.

### Производительность

* Ограничение числа запущенных потоков. <br>

  <div data-gb-custom-block data-tag="hint" data-style="info" class="hint hint-info"><p>Формула: <br><code>min(cpu_count() // 2, total_ram_mb // 700, 8)</code>. </p></div>

  \
  При высокой параллельной нагрузке на GPU тайминги рендеринга (WebGL, canvas, requestAnimationFrame) у всех браузеров на одной машине становятся скоррелированными — даже если каждый профиль выглядит как отдельное устройство, синхронные дрожания таймингов выдают их общее происхождение. Антифрод-системы могут использовать это для cross-account correlation. Чтобы тайминги оставались независимыми, GPU должен иметь запас мощности — поэтому ограничиваем число параллельных браузеров.

### Read-only профиль

Браузерные скрипты не имеют права изменять идентичность профиля. Это означает: не вызывают page.set\_extra\_http\_headers (User-Agent, Accept-Language), не вызывают page.set\_viewport\_size, не используют add\_init\_script для патчинга navigator/screen/window, не мутируют объект Profile, не вызывают repository.update\_profile. У блоков есть только read-доступ к данным профиля через ctx.params. Все изменения identity делает пользователь через UI программы, средствами никак не пересекающимися с runtime браузера.

### Хранение состояния браузера

Все данные сессии (cookies, localStorage, IndexedDB, prefs.js, cache) сохраняются в browser\_data/ внутри директории профиля. За счёт persistent\_context=True Camoufox переиспользует эту директорию при каждом запуске вместо создания временной. Платформы сохраняют device-trust ключи (например, у YouTube это yt-spf-identity-tags в localStorage и связанные записи в IndexedDB) на стороне клиента — они живут локально между сессиями и подтверждают платформе, что аккаунт заходит с того же устройства, что и в прошлый раз.
