Как тесты печати выявляют жульничество? Как проверяем мы

Тесты печати выявляют жульничество, проверяя журнал нажатий, стоящий за каждым результатом. Наш тест пересчитывает каждый результат по журналу нажатий, проверяет хеш, анализирует структуру журнала и ритм и не пускает в публичные таблицы любой результат теста на время выше 130 WPM с необычным к тому же ритмом, пока вы не пройдёте повторный тест. Проверки ритма ловят небрежных ботов; повторный тест заставляет аккуратного бота проделать всё заново.

Первым ботом, обошедшим наши проверки ритма, был наш собственный.

Вспомогательная функция в наших сквозных тестах нажимала клавиши с фиксированным интервалом 40 мс, потому что именно так поступает тестовый скрипт. Сервер пересчитал результат, подтвердил хеш и оценил заезд как подозрительный: нулевой разброс между нажатиями, ноль наложений, одинаковое время удержания. Нам пришлось добавить случайный разброс для каждого слова и время от времени паузы «на подумать» от 80 до 300 мс, прежде чем наш собственный набор тестов смог отправить похожий на человеческий результат. Эта опция до сих пор есть в коде под названием humanLike.

Проверки работают против всего, что не старается, а всё, что старается, может их пройти, поэтому основной вес в схеме лежит на повторном тесте.

Шаг первый: пересчитать всё

Ваш браузер не присылает нам WPM. Он присылает журнал нажатий (каждое событие keydown, keyup, input и composition с отметкой времени по монотонным часам performance.now()), посчитанные им метрики и хеш SHA-256 канонического результата.

Сервер прогоняет по журналу тот же код метрик и сравнивает. Если какая-либо цифра отличается больше чем на 0,01, результат отклоняется как metrics_mismatch. Если не совпадает хеш, он отклоняется как hash_mismatch. Расширение браузера, правящее поле WPM, — самый распространённый способ жульничества на сайтах, доверяющих клиенту, — здесь проваливается. Одни и те же функции дают цифру на вашем экране и в базе данных, поэтому наша страница о метриках может обещать, что её разобранный пример воспроизводится с точностью до двух знаков после запятой.

Почему бы не засекать время теста на сервере? Тогда в ваш результат входила бы сеть. Каждое нажатие доходило бы до нас с небольшим опозданием, зависящим от вашего соединения, и быстрая машинистка на медленной линии теряла бы скорость, которая у неё на самом деле есть. Журнал даёт нам часы клиента для точности и пересчёт на сервере для честности.

Шаг второй: есть ли в журнале смысл?

Ещё до любого анализа ритма — простые проверки формы отправленных данных:

  • Тест должен длиться не меньше 15 секунд или 10 слов. Более короткие заезды слишком шумные для рейтинга и легче всего поддаются накрутке.
  • Результат не может прийти раньше, чем тест мог закончиться: его начало плюс его собственная длительность. 60-секундный результат, пришедший через двадцать секунд после начала, не мог состояться.
  • Число событий должно соответствовать числу набранных символов.
  • На компьютере каждое событие input должно следовать за keydown не позже чем через 50 мс. Это ловит вставленный текст, программно созданные события input и большинство инструментов для подмены нажатий, которые выдают текст без физической клавиши. Печать через редактор методов ввода (IME, композиция) из этого правила исключена, а результаты с телефона не попадают в публичные таблицы.
  • Журнал без начала, без конца или с немонотонными отметками времени считается некорректным и сразу отклоняется.

Ничего хитрого тут нет, но это отсекает основную массу.

Шаг третий: что может рассказать ритм нажатий?

Эту часть мы намеренно описываем не полностью: список признаков публичный, пороги и веса — нет. Опубликованный порог — это мишень. Если бы мы написали «помечается стандартное отклонение меньше N миллисекунд», следующая версия любого скрипта добавила бы N плюс один. Признаки, которые мы оцениваем:

Средний промежуток между клавишами и насколько он меняется. Человеческая печать неравномерна. В исследовании Дхакала и коллег 2018 года на 168 960 участниках средний интервал между нажатиями был около 239 мс со стандартным отклонением около 112 мс. У скрипта, печатающего с фиксированным интервалом, разброса почти нет; исследование 2025 года на arXiv о CAPTCHA на основе нажатий увидело ровно это у своего тестового бота, печатавшего с фиксированной задержкой 50 мс. Это наш самый сильный сигнал, и именно на нём споткнулась наша вспомогательная функция.

Доля промежутков короче 40 мс. Промежуток в 40 мс, если его выдерживать, — это 1500 знаков в минуту, или 300 WPM при пяти знаках на слово. Пальцы действительно выдают отдельные такие короткие промежутки, когда перекрывают клавиши при наложении нажатий, так что один короткий промежуток ничего не значит. Журнал, в котором большая доля промежутков такая короткая, — это не печать.

Время удержания клавиш. У настоящих пальцев оно колеблется на десятки миллисекунд; у синтетических событий время удержания часто одинаковое или почти нулевое, потому что инструмент отправляет keydown и keyup сразу друг за другом.

Доля наложений (rollover). Как часто следующая клавиша нажимается раньше, чем отпущена предыдущая. Дхакал намерил среднюю долю наложений 25%, причём большинство быстрых машинисток накладывали нажатия в 40–70% случаев, а клавиши перекрывались в среднем на 30 мс. Медленные почти не накладывают нажатия, поэтому быстрый результат без наложений бросается в глаза. Боты редко перекрывают клавиши.

