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 до запуска браузера

Порядок такой, и он именно «сначала узнать, потом запустить»:

  1. Поднимаем прокси через undici ProxyAgent. undici — HTTP-клиент Node.js; ProxyAgent гонит запросы через тот же прокси, на котором будет сидеть браузер. Разведку IP мы делаем тем же каналом, а не с сервера напрямую.
  2. Узнаём exit-IP через ip-api.com. Получаем фактический выходной IP прокси и привязанные к нему lat/lon/timezone. Не «город, который мы купили», а то, что реально видит интернет.
  3. Прошиваем geo в браузер ДО старта. timezoneId и geolocation (координаты) ставятся в конфиг профиля до первого кадра. Никаких «поправим после загрузки» — к моменту, когда первый скрипт WB сработает, всё уже согласовано.
  4. Запускаем Chromium с --webrtc-ip-handling-policy=disable_non_proxied_udp. Этот флаг запрещает WebRTC слать UDP мимо прокси — отрубается главный канал утечки, но сам WebRTC остаётся живым.
  5. Инжектим 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 выкупов бесплатно при регистрации.