iOS-эмуляция: как отзыв реально уходит «как с iPhone», а не с браузерного мока

Подменил User-Agent на «iPhone» — и думаешь, отзыв ушёл с айфона? Нет. Ушёл робот в маске айфона, и антифрод это видит на первом же рукопожатии.

Отзыв «с айфона» на Wildberries — это не строка UA в браузере. Это запрос, который повторяет весь сетевой профиль нативного приложения WB на iOS: реальный UA с версией Alamofire, 32-символьный Device ID, корректные размеры экрана конкретной модели и решённый proof-of-work X-Pow, который на iOS в десятки раз жёстче, чем на Android. Toptaker шлёт отзывы именно так — не через headless-браузер с мок-объектом navigator, а через воспроизведённый iOS-стек. Ниже — как это устроено под капотом и почему мок палится.

Меня зовут Дмитрий Борздов, 5 лет на WB, до этого дропил на eBay из Вьетнама. Самовыкупы и отзывы — серая зона, и я не продаю «100% безопасно». Но если уж эмулировать iPhone — то по-настоящему, а не наполовину.

Разберём по слоям.

Почему браузерный мок палится первым

Самый частый способ «сделать вид, что это iPhone» — взять Puppeteer/Playwright, подменить navigator.userAgent и screen через Object.defineProperty, и дёрнуть API WB. Это работает ровно до первого нормального антифрода.

То есть нисколько.

Мок течёт на каждом слое:

  • TLS-fingerprint (отпечаток рукопожатия TLS — порядок шифров, расширения, ALPN). У Node.js/Chromium он свой, у нативного iOS — свой. JA3/JA4-хэш не совпадёт с тем, что реально шлёт iPhone, как бы ты ни крутил заголовки.
  • Порядок и регистр HTTP-заголовков. Alamofire (HTTP-клиент в iOS-приложении WB) выставляет заголовки в своём порядке и со своими именами. Браузер — в своём. Это видно без расшифровки тела.
  • JS-окружение. Если ты гонишь через headless Chrome, остаётся куча артефактов: window.chrome, особенности WebGL, тайминги. Нативное приложение их в принципе не имеет.

Антифрод WB ловит расхождения примерно по 200+ параметрам и срабатывает в районе 98% случаев на грубой накрутке. А браузерный мок — это и есть грубо. Он отдаёт UA «iPhone», а рукопожатие кричит «Chrome на Linux». Это как прийти на паспортный контроль в чужом гриме, но со своими отпечатками пальцев.

У многих сервисов под капотом именно это: Node fetch или Selenium с подменёнными строками. Палится. У нас — воспроизведение транспорта на уровне TLS-пресета и клиента, повторяющего okhttp/Alamofire, без браузера в цепочке вообще.

Что именно мы эмулируем на уровне iOS

Эмуляция iPhone — это не один UA, а согласованный набор сущностей, где каждая должна биться с остальными.

Модель устройства. Около 30 моделей в пуле: от iPhone 11 до 17 Pro Max плюс iPhone Air. Для каждой — реальный внутренний идентификатор и физический размер экрана. Пример: iPhone15,2 отдаёт 1179×2556. Нельзя взять идентификатор от одной модели и разрешение от другой — это рассинхрон, который видно.

iOS Device ID. 32 hex-символа в верхнем регистре (uppercase). Не UUID с дефисами, не строчные буквы — именно тот формат, который генерит iOS-приложение WB. Один Device ID живёт с одной личностью-устройством, не прыгает между отзывами.

User-Agent. Реальная строка нативного клиента, вида:

Wildberries/7.5.5001 (com.wildberries.ru; build:..; iOS 16.7.14) Alamofire/5.9.1

Здесь важно всё: версия приложения, bundle id, версия iOS, версия Alamofire. Браузер такую не отдаст никогда — у него нет Alamofire/5.9.1 в природе.

X-Pow. Это заголовок с proof-of-work (доказательство выполненной работы — клиент должен решить вычислительную задачу, прежде чем сервер примет запрос). На iOS задача жёстче, чем на Android — по нашим замерам примерно в 68 раз. Нельзя «прикинуться айфоном» и решать лёгкий андроид-вариант: WB ждёт от iOS-клиента тяжёлый X-Pow, и отсутствие/несоответствие — мгновенный флаг.

