Когда stealth-плагина для Playwright перестаёт хватать
Настоящий конкурент любого платного антидетект-браузера - не другой вендор. Это playwright плюс stealth-патч: бесплатный, открытый и прямо сейчас работающий в проде у множества вполне довольных людей.
Если вы пишете скрипт, который один раз забирает страницу и завершается, берите плагин. Эта статья о том моменте, когда такой ответ перестаёт быть верным, и она старается быть конкретной, потому что «платите лучше нам» - не аргумент.
Что на самом деле делает stealth-плагин
Он выполняет JavaScript в странице раньше вашего скрипта и переписывает свойства, выдающие автоматизацию: navigator.webdriver, отсутствующий массив плагинов, неправильный объект chrome, разрешения, отвечающие слишком честно, строку вендора WebGL со словом SwiftShader.
Это настоящая техника, и она работает. Слабость структурная: патч живёт в том же мире JavaScript, что и детектор. Всё, что вы переписали, что-то другое может осмотреть. Дескрипторы свойств, вывод toString, цепочки прототипов, тайминги, наследование в iframe, контексты воркеров. Каждый релиз браузера меняет поверхность, а каждый релиз детектора щупает угол, который никто не залатал.
Вы оказываетесь в цикле: что-то ломается, вы находите новый признак, латаете, выкатываете. Такой цикл нормален, когда он изредка. Он становится проблемой, когда превращается в дежурство.
Три вещи, которые плагин и не пытался решить
Это важнее гонки вооружений и обсуждается реже.
Личность не сохраняется. Stealth-патчи выдают случайные значения на каждый запуск, а агенту, ведущему аккаунт, нужно ровно обратное. Войти в понедельник и действовать в четверг означает быть одной и той же машиной оба раза: тот же хеш canvas, тот же рендерер WebGL, те же шрифты, тот же аудиостек, тот же часовой пояс. Свежий случайный отпечаток на каждый прогон - это новое устройство, приходящее в старый аккаунт, а именно этот шаблон системы оценки риска и ловят.
Ничто не привязывает прокси к личности. Пустите трафик через резидентный IP во Франкфурте - и браузер по-прежнему сообщит ваш собственный часовой пояс, вашу локаль и путь WebRTC, который не сходится. Это противоречие определяется легче любого свойства, которое залатал плагин. Собрать это правильно можно, но получившееся вам теперь поддерживать.
Passkey негде хранить. Сайты переводят вход без пароля из опции в состояние по умолчанию. Passkey привязан к аутентификатору. Скрипт без аутентификатора не может зарегистрировать ключ и не может им воспользоваться в следующий раз, поэтому оказывается заперт снаружи аккаунта, который сам же и завёл.
Что меняет подход на уровне движка
AntiBrow применяет отпечаток внутри движка браузера, а не патчит из JavaScript в странице. Скрипта-подмены, который мог бы найти детектор, нет, потому что скрипта-подмены не существует.
Вокруг этого лежит то, что честно является просто софтом, который вы иначе написали бы сами: хранилище профилей, переживающее перезапуски, привязка прокси, вытягивающая часовой пояс, локаль и геолокацию из выходного IP автоматически, виртуальный аутентификатор на каждый профиль, сохраняющий и воспроизводящий passkey, и модель одновременных запусков.
Автоматизация не меняется. launch() возвращает стандартные объекты Playwright Page и BrowserContext:
import { AntiDetectBrowser } from 'anti-detect-browser'
const ab = new AntiDetectBrowser({ key: 'your-api-key' })
const { browser, page } = await ab.launch({ profile: 'agent-01' })
await page.goto('https://example.com')
await page.getByRole('button', { name: 'Sign in' }).click()
Все написанные вами селекторы, проверки, перехваты сети и трассировки продолжают работать. Меняется только строка запуска.
Когда оставаться на плагине
- Разовые или короткоживущие скрипты. Личность поддерживать не нужно, защищать нечего.
- Цели, которые не сопротивляются. Если никто не проверяет, вы решаете несуществующую задачу.
- Вы хотите владеть стеком. Некоторые команды искренне предпочитают поддерживать его сами, и это законный выбор, а не ошибка.
Что не меняется в любом случае
Ни один из подходов не заставляет детект исчезнуть. Качество прокси, поведение и история принесённого вами аккаунта решают большую часть исходов. Идеальный отпечаток на сожжённом резидентном IP, кликающий с машинной скоростью, всё равно получит пометку. Кто продаёт вам гарантию, тот вам продаёт.
Выясните дёшево
Бесплатный тариф - это неограниченное число локальных профилей с одним одновременным браузером и без карты, то есть ровно та же цена, что и у вашего нынешнего стека. Направьте профиль туда, где сейчас всё ломается, и посмотрите, выживет ли он.
Попробуйте на бесплатном тарифе.
Неограниченное число локальных профилей, без карты. Проверьте результат детекторами сами.