Тестовете за скорост на писане откриват измами, като проверяват записа на натисканията зад всеки резултат. Нашият преизчислява всеки резултат от записа на натисканията, проверява хеш, тества структурата и времената на записа и задържа извън публичните класации всеки резултат с таймер над 130 WPM, чиито времена също изглеждат необичайни, докато не минеш повторен тест. Проверките на времената хващат небрежните ботове; повторният тест кара внимателния бот да направи всичко отначало.
Първият бот, който надхитри нашите проверки на времената, беше наш собствен.
Помощната програма за нашите end-to-end тестове натискаше клавишите през фиксирани 40 ms, защото точно това прави един тестов скрипт. Сървърът преизчисли резултата, потвърди хеша и оцени опита като подозрителен: нулева вариация между натисканията, нулево застъпване, еднакви времена на задържане. Трябваше да добавим случайно разместване за всяка дума и от време на време паузи „за мислене“ от 80 до 300 ms, преди собственият ни набор от тестове да може да изпрати резултат, който изглежда човешки. Опцията все още е в кода, с етикет humanLike.
Проверките работят срещу всичко, което не се опитва, а всичко, което се опитва, може да ги мине, затова истинската тежест в дизайна пада върху повторния тест.
Първа стъпка: преизчисляване на всичко
Браузърът ти не ни изпраща WPM. Той изпраща записа на натисканията (всяко събитие keydown, keyup, input и composition, с времева отметка от монотонния часовник performance.now()), метриките, които е изчислил, и SHA-256 хеш на каноничния резултат.
Сървърът пуска същия код за метриките върху записа и сравнява. Ако някое число се различава с повече от 0,01, резултатът се отхвърля като metrics_mismatch. Ако хешът не съвпада, се отхвърля като hash_mismatch. Разширение за браузъра, което редактира полето с WPM – най-честата измама в сайтовете, които се доверяват на клиента, – се проваля тук. Едни и същи функции дават числото на екрана ти и в базата данни, затова нашата страница за метриките може да обещае, че примерното ѝ изчисление се възпроизвежда до два знака след десетичната запетая.
Защо да не измерваме времето на теста на сървъра? Тогава резултатът ти щеше да включва мрежата. Всяко натискане щеше да стига до нас малко късно, с количество, което зависи от връзката ти, и бърз машинописец на бавна линия щеше да губи скорост, която наистина е имал. Записът ни дава часовника на клиента за точност и преизчисляването на сървъра за честност.
Втора стъпка: смислен ли е записът?
Преди какъвто и да е анализ на времената – прости проверки на формата на изпратеното:
- Тестът трябва да продължи поне 15 секунди или 10 думи. По-кратките опити са твърде шумни за класиране и най-лесни за надуване.
- Резултат не може да пристигне, преди тестът да е могъл да приключи: началото му плюс собствената му дължина. Резултат от 60 секунди, пристигнал двадесет секунди след началото си, не се е случил.
- Броят на събитията трябва да съответства на написаните знаци.
- На настолен компютър всяко събитие input трябва да следва keydown в рамките на 50 ms. Това хваща поставен текст, скриптирани събития input и повечето инструменти за инжектиране на натискания, които пускат текст без физически клавиш. Писането чрез редактор на метода на въвеждане (IME composition) е изключено от това правило, а резултатите от телефон остават извън публичните класации.
- Запис без начало, без край или с немонотонни времеви отметки е повреден и се отхвърля направо.
Нищо от това не е хитро, но премахва по-голямата част от обема.
Трета стъпка: какво могат да разкрият времената на натисканията?
Това е частта, която нарочно не документираме изцяло: списъкът с характеристики е публичен, праговете и тежестите – не. Публикуваният праг е мишена. Ако кажем „стандартно отклонение под N милисекунди се отбелязва“, следващата версия на всеки скрипт ще добави N плюс едно. Характеристиките, които оценяваме:
Средният интервал между клавишите и колко варира. Човешкото писане е неравномерно. В изследването на Dhakal и колегите му от 2018 г. на 168 960 машинописци средният интервал между клавишите е около 239 ms със стандартно отклонение около 112 ms. Скрипт, който пише с фиксиран интервал, почти няма вариация; изследване в arXiv от 2025 г. на CAPTCHA, основана на натисканията, вижда точно това при своя тестов бот, който пише с фиксирано забавяне от 50 ms. Това е най-силният ни сигнал и именно на него се спъна нашата помощна програма.
Делът на интервалите под 40 ms. Интервал от 40 ms, ако се поддържа, прави 1500 знака в минута, или 300 WPM при пет знака на дума. Пръстите наистина дават единични толкова кратки интервали, когато застъпват клавишите, така че един кратък интервал не означава нищо. Запис, в който голяма част от интервалите са толкова кратки, не е писане.
Времена на задържане на клавишите. Истинските пръсти варират с десетки милисекунди; синтетичните събития често имат еднакви или почти нулеви времена на задържане, защото инструментът пуска keydown и keyup едно след друго.
Дял на застъпване (rollover). Колко често следващият клавиш се натиска, преди предишният да се вдигне. Dhakal измерва среден дял на застъпване от 25%, като повечето бързи машинописци застъпват при 40 до 70% от натисканията, а клавишите се припокриват средно с 30 ms. Бавните машинописци почти не застъпват, така че бърз резултат без застъпване се откроява. Ботовете рядко застъпват клавиши.
Най-дългата пауза, колебанията на скоростта от секунда на секунда и делът на интервалите над една секунда. Хората се колебаят по начини, които на скрипта трябва изрично да се кажат да имитира.
Модел за оценка съчетава тези характеристики и може да отбележи резултат като подозрителен. Под 130 WPM отбелязването само по себе си не отхвърля нищо. Резултатът ти никога не се скрива от теб; тези проверки решават само дали ще бъде класиран.
Може ли измама в тест за писане да мине проверките на времената?
Да, ако измамата е изградена внимателно. Статия в arXiv от януари 2026 г. на David Condrey тества детектори, базирани на времената на натисканията, предназначени да различават текст, написан от човек, от текст, генериран от ИИ. Те отделят напълно автоматизираното инжектиране безупречно, но атаките с човешки времена (човек, който преписва текст от ИИ, или програма, която взема закъснения от данни за човешко писане) избягват и петте класификатора в поне 99,8% от случаите. Статията е за откриване на авторство, а не за тестове за писане, но поуката важи: третата стъпка хваща небрежните и почти нищо друго.
Собствената ни помощна програма показва същото в малък мащаб: случайното разместване и няколко паузи я преместиха от очевидно синтетична към правдоподобна.
Така че третата стъпка е филтър. Присъдата идва от четвъртата.
Четвърта стъпка: повторният тест за потвърждение
Ако резултат с таймер е над 130 WPM и времената му също изглеждат необичайни, ти го виждаш и той се запазва, но остава извън публичните класации, докато не минеш повторен тест за потвърждение. Това е нов 30-секунден тест, в който трябва да достигнеш поне 75% от заявената скорост. Еднократна случайност или чужд запис не оцеляват при втори опит.
Защо 130 WPM? Това е около два и половина пъти средната от 51,56 WPM в данните на Dhakal, доста над повечето машинописци, и всеки, който наистина пише толкова бързо, може да го направи два пъти. Внезапен бърз резултат със странни времена е формата, която дава чужд запис или скрипт, а ако е честен, един допълнителен тест е малка цена.
Повторният тест е обикновен тест за писане, с обикновен текст, а не изкривено изображение или страница със странни символи. Трудният за четене текст забавя всички, а най-много забавя честните бързи машинописци, заради които повторният тест съществува. Проверка, на която честните бързи машинописци се провалят, е по-лоша от никаква. Обикновеният текст прави проверката и справедлива: собственият запис на повторния тест минава през същите проверки на времената като всеки друг резултат.
Ограничения на честотата и блокирания
Изпращанията са ограничени по честота: тридесет в минута на влязъл потребител, шестдесет на IP адрес. Акаунт, който продължава да задейства проверките, получава скрита забрана (shadow ban), т.е. тихо бива скрит от класациите, а три сериозни събития по защитата от измами за 24 часа задействат това автоматично. Броенето на събития в рамките на прозорец означава, че един странен резултат никога не ти струва акаунта, а скрипт, който се проваля отново и отново, бързо бива спрян.
Класациите за всички времена също изискват 30 минути писане в акаунта, така че нов акаунт с един перфектен опит не може да ги оглави.
Какво те отбелязва случайно
Повечето отбелязани резултати не са измама. Честните начини да задействаш проверка:
Автокорекция на телефон. Замяната пристига като едно събитие input, което променя няколко знака. Броим я като едно натискане, отбелязваме я и държим резултата извън публичните класации с бележка, а не с отхвърляне.
Поставен текст. Поставянето е блокирано, а резултат, при който е направен опит за поставяне, се изключва от класациите.
Смяна на раздели. Ако фокусът напусне страницата за повече от две секунди по време на тест, тестът се отбелязва като прекъснат; запазва се и се показва, но не се класира.
Паузи. Интервал над пет секунди в тест с думи или цитат отбелязва резултата като паузиран. Същото третиране.
IME composition. Японският, корейският и китайският текст пристигат чрез събития composition, затова пропускаме правилото за keydown за тях. Ако нещо все пак изглежда грешно, това е бъг и бихме искали да видим записа.
Офлайн резултати. Резултат, синхронизиран повече от десет минути след приключването си, остава в историята ти некласиран, защото не можем да проверим часовника му.
Истинска бързина. Над 130 WPM ще срещнеш повторния тест, вероятно още в първия си добър ден.
Как да обжалваш
Всяко изключване показва причината си в историята ти. Ако смяташ, че грешим за даден резултат или ограничение, пиши на адреса за обжалване от нашата страница за защитата от измами от имейла на акаунта си, с връзката към резултата или датата и часа на теста. Човек гледа повторението на натисканията и отговаря в рамките на няколко дни. Обжалванията никога не се решават само от автоматичния модел.
Публикувахме ли току-що ръководство как да минеш проверките? Отчасти. Списъкът с характеристики винаги е можел да се открие от поведението, а праговете остават скрити. Повторният тест е частта, която има значение, а начинът да го минеш е да пишеш.
Често задавани въпроси
Как тестовете за писане откриват ботове?
Добрите четат записа на натисканията: дали зад всеки знак има натиснат клавиш, колко варират интервалите между клавишите и как клавишите се задържат и застъпват. Скриптовете обикновено са твърде равномерни; внимателните ботове могат да имитират хора, затова добавяме повторен тест.
Може ли бот да мине защитата от измами на тест за писане?
Внимателен бот може да мине проверките на времената: изследване на детектори, базирани на времената на натисканията, установява, че подправените човекоподобни времена ги заобикалят почти всеки път. Затова задържаме бързите резултати за повторен тест, който ботът трябва да мине отново с втори запис, преминаващ през същите проверки.
Защо резултатът ми от теста за писане не беше класиран?
Обикновено заради тест под 15 секунди или 10 думи, пауза над пет секунди, смяна на раздел или резултат над 130 WPM, който чака повторния си тест. Историята ти показва причината.