Чтобы запустить Camoufox с резидентными прокси, передайте в Camoufox() или AsyncCamoufox() словарь proxy в формате Playwright, включите geoip=True, чтобы браузер взял часовой пояс, локаль и геолокацию из выходного IP, и используйте sticky-сессию: тогда IP, который Camoufox определил при запуске, совпадёт с тем, через который вы работаете. Camoufox — это сборка Firefox, где подмена отпечатка сделана патчами на C++, а не набором JavaScript-переопределений, поэтому на вас остаётся одна задача: чтобы сетевая идентичность и идентичность браузера не противоречили друг другу. Дальше в руководстве — код, проверки, на которых он построен, и случаи, когда Camoufox не подходит.
Что такое Camoufox и зачем ему резидентные прокси
Camoufox — форк Firefox с открытым кодом, созданный для скрапинга и AI-агентов. Управлять им можно через обычный Playwright API из Python (пакет camoufox на PyPI), а с сентября 2026 года — ещё и через официальный npm-лаунчер. В README сказано, что данные «перехватываются на уровне реализации C++», поэтому страница, которая изучает navigator, экран, WebGL или шрифты, видит нативные геттеры, а не пропатченные JavaScript-функции.
Это другой подход, чем у инструментов на базе Chromium. Patchright — пропатченный драйвер Playwright: сам Chrome он не трогает, а лишь не даёт драйверу делать заметные вещи через Chrome DevTools Protocol (CDP), например вызывать Runtime.enable. nodriver полностью отказывается от WebDriver и общается со стоковым Chrome по CDP. Оба инструмента делают автоматизированный Chrome похожим на Chrome. Camoufox делает автоматизированный Firefox похожим на множество разных установок Firefox, а Playwright управляет им через Juggler — собственный протокол автоматизации Firefox, а не через CDP. Патчи Camoufox дают Juggler изолированную копию страницы, поэтому вспомогательные объекты Playwright (например, window.__playwright__binding__) скриптам страницы не видны.
Резидентные прокси нужны потому, что IP Camoufox скрыть не может. При каждом запуске генерируется новая идентичность устройства: ОС, экран, GPU, шрифты, голоса, язык. Если эта идентичность говорит «домашний десктоп в Германии», а соединение приходит из датацентрового диапазона в Вирджинии, вся работа над отпечатком теряет смысл. В README прямо сказано, что Camoufox «рассчитан на использование с ротируемыми прокси (желательно резидентными IP)».
Установка Camoufox и загрузка браузера
Установка состоит из двух шагов: сначала Python-пакет, затем пропатченный бинарник Firefox, который скачивается отдельно.
pip install -U "camoufox[geoip]"
python -m camoufox fetch
Дополнение [geoip] добавляет ридер geoip2, а Camoufox скачивает к нему базу геолокации. В документации по установке она названа необязательной, но «настоятельно рекомендуемой, если вы используете прокси», и без неё geoip=True не заработает. Два замечания о версиях, важных при фиксации зависимостей:
- На начало октября 2026 года актуальный стабильный релиз на PyPI —
camoufox 0.5.6(6 сентября 2026), собранный на Firefox 152. Сборки на Firefox 156 в конце сентября выходили как пререлизы на GitHub и беты0.5.7b*. Берите стабильную версию, если вам не нужен конкретный фикс. - Пакету нужен Python 3.10 или новее, а в его
pyproject.tomlзафиксированоplaywright<1.63, потому что серверный режим импортирует приватный модуль Playwright. Если что-то ещё в проекте требует самую свежую версию Playwright, ждите конфликта.
Python API: sync, async и важные параметры
Camoufox оборачивает лаунчер Firefox из Playwright, так что, получив объект браузера, вы пользуетесь всеми вызовами Playwright как обычно. Синхронная и асинхронная точки входа — контекстные менеджеры:
from camoufox.sync_api import Camoufox
with Camoufox(headless=True) as browser:
page = browser.new_page()
page.goto("https://example.com")
print(page.title())
import asyncio
from camoufox.async_api import AsyncCamoufox
async def main():
async with AsyncCamoufox(headless=True) as browser:
page = await browser.new_page()
await page.goto("https://example.com")
print(await page.title())
asyncio.run(main())
Для работы через прокси важнее всего следующие именованные аргументы. Описания взяты из документации по использованию и docstring функции launch_options() в исходниках pythonlib:
proxy: словарь прокси в формате Playwright (server,username,password). Приgeoip=TrueCamoufox при запуске ещё и отправляет через этот прокси один запрос, чтобы узнать выходной IP.geoip:True— определить выходной IP автоматически, либо строка с конкретным IP. По этому IP Camoufox выставляет широту/долготу, часовой пояс, страну, локаль и IP для WebRTC. Параметрgeoip_dbвыбирает базу. 30 сентября 2026 года в ветке main базой по умолчанию стала «GeoIP AIO», а GeoLite2 объявлена устаревшей, так что проверьте, какую использует ваша установленная версия.locale: явная локаль вроде"en-US", код страны вроде"US"(тогда Camoufox выбирает язык по распределению носителей в этой стране) или список. Первый элемент определяет поведениеIntlAPI.humanize:Trueили число с плавающей точкой — максимальное время движения курсора в секундах. Стабильная 0.5.6 по-прежнему рисует кривые Безье. В ветке main 24 сентября 2026 года перешли на воспроизведение записанных траекторий мыши реальных людей из датасета Cursory, так что это доступно только в пререлизах на Firefox 156 и более поздних сборках.headless: по умолчаниюFalse.Trueвключает headless-режим Firefox, который Camoufox патчит так, чтобы он выглядел как обычное окно."virtual"запускает браузер в обычном (headful) режиме внутри виртуального дисплея Xvfb. Этот вариант работает только на Linux и требует установленного пакетаxvfb.os: ограничивает генерируемую идентичность значениями"windows","macos","linux"или их списком.block_webrtc,block_images,block_webgl: переключатели. В предупреждениях самого проекта сказано, что блокировка WebGL или изображений, по имеющимся сообщениям, приводит к обнаружению на крупных WAF.
На странице о виртуальном дисплее объяснено, зачем нужен "virtual": Camoufox патчит headless-режим, но «работа в headless-режиме в будущем всё же может стать обнаруживаемой». На Linux-сервере Xvfb стоит немного дополнительной памяти и убирает целый класс признаков headless-браузера. Обычно оно того стоит.
Рабочий пример: таргетинг по стране, sticky-сессия, согласованность
Пример ниже открывает многошаговую сессию через шлюз ProxyHat с выходом в Германии, даёт Camoufox вывести часовой пояс и локаль из выходного IP и, прежде чем делать что-то полезное, проверяет, что идентичность согласована. И страна, и сессия задаются в имени пользователя прокси.
import asyncio
import secrets
from camoufox.async_api import AsyncCamoufox
PROXY_USER = "USERNAME"
PROXY_PASS = "PASSWORD"
def proxy_for(country: str, session_id: str) -> dict:
# Sticky-сессия + таргетинг по стране, оба параметра в имени пользователя
return {
"server": "http://gate.proxyhat.com:8080",
"username": f"{PROXY_USER}-country-{country}-sid-{session_id}-ttl-10m",
"password": PROXY_PASS,
}
COHERENCE_JS = """() => ({
tz: Intl.DateTimeFormat().resolvedOptions().timeZone,
offsetMin: new Date().getTimezoneOffset(),
lang: navigator.language,
langs: navigator.languages,
platform: navigator.platform,
})"""
async def run(country: str = "DE") -> None:
session_id = secrets.token_hex(4) # один IP на весь сценарий
async with AsyncCamoufox(
proxy=proxy_for(country, session_id),
geoip=True, # часовой пояс/локаль/гео/WebRTC по выходному IP
humanize=True, # «человеческое» движение курсора
headless="virtual", # Linux + Xvfb; на других ОС используйте headless=True
os=["windows", "macos"],
) as browser:
page = await browser.new_page()
# 1. Что видит внешний мир?
await page.goto("https://ipinfo.io/json")
exit_info = await page.evaluate("() => JSON.parse(document.body.innerText)")
# 2. Что заявляет браузер?
claimed = await page.evaluate(COHERENCE_JS)
print("exit:", exit_info.get("ip"), exit_info.get("country"), exit_info.get("timezone"))
print("browser:", claimed)
if exit_info.get("timezone") != claimed["tz"]:
raise RuntimeError("timezone does not match exit IP; abort before real traffic")
# 3. Реальная многошаговая работа на том же IP
await page.goto("https://example.com/", wait_until="domcontentloaded")
# ... логин, пагинация, отправка форм — всё на одном session_id
asyncio.run(run("DE"))
Почему пример устроен именно так:
- С
geoip=Truesticky-сессия обязательна. Определение IP происходит один раз, при запуске браузера: функция Camoufoxpublic_ip()отправляет через ваш прокси запрос к публичному сервису, возвращающему IP, и строит идентичность по ответу. Если в имени пользователя нет сессии, ротируемый шлюз может отдать следующему соединению другой резидентный IP. В стране с одним часовым поясом это почти незаметно. В США, России, Бразилии или Австралии второй IP может оказаться на несколько часовых поясов дальше того, о котором сообщает браузер. Sticky-сессия гарантирует, что IP при определении и IP при работе совпадают (подробнее — в нашем руководстве sticky и ротируемые сессии). - Один ID сессии на браузер, а не на страницу. Чтобы сменить IP, закройте браузер и запустите новый с новым
session_id. Так вы одновременно получаете новый IP и новый отпечаток — именно так выглядит другой посетитель. - Проверка через ipinfo — дешёвая сигнальная растяжка. Подойдёт любой эндпоинт IP-геолокации. Смысл в том, чтобы сравнить то, что говорит сеть, с тем, что говорит браузер, до того как тратить запросы на целевой сайт. Базы геолокации на краях расходятся, поэтому считайте несовпадение поводом перезапуститься, а не доказательством поломки.
- Предпочитайте HTTP-эндпоинт. В документации Playwright по сети аутентификация по логину и паролю описана только для HTTP(S)-прокси. SOCKS5 (
gate.proxyhat.com:1080) поддерживается как тип прокси, но SOCKS с аутентификацией через браузер — как раз то место, где конфигурации обычно ломаются. Более общие компромиссы разобраны в статье HTTP vs SOCKS5.
Чек-лист согласованности отпечатка
Согласованность означает, что страна выходного IP, часовой пояс, язык, адрес WebRTC, ОС, шрифты и GPU описывают одну правдоподобную машину в одном месте. Сторону браузера Camoufox берёт на себя; большинство сбоев возникает из-за настроек, которые вы переопределяете вручную. Проверьте это перед масштабированием:
- Страна выходного IP ↔ часовой пояс. Проверяйте и
Intl.DateTimeFormat().resolvedOptions().timeZone, иDate.getTimezoneOffset(). Скрипты обнаружения сравнивают часовой пояс по геолокации IP с часовым поясом браузера, и несовпадение — один из старейших признаков прокси. Сgeoip=Trueна sticky-сессии они совпадают по построению. - Страна выходного IP ↔ язык.
navigator.language,navigator.languagesи заголовокAccept-Languageдолжны соответствовать стране. Заголовок иnavigatorCamoufox синхронизирует сам. Если передаётеlocale=, указывайте полную локаль с регионом ("de-DE", а не"de"): проект предупреждает, что недостающий регион будет сгенерирован автоматически, а это «может вызвать подозрения, если ваш IP не совпадает с регионом локали». - WebRTC ↔ выходной IP. WebRTC может раскрыть ваш реальный локальный или публичный адрес в обход прокси. С включённым
geoipCamoufox подменяет IPv4 в WebRTC на уровне протокола на выходной IP и отключает IPv6 DNS. Оставьте WebRTC включённым и подменённым, а не заблокированным: десктопный Firefox совсем без WebRTC — редкость. - Geolocation API ↔ IP. Camoufox заполняет широту и долготу по результату GeoIP и выставляет нужную настройку разрешений, так что
navigator.permissions.query({name: "geolocation"})стабильно сообщает «granted» в соответствии с отдаваемой позицией. Не задавайте геолокацию вconfigвручную. Библиотека предупреждает, что это «может привести к обнаружению, если целевая геолокация не совпадает с вашим IP». - ОС ↔ шрифты ↔ GPU. Генератор опирается на статистическую модель реального трафика, а проверка согласованности отбрасывает невозможные сочетания вроде User-Agent под Windows с GPU Apple M1. Избегайте
custom_fonts_only=Trueи передавайте вwebgl_configтолько те пары, которые модель встречала на этой ОС (иначе будетValueError). - User-Agent: не трогайте. Ручная установка
User-Agentили полейnavigator— самый быстрый способ добиться расхождения между сетью и JavaScript. Библиотека предостерегает от обоих. - Тип IP ↔ заявленное устройство. Сгенерированный потребительский десктоп на ASN хостинг-провайдера — несогласованная пара, каким бы хорошим ни был отпечаток. Именно здесь резидентные (или ISP) IP оправдывают свою цену. Как эти сигналы объединяются на стороне сервера, рассказано в нашем разборе браузерного фингерпринтинга.
- Одна идентичность на сессию. Cookies, IP и отпечаток должны меняться вместе или не меняться вовсе. Вернувшийся cookie на новом IP с новым GPU похож на человека меньше, чем стабильная сессия или чистая новая.
Camoufox, Patchright или nodriver: что выбрать
Выбирайте прежде всего по движку. Если целевой сайт видит в основном трафик Chrome или проверяет поведение V8, берите инструмент на Chromium. Если нужна глубокая ротация отпечатков без написания JavaScript-патчей и трафик Firefox допустим, берите Camoufox. В таблице сведены компромиссы по состоянию на октябрь 2026 года.
| Camoufox | Patchright | nodriver | |
|---|---|---|---|
| Движок | Пропатченный Firefox (Gecko + SpiderMonkey) | Chromium / Chrome (браузер без патчей) | Установленный у вас Chrome, Chromium, Edge или Brave |
| Протокол управления | Juggler (пропатчен, изолирован от страницы) | CDP, Runtime.enable обходится через изолированные миры | Напрямую CDP, без WebDriver |
| API | Playwright (Python, JS/TS) | Полная замена Playwright (Python, Node, .NET от сообщества) | Собственный асинхронный Python API |
| Источник TLS-отпечатка | Собственный стек NSS в Firefox, то есть ClientHello от Firefox | BoringSSL настоящего Chrome, особенно с channel="chrome" | BoringSSL настоящего Chrome |
| Ротация отпечатков | Встроена, генерируется при каждом запуске на уровне C++ | Нет. Рекомендует настоящий Chrome без инъекций | Встроенной нет |
| Поддержка (окт. 2026) | Снова активна. Стабильная 0.5.6 в сентябре 2026, но с марта 2025 по январь 2026 стабильных релизов не было | Следует за Playwright. Драйвер v1.63.0 вышел в сентябре 2026 | Последний релиз на PyPI — 0.50.3, май 2026 |
| Типичные причины провала | Повышенное внимание к Firefox, проверки движка, которые проходит только Chrome, несоответствия в отпечатке, которые вендоры находят и добавляют в свои проверки | Отключён Console API, только Chromium, общие сигналы headless и поведения по-прежнему работают | Выполнение кода в main world заметно, нет управления отпечатком, API меньше, чем у Playwright |
Строка про TLS важнее, чем кажется. Все три инструмента используют сетевой стек настоящего браузера, так что ни у одного нет того несоответствия, которое возникает, когда Python-библиотека requests выдаёт себя за Chrome. Но Camoufox всегда будет предъявлять рукопожатие Firefox. Если модель сайта ожидает TLS в духе Chrome для большей части трафика, загляните в наш разбор TLS-фингерпринтинга — там описано, как JA3/JA4 используются для такого профилирования.
Честно об ограничениях
Camoufox хорошо делает одну вещь — согласованную ротируемую идентичность Firefox без JavaScript-патчей, — и за это приходится платить.
Firefox — малая доля трафика
По данным StatCounter, в сентябре 2026 года на Firefox приходилось около 6,1% мирового десктопного трафика против примерно 65% у Chrome. Небольшую популяцию проще моделировать, и любая аномалия в ней заметнее. Некоторые сайты охотнее показывают челленджи браузерам не на Chromium. Относится ли к ним ваш целевой сайт, вы узнаете, только протестировав его на собственном трафике.
Выдать себя за Chrome он не может
README говорит об этом прямо: Camoufox «не полностью поддерживает инъекцию отпечатков Chromium», а некоторые WAF «проверяют поведение движка SpiderMonkey, которое подделать невозможно». Если сайт требует именно Chrome, никакая настройка Camoufox не поможет.
Поддержка была неровной
Пробел виден в истории релизов. Последней стабильной сборкой перед паузой была v135.0.1-beta.24 от 15 марта 2025 года. Автор приостановил работу, и, если не считать редких коммитов от сообщества, ничего не выходило до беты на Firefox 146 в январе 2026 года. Затем в README официальным мейнтейнером была названа Clover Labs. С тех пор проект развивается быстро: сборка на Firefox 150 в мае, стабильные сборки на Firefox 152 с июля, официальный лаунчер на TypeScript в сентябре и пререлизы на Firefox 156 к концу месяца. В README по-прежнему висит предупреждение «Проект находится в разработке. Он может не подходить для стабильного использования в продакшене». Фиксируйте версии и тестируйте обновление, прежде чем раскатывать его.
Отпечатки — движущаяся цель
Проект открыто признаёт, что вендоры антибот-систем «снова и снова тестируют Camoufox, чтобы найти хотя бы одно уникальное несоответствие», а затем добавляют проверку на него. «Очеловеченный» курсор «всё же может быть обнаружен достаточно изощрённым анализом». Подмена на уровне C++ убирает целую категорию признаков, но не делает вас необнаружимым навсегда.
Ресурсы
Проект утверждает, что его облегчённая сборка занимает около 200 МБ и потребляет меньше памяти, чем стоковый Firefox. Это цифра проекта, а не наша, и ваши страницы добавят к ней своё. Как ни крути, это полноценный браузер на каждую идентичность. Закладывайте один браузер на одну параллельную сессию, а не много контекстов с общим отпечатком, а для эндпоинтов, которым не нужен JavaScript, используйте обычные HTTP-клиенты.
Чего Camoufox не решает
- Репутация IP. Помеченный резидентный IP останется помеченным. Проверяйте выходные IP перед использованием, например нашим бесплатным прокси-чекером.
- Лимиты запросов и поведение. Сотни одинаковых переходов в минуту выглядят автоматизированными при любом отпечатке.
- CAPTCHA, логины и правила доступа. Camoufox не даёт вам права что-либо собирать. Соблюдайте robots.txt и условия сайта, не трогайте данные за аутентификацией, на которые у вас нет прав, и считайте персональные данные подпадающими под GDPR/CCPA, даже если они публично видны.
Разумный порядок внедрения
Начните с одной страны и одной sticky-сессии. Логируйте результат проверки согласованности при каждом запуске и, прежде чем остановиться на одном движке, сравните долю блокировок с базовой линией на Patchright на том же целевом сайте. Если Camoufox выигрывает, масштабируйтесь, добавляя браузеры с новыми ID сессий, а не деля один браузер между сессиями. Если он проигрывает на сайте, который явно предпочитает Chrome, таблица выше подскажет, куда двигаться дальше. Резидентный шлюз работает одинаково со всеми тремя инструментами. Коды стран и варианты тарифов — на страницах локаций и резидентных прокси.






