WebRTC и proxy-geo: как мы делаем выкуп «из нужного региона» так, что браузер не выдаёт реальный IP
Ты посадил браузер на краснодарский прокси, а он всё равно орёт антифроду: «я из Москвы». Тихо, по UDP, у тебя за спиной.
Чтобы самовыкуп выглядел как заказ из нужного региона, мало посадить браузер на прокси этого города. WebRTC (технология p2p-связи внутри браузера) умеет вытащить твой настоящий IP в обход прокси и показать его сайту через ICE-кандидаты — и антифрод видит, что «москвич» на самом деле сидит в Краснодаре. Мы закрываем эту дыру: берём exit-IP прокси, прогоняем через ip-api.com, ставим в браузер согласованные таймзону и геолокацию ещё до его запуска, а WebRTC жёстко маскируем флагом --webrtc-ip-handling-policy=disable_non_proxied_udp плюс JS-инжектом, который подменяет ICE-кандидаты на exit-IP.
Почему прокси на нужный город — это половина дела
Ты ставишь профиль на резидентский прокси Краснодара. IP браузера — краснодарский. Карточка региона на WB подтянется правильно.
Казалось бы, всё.
Но антифрод WB по нашим прикидкам отбраковывает до 98% накруток по 200+ параметрам, и геосогласованность — один из самых дешёвых для него сигналов. Поймал расхождение — страдает не один выкуп: за накрутку прилетает снятие СПП (скидка постоянного покупателя) на 30 дней по всему ассортименту, не по одному артикулу.
Дыр для рассинхрона тут две. Про вторую почти никто не думает.
Первая — таймзона и язык. Прокси краснодарский, а Intl и navigator в браузере отдают московское время системы и en-US. Чиним просто: подставляем timezoneId и geolocation из данных по exit-IP.
Вторая — WebRTC. И вот она серьёзнее.
Как WebRTC сливает реальный IP в обход прокси
WebRTC для установления p2p-соединения собирает ICE-кандидаты (список адресов, по которым до тебя можно достучаться). Для надёжности он добавляет туда не только адрес за прокси, но и реальный локальный/внешний IP через STUN-запросы по UDP. А эти запросы ходят мимо HTTP-прокси.
Итог: HTTP-трафик идёт через Краснодар, а скрипт на странице через RTCPeerConnection спокойно читает твой настоящий московский IP. Для антифрода это флаг «человек прячется» — ровно противоположное тому, чего ты хотел.
Так палится типовой «антидетект из коробки», где geo накрутили, а WebRTC оставили на «default» или просто выключили целиком. Полностью выключенный WebRTC — тоже аномалия: у живого Chrome он есть всегда.
Как мы это закрываем: pipeline до запуска браузера
Порядок такой, и он именно «сначала узнать, потом запустить»:
- Поднимаем прокси через undici ProxyAgent. undici — HTTP-клиент Node.js; ProxyAgent гонит запросы через тот же прокси, на котором будет сидеть браузер. Разведку IP мы делаем тем же каналом, а не с сервера напрямую.
- Узнаём exit-IP через ip-api.com. Получаем фактический выходной IP прокси и привязанные к нему
lat/lon/timezone. Не «город, который мы купили», а то, что реально видит интернет. - Прошиваем geo в браузер ДО старта.
timezoneIdиgeolocation(координаты) ставятся в конфиг профиля до первого кадра. Никаких «поправим после загрузки» — к моменту, когда первый скрипт WB сработает, всё уже согласовано. - Запускаем Chromium с
--webrtc-ip-handling-policy=disable_non_proxied_udp. Этот флаг запрещает WebRTC слать UDP мимо прокси — отрубается главный канал утечки, но сам WebRTC остаётся живым. - Инжектим JS-маскировку ICE. Поверх флага подменяем ICE-кандидаты на exit-IP. На выходе
RTCPeerConnectionотдаёт краснодарский адрес — тот же, что и HTTP-слой.
Замкнутая картина: IP, таймзона, координаты и WebRTC указывают на один город. Антифроду не за что зацепиться по гео.
Чем это отличается от «просто прокси + антидетект»
- У типового решения: geo подменили, WebRTC на default → реальный IP утёк через ICE. Либо WebRTC выключен целиком → подозрительная аномалия.
- У нас: exit-IP считается тем же каналом, что и трафик; geo прошито до старта; WebRTC живой, но его ICE-кандидаты переписаны под exit-IP.
- У типового решения: таймзона и язык остаются системными → рассинхрон с IP.
- У нас:
timezoneIdберётся из ответа ip-api по фактическому exit-IP.
А отпечаток браузера? Один профиль — один стабильный fingerprint
IP — это про «откуда». Fingerprint (цифровой отпечаток браузера) — про «кто». Если каждый запуск профиля рисует новый отпечаток, антифрод видит, что за одним аккаунтом дёргается то одно устройство, то другое. Тоже сигнал.
Мы делаем отпечаток persistent — постоянным для профиля. Canvas, WebGL и Audio (три классических вектора отпечатка) генерируются через seeded Mulberry32 — быстрый ГПСЧ (генератор псевдослучайных чисел) с фиксированным seed, привязанным к профилю. Один seed → один и тот же отпечаток при каждом запуске. Аккаунт ведёт себя как одно стабильное устройство, а не как зоопарк.
GPU при этом не из головы: пул из 11 реальных моделей видеокарт. WebGL отдаёт строку существующего железа, а не выдуманную — выдуманная палится по несуществующей сигнатуре.
Та же логика, что в имитации мобильного приложения WB: не «спрятаться», а выглядеть обычным живым устройством из нужной точки.
Это даёт «100% безопасно»?
Нет. Самовыкупы — серая зона, и любой, кто обещает гарантию, врёт. Антифрод WB меняется, и любой статичный обход однажды устаревает.
Что честно: согласованная гео-картина — IP, таймзона, координаты, WebRTC из одного города плюс стабильный отпечаток — убирает самые дешёвые поводы для отбраковки. По нашим данным аккуратная схема держит проходимость до 95%. «До 95%», а не «гарантия» — разница принципиальная.
Хочешь посмотреть, как самовыкупы по регионам работают на твоих артикулах — заведи тестовый прогон и сверь карточку до и после.
Прокси красит дом снаружи. WebRTC — это незакрытая дверь со двора.
FAQ
Что значит «самовыкуп из нужного региона»? Заказ оформляется так, будто его делает покупатель из конкретного города: IP прокси, таймзона, координаты и WebRTC-адрес указывают на этот регион. Нужно, чтобы карточка ранжировалась по гео и чтобы антифрод не видел рассинхрона.
Почему нельзя просто включить прокси? WebRTC через ICE-кандидаты вытаскивает реальный IP в обход HTTP-прокси по UDP. Только прокси — это утечка настоящего адреса и флаг для антифрода.
Зачем выключать WebRTC флагом, а не целиком?
Полностью отключённый WebRTC — сам по себе аномалия: у живого Chrome он работает. disable_non_proxied_udp рубит канал утечки, оставляя WebRTC живым, а JS-инжект переписывает ICE-кандидаты под exit-IP.
Что делает persistent fingerprint? Держит отпечаток браузера (Canvas/WebGL/Audio) постоянным для профиля через seeded Mulberry32. Аккаунт выглядит одним стабильным устройством, а не новым при каждом запуске.
Это безопасно на 100%? Нет. Самовыкупы — серая зона. Согласованное гео и стабильный отпечаток дают проходимость до 95%, но гарантий не даёт никто, и за накрутку WB снимает СПП на 30 дней по всему ассортименту.
Хотите так же — но без ручной возни?
Toptaker делает выкупы и отзывы автоматически: SRID, чеки и скриншоты по каждому действию. 5 выкупов бесплатно при регистрации.