Camoufox с резидентными прокси: практическое руководство на Python

Как запустить Camoufox — Firefox с патчами на C++ — за резидентными прокси: актуальный Python API, почему geoip нужна sticky-сессия, чек-лист согласованности отпечатка и когда лучше подойдут Patchright или nodriver.

Camoufox with Residential Proxies: A Code-First Python Guide
В этой статье

Чтобы запустить 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=True Camoufox при запуске ещё и отправляет через этот прокси один запрос, чтобы узнать выходной IP.
  • geoip: True — определить выходной IP автоматически, либо строка с конкретным IP. По этому IP Camoufox выставляет широту/долготу, часовой пояс, страну, локаль и IP для WebRTC. Параметр geoip_db выбирает базу. 30 сентября 2026 года в ветке main базой по умолчанию стала «GeoIP AIO», а GeoLite2 объявлена устаревшей, так что проверьте, какую использует ваша установленная версия.
  • locale: явная локаль вроде "en-US", код страны вроде "US" (тогда Camoufox выбирает язык по распределению носителей в этой стране) или список. Первый элемент определяет поведение Intl API.
  • 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=True sticky-сессия обязательна. Определение IP происходит один раз, при запуске браузера: функция Camoufox public_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 берёт на себя; большинство сбоев возникает из-за настроек, которые вы переопределяете вручную. Проверьте это перед масштабированием:

  1. Страна выходного IP ↔ часовой пояс. Проверяйте и Intl.DateTimeFormat().resolvedOptions().timeZone, и Date.getTimezoneOffset(). Скрипты обнаружения сравнивают часовой пояс по геолокации IP с часовым поясом браузера, и несовпадение — один из старейших признаков прокси. С geoip=True на sticky-сессии они совпадают по построению.
  2. Страна выходного IP ↔ язык. navigator.language, navigator.languages и заголовок Accept-Language должны соответствовать стране. Заголовок и navigator Camoufox синхронизирует сам. Если передаёте locale=, указывайте полную локаль с регионом ("de-DE", а не "de"): проект предупреждает, что недостающий регион будет сгенерирован автоматически, а это «может вызвать подозрения, если ваш IP не совпадает с регионом локали».
  3. WebRTC ↔ выходной IP. WebRTC может раскрыть ваш реальный локальный или публичный адрес в обход прокси. С включённым geoip Camoufox подменяет IPv4 в WebRTC на уровне протокола на выходной IP и отключает IPv6 DNS. Оставьте WebRTC включённым и подменённым, а не заблокированным: десктопный Firefox совсем без WebRTC — редкость.
  4. Geolocation API ↔ IP. Camoufox заполняет широту и долготу по результату GeoIP и выставляет нужную настройку разрешений, так что navigator.permissions.query({name: "geolocation"}) стабильно сообщает «granted» в соответствии с отдаваемой позицией. Не задавайте геолокацию в config вручную. Библиотека предупреждает, что это «может привести к обнаружению, если целевая геолокация не совпадает с вашим IP».
  5. ОС ↔ шрифты ↔ GPU. Генератор опирается на статистическую модель реального трафика, а проверка согласованности отбрасывает невозможные сочетания вроде User-Agent под Windows с GPU Apple M1. Избегайте custom_fonts_only=True и передавайте в webgl_config только те пары, которые модель встречала на этой ОС (иначе будет ValueError).
  6. User-Agent: не трогайте. Ручная установка User-Agent или полей navigator — самый быстрый способ добиться расхождения между сетью и JavaScript. Библиотека предостерегает от обоих.
  7. Тип IP ↔ заявленное устройство. Сгенерированный потребительский десктоп на ASN хостинг-провайдера — несогласованная пара, каким бы хорошим ни был отпечаток. Именно здесь резидентные (или ISP) IP оправдывают свою цену. Как эти сигналы объединяются на стороне сервера, рассказано в нашем разборе браузерного фингерпринтинга.
  8. Одна идентичность на сессию. Cookies, IP и отпечаток должны меняться вместе или не меняться вовсе. Вернувшийся cookie на новом IP с новым GPU похож на человека меньше, чем стабильная сессия или чистая новая.

Camoufox, Patchright или nodriver: что выбрать

Выбирайте прежде всего по движку. Если целевой сайт видит в основном трафик Chrome или проверяет поведение V8, берите инструмент на Chromium. Если нужна глубокая ротация отпечатков без написания JavaScript-патчей и трафик Firefox допустим, берите Camoufox. В таблице сведены компромиссы по состоянию на октябрь 2026 года.

CamoufoxPatchrightnodriver
ДвижокПропатченный Firefox (Gecko + SpiderMonkey)Chromium / Chrome (браузер без патчей)Установленный у вас Chrome, Chromium, Edge или Brave
Протокол управленияJuggler (пропатчен, изолирован от страницы)CDP, Runtime.enable обходится через изолированные мирыНапрямую CDP, без WebDriver
APIPlaywright (Python, JS/TS)Полная замена Playwright (Python, Node, .NET от сообщества)Собственный асинхронный Python API
Источник TLS-отпечаткаСобственный стек NSS в Firefox, то есть ClientHello от FirefoxBoringSSL настоящего 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, таблица выше подскажет, куда двигаться дальше. Резидентный шлюз работает одинаково со всеми тремя инструментами. Коды стран и варианты тарифов — на страницах локаций и резидентных прокси.

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

Как подключить прокси к Camoufox?

Передайте в Camoufox() или AsyncCamoufox() словарь в формате Playwright: proxy={'server': 'http://host:port', 'username': '...', 'password': '...'}. Добавьте geoip=True (нужен pip install "camoufox[geoip]"), чтобы часовой пояс, локаль, геолокация и IP для WebRTC брались из выходного IP прокси.

Зачем Camoufox нужен geoip=True при работе через прокси?

Без него часовой пояс, язык и геолокация браузера остаются значениями по умолчанию, а не соответствуют выходному IP, и расхождение между местоположением IP и часовым поясом браузера — классический признак прокси. Camoufox даже выводит предупреждение, если прокси используется без geoip. Определение IP выполняется через прокси один раз при запуске, поэтому сочетайте его со sticky-сессией.

Поддерживается ли Camoufox в 2026 году?

Да, но с перерывом. С марта 2025 по январь 2026 года стабильных релизов не было; с тех пор, когда официальным мейнтейнером стала Clover Labs, вышли сборки на Firefox 150 и 152, официальный npm-лаунчер и к концу сентября 2026 года пререлизы на Firefox 156. В README проект по-прежнему помечен как находящийся в разработке.

Camoufox или Patchright: что менее заметно?

Универсального ответа нет. Patchright запускает настоящий Chrome и не допускает утечек через CDP, поэтому растворяется в доминирующей массе Chrome и проходит проверки движка, которые Firefox пройти не может. Camoufox ротирует полные отпечатки на уровне C++ без JavaScript-патчей, но всегда выглядит как Firefox — около 6% десктопного трафика. Тестируйте оба на своём целевом сайте.

Можно ли запускать Camoufox в headless-режиме на Linux-сервере?

Да. headless=True включает headless-режим Firefox, который Camoufox патчит так, чтобы он выглядел как обычное окно, а headless="virtual" запускает браузер в обычном режиме внутри виртуального дисплея Xvfb. Вариант virtual работает только на Linux и требует пакета xvfb; документация рекомендует его, потому что headless-режим может стать обнаруживаемым.

Готовы начать?

Резидентные, ISP и мобильные прокси в 195+ странах. Создайте бесплатный аккаунт.

Создать бесплатный аккаунт
← Вернуться в Блог