Подробнее про всю имитацию мобильного приложения, а не только iOS-слой, — в разборе имитации мобильного приложения WB.

Чем это отличается от «эмуляции» у других

Коротко, по слоям, чтобы было предметно:

Слой Браузерный мок iOS-стек Toptaker
Транспорт Node fetch / Chromium TLS TLS-пресет под нативный клиент (okhttp/Alamofire-профиль)
User-Agent подменённая строка navigator реальный Wildberries/7.x … Alamofire/5.9.1
Device ID случайный UUID 32-hex uppercase в формате iOS
Экран подмена screen.width реальный размер модели (iPhone15,2 = 1179×2556)
X-Pow нет / андроид-вариант iOS-вариант, ~×68 по сложности

Суть отстройки простая: совпадать должны не заголовки, а весь профиль. Если у тебя UA от iOS, а рукопожатие от Chrome и разрешение «1920×1080» — это не iPhone, это робот в маске iPhone.

Зачем вообще заморачиваться именно с iOS

Доля iOS-трафика на WB высокая, и отзыв, пришедший «с айфона», в общей массе органики выглядит естественнее, чем десятый подряд отзыв с одинакового андроид-веб-клиента. Цель — чтобы профиль отзыва не выделялся из реального хвоста пользователей.

Это не «гарантия». Антифрод не статичен, и накрутка отзывов остаётся серой зоной. Снизить риск можно, обнулить — нет. При спалившейся накрутке WB может снять СПП (скидку постоянного покупателя) на 30 дней по всему ассортименту продавца — бьёт не по одной карточке, а по всему кабинету. Поэтому мы говорим «до 95%», а не «100%»: воспроизведение iOS-стека снимает самый дешёвый класс детекта (расхождение слоёв), но не отменяет здравый смысл по объёмам и темпу.

Если нужны отзывы не просто «с айфона», а от живых профилей с историей — это уже отзывы от 140-персон, там личность не сводится к одному Device ID.

Как это работает на стороне пользователя

С твоей стороны — кнопка.

Выбираешь товар, текст отзыва, рейтинг — и Toptaker сам подбирает модель устройства из пула, генерит согласованный Device ID, собирает корректный UA, поднимает нужный TLS-профиль и решает X-Pow за тебя. Никакого ручного редактирования заголовков и никакого браузера, который надо прятать.

Инструмент, а не агентство: нажал — сделалось. Под капотом — то, что описано выше.

FAQ

Можно ли отправить отзыв на WB «как с айфона» простой подменой User-Agent? Нет. UA — это одна строка, а WB сверяет TLS-fingerprint, порядок заголовков, Device ID, размер экрана и X-Pow. Подмена только UA даёт рассинхрон, который антифрод видит сразу.

Что такое X-Pow и почему на iOS он жёстче? X-Pow — заголовок с proof-of-work: клиент решает вычислительную задачу перед отправкой запроса. На iOS-клиенте WB сложность примерно в 68 раз выше, чем на Android, поэтому «лёгкое» андроид-решение для iOS-профиля не пройдёт.

Чем iOS-эмуляция Toptaker отличается от headless-браузера? Браузер тащит TLS и JS-артефакты Chromium и не имеет нативных заголовков Alamofire. Мы воспроизводим транспорт на уровне нативного клиента без браузера в цепочке, поэтому профиль совпадает целиком, а не только по UA.

Это безопасно на 100%? Нет. Накрутка отзывов — серая зона. Воспроизведение iOS-стека снижает риск детекта по расхождению слоёв, но риск остаётся: при спалившейся накрутке WB снимает СПП на 30 дней по всему ассортименту. Реалистичная оценка — до 95%, не гарантия.

Сколько моделей iPhone в пуле? Около 30 — от iPhone 11 до 17 Pro Max плюс iPhone Air, каждая с реальным внутренним идентификатором и физическим разрешением экрана (например, iPhone15,2 = 1179×2556).


Если хочешь, чтобы отзыв уходил с профилем настоящего айфона, а не робота в маске айфона, — попробуй на одном товаре и посмотри сам.

Маска — это UA. iPhone — это весь стек.

Хотите так же — но без ручной возни?

Toptaker делает выкупы и отзывы автоматически: SRID, чеки и скриншоты по каждому действию. 5 выкупов бесплатно при регистрации.