Самая длинная пауза, колебания скорости от секунды к секунде и доля промежутков длиннее секунды. Люди запинаются так, как скрипту нужно специально велеть подражать.

Модель оценки объединяет эти признаки и может пометить результат как подозрительный. Ниже 130 WPM пометка сама по себе ничего не отклоняет. Ваш результат никогда не скрывается от вас; эти проверки решают только, попадёт ли он в рейтинг.

Может ли жульничество в тесте печати обойти проверки ритма?

Да, если обман сделан аккуратно. В статье Дэвида Кондри на arXiv в январе 2026 года проверялись детекторы по ритму нажатий, призванные отличать текст, набранный человеком, от сгенерированного ИИ. Полностью автоматическую подстановку они отделяли безупречно, но атаки с человеческим ритмом (человек перепечатывает текст ИИ или программа берёт задержки из данных о человеческой печати) обходили все пять классификаторов как минимум в 99,8% случаев. Статья об определении авторства, а не о тестах печати, но урок переносится: третий шаг ловит небрежных и почти никого больше.

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

Так что третий шаг — это фильтр. Вердикт выносит четвёртый.

Шаг четвёртый: проверочный повторный тест

Если результат теста на время выше 130 WPM и его ритм к тому же выглядит необычно, вы его видите, и он сохраняется, но не попадает в публичные таблицы, пока вы не пройдёте проверочный повторный тест. Это новый 30-секундный тест, и на нём нужно набрать не меньше 75% от заявленной скорости. Разовая случайность или чужой журнал второй заезд не переживут.

Почему 130 WPM? Это примерно в два с половиной раза больше среднего 51,56 WPM в данных Дхакала, намного выше большинства людей, и тот, кто действительно печатает так быстро, сможет сделать это дважды. Внезапный быстрый результат со странным ритмом — именно такую картину дают чужой журнал или скрипт, а если результат честный, один лишний тест — небольшая цена.

Повторный тест — это обычный тест скорости печати на обычном тексте, а не искажённая картинка или страница странных символов. Трудночитаемый текст замедляет всех, и сильнее всего он замедляет честных быстрых машинисток, ради оправдания которых повторный тест и существует. Проверка, которую не проходят честные быстрые машинистки, хуже, чем никакая. Обычный текст делает проверку ещё и справедливой: журнал самого повторного теста проходит те же проверки ритма, что и любой другой результат.

Ограничения частоты и блокировки

Число отправок ограничено: тридцать в минуту на вошедшего пользователя, шестьдесят на IP-адрес. Аккаунт, который раз за разом проваливает проверки, получает теневой бан, то есть его тихо убирают из таблиц, и три серьёзных события защиты от жульничества за 24 часа включают это автоматически. Подсчёт событий внутри окна означает, что один странный результат никогда не стоит вам аккаунта, а скрипт, проваливающийся снова и снова, быстро останавливается.

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

За что можно получить пометку случайно

Большинство помеченных результатов — не жульничество. Честные способы споткнуться о проверку:

Автозамена на телефоне. Замена приходит одним событием input, которое меняет несколько символов. Мы считаем её одним нажатием, помечаем и не пускаем результат в публичные таблицы с пояснением, а не отклоняем его.

Вставленный текст. Вставка заблокирована, а результат, при котором её пытались сделать, исключается из таблиц.

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

Паузы. Промежуток больше пяти секунд в тесте на слова или цитату помечает результат как поставленный на паузу. Отношение то же.

Композиция IME. Японский, корейский и китайский ввод приходит через события composition, поэтому правило о keydown для них мы пропускаем. Если что-то всё равно выглядит неправильно, это ошибка, и мы будем рады получить журнал.

Офлайн-результаты. Результат, синхронизированный больше чем через десять минут после окончания, остаётся в вашей истории без рейтинга, потому что проверить его часы мы не можем.

Настоящая скорость. Выше 130 WPM вы встретитесь с повторным тестом, вероятно, в свой первый удачный день.

Как обжаловать

Каждое исключение показывает свою причину в вашей истории. Если вы считаете, что мы ошиблись насчёт результата или ограничения, напишите на адрес для апелляций, указанный на нашей странице о защите от жульничества, с адреса вашего аккаунта, приложив ссылку на результат или дату и время теста. Человек просмотрит повтор нажатий и ответит в течение нескольких дней. Апелляции никогда не решает одна лишь автоматическая модель.

Не опубликовали ли мы только что инструкцию по прохождению проверок? Отчасти. Список признаков всегда можно было вычислить по поведению, а пороги остаются закрытыми. Значение имеет повторный тест, а пройти его можно только одним способом — напечатать.

Часто задаваемые вопросы

Как тесты печати выявляют ботов?

Хорошие тесты читают журнал нажатий: есть ли за каждым символом нажатие клавиши, насколько меняются промежутки между клавишами, как клавиши удерживаются и перекрываются. Скрипты обычно слишком равномерны; аккуратные боты могут подражать людям, поэтому мы добавляем повторный тест.

Может ли бот обойти защиту теста печати?

Аккуратный бот может пройти проверки ритма: исследование детекторов по ритму нажатий показало, что подделанный человекоподобный ритм обходил их почти каждый раз. Поэтому мы придерживаем быстрые результаты до повторного теста, который бот должен пройти снова, со вторым журналом, проходящим те же проверки.

Почему мой результат теста печати не попал в рейтинг?

Обычно это тест короче 15 секунд или 10 слов, пауза дольше пяти секунд, переключение вкладки или результат выше 130 WPM, ожидающий повторного теста. Причина видна в вашей истории.

Источники