Бот в PPPoker: четыре слоя детекции
Бота в PPPoker ловят не одним способом, а четырьмя слоями сигналов: от дешёвого в обходе к дорогому. Ниже модель, по которой работают платформа и крупные клубы, отдельно от баек, которые ходят по форумам. Страница обновлена 6 октября 2026.
Вопрос «поймёт ли платформа, что конкретный игрок бот» зависит от того, сходятся ли в вердикте четыре стороны, которые смотрят на игрока (устройство, стол, аналитика клуба и живой человек), и достаточно ли дёшева ошибка, чтобы действовать.
Это наша реконструкция, а не документация PPPoker: платформа не публикует ни пороги, ни веса сигналов. Там, где мы экстраполируем, а не знаем, мы так и пишем.
Слой 1. Отпечаток устройства
Клиент PPPoker — нативное приложение для Android и iOS, плюс десктопная оболочка. При установке и на старте каждой сессии он отдаёт отпечаток: модель устройства, версия ОС, разрешение экрана, строка GPU, признак root или jailbreak, флаг ADB/USB-отладки, список установленных клавиатур и устойчивый ID устройства, захешированный в собственном пространстве идентификаторов платформы.
На этом слое попадаются эмуляторы со стандартным отпечатком (BlueStacks, LDPlayer, MEmu «из коробки»), средства автоматизации, которые цепляются к процессу клиента, и мультиаккаунты с одного физического устройства.
Живой Android-телефон с настоящей сессией и валидным ID этот слой не ловит. Серьёзные операторы держат фермы телефонов (стойки реальных аппаратов, у каждого свой IMEI и свой ID на платформе). Слой 1 не отличает их от телефона игрока.
# сигналы на старте сессии (иллюстрация; имена полей изменены)
{
"dev_model": "SM-G991B",
"dev_os": "android-12",
"dev_id": "<sha256(platform-secret + hw-fingerprint)>",
"dev_root": false,
"dev_emu": false,
"input_methods": ["com.google.android.inputmethod.latin"],
"gpu": "Mali-G78 MP14"
}
Слой 2. Тайминги действий
Клиент передаёт тайминги каждого действия с точностью до миллисекунд: время от раздачи до первого касания, распределение времени на решение, траектория и длина движения ползунка при выборе размера ставки, кинематика тапа по «чеку» (одним пальцем или несколькими, какая площадь касания), жесты в простое, переходы приложения между передним планом и фоном.
Цель детекции здесь не «слишком быстро». Задержку бот может подмешивать любую, и грамотный оператор это делает. Смотрят на форму: совместное распределение (сложность решения × затраченное время × уверенность действия) у детерминированной политики не похоже на человеческое.
Человек, которому на ривере по мокрому борду сделали 3-бет, думает долго, а потом ставит либо мало, либо с полным коммитом. Бот с джиттером, подогнанным по маргиналам, думает разное время, но размер ставки берёт из непрерывного распределения. Гистограммы времени на раздумье у обоих проходят тест хи-квадрат против человеческого прайора, а совместный тест с контекстом решения проходит только один.
Здесь же работает площадь касания. Настоящий палец на кнопке в 320 пикселей оставляет другую траекторию пятна контакта, чем синтетическое событие, посланное через API специальных возможностей. Разница лежит в шумовом полу пятна контакта, и клиент замеряет его на старте сессии, чтобы получить базовую линию.
Слой 3. Граф оппонентов
После 2024 года именно этот слой изменил детекцию. PPPoker ведёт для каждого игрока историю встреченных оппонентов в виде графа: игрок это узел, вес ребра хранит число сыгранных вместе рук и чистый обмен фишками. По этому графу платформа считает оценки сговора и пар «бот и бот».
Синтетический игрок на длинной дистанции набирает рёбра только с теми, кто играет в клубах, где оператор запускает бота. Такой граф оппонентов трудно изменить. У живого игрока длинный хвост рёбер с людьми из других клубов: зашёл за другом, сыграл фриролл, сел гостем в игру юниона. «Тонкость хвоста распределения оппонентов» — статистический сигнал, который считается дёшево.
Граф показывает и кольца. Если N подозрительных аккаунтов сидели за одними столами заметно чаще, чем предсказывает модель ликвидности юниона, это детекция без анализа поведения отдельных аккаунтов. Этот слой ловит фермы телефонов, чьи аккаунты на слоях 1 и 2 неотличимы от обычных.
# концепт: оценка по графу оппонентов
def graph_score(player, window=90_days):
edges = opponent_edges(player, window)
tail_thinness = 1 - shannon_entropy(edges) / log(len(edges) + 1)
circle_density = max_clique_density(edges, threshold=0.05)
return alpha * tail_thinness + beta * circle_density
Слой 4. Ручная проверка
Это единственный слой, чьё решение окончательное. Флагнутые сессии смотрит человек: сотрудник службы доверия платформы или, чаще, сотрудник клуба, который работает с выгрузкой истории рук и выносит суждение.
Перед человеком сессия оказывается по одному из трёх сигналов:
- оценка аномалии по слою 2 выше порога, выставленного для лимита стола;
- оценка по графу (слой 3) попала в верхний дециль распределения клуба;
- жалоба от контрагента: другого игрока или агента, который отметил аккаунт.
Ручная проверка не детерминирована. Мы видели аккаунты с сильными сигналами по слоям 2 и 3, которые проверку пережили, потому что проверяющий сидел на стороне оператора. Видели и аккаунты со слабыми сигналами, которые забанили, потому что старший агент вынес случай на уровень спора внутри юниона. Детерминированный слой 4 за квартал превратил бы обход в обычный товар.
Что из этой модели следует
- Одиночные любительские боты попадаются на слое 1 или 2 и редко доходят до эскалации.
- Боты на фермах телефонов слой 1 проходят чисто, но за недели накапливают сигнатуру в графе слоя 3. Это то окно, за которое оператору нужно либо агрессивно ротировать места, либо прятать их в обычной игре дружественного клуба.
- Боты-ликвидность, которые работают с разрешения владельца внутри одного клуба, в принципе обнаружимы, но на практике невидимы: проверяющий, которого назначил этот клуб, и есть владелец. Для них значима только проверка со стороны юниона, где работает слой 3.
- Обход одного слоя меняет стоимость обхода следующего.
Ветки на Reddit о детекции ботов не случайно превращаются в споры про выплаты. Почему эти две темы так часто путают, разобрано в статье про Reddit и ботов в PPPoker (на английском).
Если это ваша неделя
Если вы держите клуб и вопрос «насколько мы уязвимы» возвращается снова и снова, с людьми, которые строили и проверяли детекцию со стороны оператора, можно связаться напрямую. Первый разговор закрытый и бесплатный. Прайс-листа у нас нет, потому что одна и та же работа не повторяется дважды.