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 выкупов бесплатно при регистрации.