Как мы имитируем мобильное приложение Wildberries на сетевом уровне (и почему выкуп руками палится)

Сервер WB понимает, что ты бот, ещё до того, как ты положил первый товар в корзину. На рукопожатии. По одному отпечатку.

Безопасные самовыкупы держатся не на смене IP и не на дропе симок, а на том, насколько твой запрос неотличим от настоящего приложения Wildberries. Toptaker подделывает TLS-отпечаток мобильного клиента (через node-tls-client с пресетами okhttp4_android_13 и safari_ios_16_0), решает X-Pow Proof-of-Work на каждом запросе и шлёт batch-аналитику на a.wb.ru — ровно как живой телефон. Конкуренты ходят к WB голым Node fetch, и хендшейк выдаёт их ещё до первого товара в корзине.

Почему антифрод WB ловит выкуп раньше, чем ты успел нажать «оплатить»

WB прогоняет каждую сессию через антифрод. Тот смотрит на 200+ параметров и отсеивает примерно 98% накруток.

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

Самый ранний фильтр — это TLS-fingerprint. Отпечаток рукопожатия, по которому сервер ещё до загрузки страницы понимает, какой клиент к нему пришёл. Настоящий телефон с Android открывает соединение через библиотеку okhttp: определённый порядок шифров, набор расширений, версия протокола. Chrome на десктопе делает это иначе. Node.js — иначе. И сервер WB это видит мгновенно.

А цена ошибки несимметричная. За накрутку WB снимает СПП (скидку постоянного покупателя) на 30 дней — и не по одной карточке, а по всему ассортименту продавца. Один спалившийся выкуп бьёт по всему магазину.

Подробнее про то, как именно вычисляют, — в разборе как WB вычисляет самовыкупы.

Что такое TLS-fingerprint и почему Node fetch палится сразу

TLS-handshake — это первое, чем обмениваются клиент и сервер, ещё до запроса данных. В нём зашит «почерк» клиента: список cipher suites, порядок TLS-расширений, поддерживаемые кривые. По этому почерку строят отпечаток — его называют JA3/JA4.

У настоящего приложения WB на Android отпечаток okhttp. У iPhone — отпечаток Safari/iOS. А у скрипта на голом Node fetch — отпечаток Node, которого нет ни у одного живого покупателя на маркетплейсе.

Это всё равно что прийти на выкуп в бейдже «я бот».

Toptaker гоняет запросы через node-tls-client с готовыми пресетами:

  • okhttp4_android_13 — имитация Android-клиента;
  • safari_ios_16_0 — имитация iPhone.

Отпечаток совпадает с реальным телефоном байт в байт. Сервер WB на этапе рукопожатия не находит, за что зацепиться. Глубже эту механику я разобрал отдельно — TLS-fingerprint и WB.

Сравнение простое:

  • У конкурентов: Node fetch → отпечаток Node → аномалия на первом же соединении.
  • У нас: пресет okhttp/Safari → отпечаток живого приложения → соединение не отличить от телефона.

Что такое X-Pow и зачем считать Proof-of-Work на каждый запрос

X-Pow — это заголовок с Proof-of-Work. Доказательством работы: клиент обязан решить вычислительную задачку-challenge, прежде чем сервер примет запрос. WB отдаёт challenge через card.wb.ru, клиент считает scrypt-хеш и прикладывает решение к запросу. Нет валидного X-Pow — запрос не проходит.

Смысл со стороны WB: ботам должно быть дорого. Если на каждый запрос надо жечь процессор, массовая накрутка перестаёт окупаться.

Две детали, которые мало кто реализует правильно:

  1. Считать надо на каждый запрос, а не один раз за сессию. Решил один раз и переиспользуешь — палево.
  2. iOS жёстче Android в 68 раз. Сложность challenge на iOS-профиле кратно выше. Эмулируешь iPhone, но считаешь Pow по «лёгкому» сценарию — несоответствие профиля и нагрузки само по себе аномалия.

Toptaker считает scrypt-Pow под каждый запрос и под конкретный профиль: лёгкий для Android, тяжёлый для iOS. Сходится и отпечаток, и стоимость работы.

Зачем слать batch-аналитику, если можно просто оформить заказ

Живое приложение постоянно болтает с сервером: открыл карточку, поскроллил, положил в корзину, оплатил. Эти события улетают пачками (batch) на аналитический эндпоинт.

А бот, который сразу дёргает «оформить заказ» без единого аналитического события, выглядит противоестественно. Покупатель есть, а поведения нет. Призрак с картой.

Toptaker отправляет batch analytics events на a.wb.ru/m/batch с правильными API-ключами и app_version=7.5.5001 — будто события идут из конкретной версии приложения. Плюс ведётся journal logging (журналирование запросов): можно поднять, что и в какой момент уходило, и сверить с поведением реального клиента.

Сравнение:

  • У конкурентов: заказ без телеметрии → «покупатель-призрак».
  • У нас: полный поток событий с валидным app_version → поведенческий слой совпадает с приложением.

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

Кажется, что руками с реального телефона безопаснее. На практике ручной выкуп проваливается по другим осям: те же карта, IP, район, аккаунт, тайминги, повторяющийся сценарий «зашёл-купил-ушёл».

Человек не масштабируется. И не держит в голове те 200+ параметров, по которым работает антифрод. Сетевой слой у телефона хоть и настоящий, но связка «кто-откуда-чем-как-часто» легко превращается в шаблон.

Технология выигрывает не потому, что «умнее человека», а потому что держит под контролем десятки сигналов разом и не повторяется.

Поэтому я честно говорю про точность до 95%, а не «гарантия 100%». Самовыкупы — это серая зона, и любой, кто обещает абсолют, тебе врёт. Чем именно мы отличаемся от ручных схем и от других сервисов — собрал в сравнении Toptaker.

FAQ

Что такое безопасные самовыкупы как технология? Это набор приёмов, которые делают запрос неотличимым от настоящего приложения WB: подмена TLS-отпечатка (okhttp/Safari), расчёт X-Pow Proof-of-Work на каждый запрос и отправка batch-аналитики с валидным app_version. Без этого слоя выкуп палится на сетевом уровне.

Почему конкуренты на Node fetch палятся? Node fetch отдаёт TLS-отпечаток Node.js, которого нет ни у одного реального покупателя. Сервер WB видит аномалию ещё на рукопожатии, до загрузки товара.

Что такое X-Pow и почему iOS сложнее? X-Pow — заголовок с доказательством работы: клиент решает scrypt-задачу из challenge (card.wb.ru) на каждый запрос. На iOS-профиле сложность задачи примерно в 68 раз выше, чем на Android, и это надо воспроизводить точно.

Это даёт 100% безопасность? Нет. Антифрод WB работает по 200+ параметрам и отсекает около 98% накруток. Реалистичная планка — до 95%, и то при аккуратной связке аккаунтов, карт, IP и таймингов. За накрутку WB снимает СПП на 30 дней по всему ассортименту.

Чем это лучше выкупа руками? Руками ты не контролируешь сетевой слой и не масштабируешься без шаблонов. Технология держит десятки сигналов одновременно и не повторяет сценарий.

Безопасность тут не магия и не везение — это совпадение отпечатка, нагрузки и поведения. Хочешь посмотреть, как это выглядит из кабинета — загляни, как мы отличаемся. Бот не палится не потому, что прячется, а потому что выглядит как телефон.

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

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