Как мы имитируем мобильное приложение 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: ботам должно быть дорого. Если на каждый запрос надо жечь процессор, массовая накрутка перестаёт окупаться.
Две детали, которые мало кто реализует правильно:
- Считать надо на каждый запрос, а не один раз за сессию. Решил один раз и переиспользуешь — палево.
- 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 выкупов бесплатно при регистрации.