Les tests de frappe détectent la triche en examinant le journal de frappe qui se cache derrière chaque score. Le nôtre recalcule chaque résultat à partir de son journal de frappe, vérifie un hash, contrôle la structure et le rythme du journal, et tient hors des classements publics tout résultat chronométré au-dessus de 130 WPM dont le rythme paraît aussi inhabituel, jusqu’à ce que vous réussissiez un test de confirmation. Les contrôles de rythme attrapent les bots négligents ; le test de confirmation oblige un bot soigné à tout refaire.
Le premier bot à déjouer nos contrôles de rythme, c’était le nôtre.
Notre outil de tests de bout en bout appuyait sur les touches à un intervalle fixe de 40 ms, parce que c’est ce que fait un script de test. Le serveur a recalculé le résultat, confirmé le hash, et jugé la série suspecte : aucune variance entre les frappes, aucun rollover, des temps d’appui identiques. Nous avons dû ajouter une variation aléatoire par mot et, de temps en temps, des pauses « de réflexion » de 80 à 300 ms avant que notre propre suite de tests puisse publier un résultat d’apparence humaine. L’option est toujours dans le code, sous le nom humanLike.
Les contrôles fonctionnent contre tout ce qui n’essaie pas de les contourner, et tout ce qui essaie peut les passer : c’est pourquoi le dispositif fait reposer le vrai poids sur un test de confirmation.
Première étape : tout recalculer
Votre navigateur ne nous envoie pas un WPM. Il envoie le journal de frappe (chaque événement keydown, keyup, input et composition, horodaté avec l’horloge monotone performance.now()), les mesures qu’il a calculées, et un hash SHA-256 du résultat canonique.
Le serveur exécute le même code de calcul sur le journal et compare. Si un chiffre diffère de plus de 0,01, le résultat est rejeté avec le motif metrics_mismatch. Si le hash ne correspond pas, il est rejeté avec le motif hash_mismatch. Une extension de navigateur qui modifie le champ WPM, la triche la plus courante sur les sites qui font confiance au client, échoue ici. Ce sont les mêmes fonctions qui produisent le chiffre affiché sur votre écran et celui de la base de données, et c’est pourquoi notre page sur les mesures peut garantir que son exemple chiffré se reproduit à deux décimales près.
Pourquoi ne pas chronométrer le test sur le serveur ? Parce que votre score inclurait alors le réseau. Chaque frappe nous parviendrait avec un léger retard, variable selon votre connexion, et une personne rapide sur une ligne lente perdrait une vitesse qu’elle avait réellement. Le journal nous donne l’horloge du client pour la précision et le recalcul du serveur pour l’honnêteté.
Deuxième étape : le journal tient-il debout ?
Avant toute analyse du rythme, de simples contrôles sur la forme de l’envoi :
- Le test doit durer au moins 15 secondes ou 10 mots. Les séries plus courtes sont trop bruitées pour être classées et les plus faciles à gonfler.
- Un résultat ne peut pas arriver avant que le test ait pu se terminer : son début plus sa propre durée. Un résultat de 60 secondes qui arrive vingt secondes après son début n’a pas eu lieu.
- Le nombre d’événements doit correspondre aux caractères tapés.
- Sur ordinateur, chaque événement input doit suivre un keydown dans les 50 ms. Cela attrape le texte collé, les événements input scriptés et la plupart des outils d’injection de frappes, qui envoient du texte sans touche physique. La frappe via un éditeur de méthode de saisie (composition IME) en est exemptée, et les résultats sur téléphone restent hors des classements publics.
- Un journal sans début, sans fin ou avec des horodatages non monotones est malformé et rejeté d’emblée.
Rien de tout cela n’est astucieux, mais cela élimine l’essentiel du volume.
Troisième étape : que peut révéler le rythme de frappe ?
C’est la partie que nous ne documentons volontairement pas entièrement : la liste des caractéristiques est publique, les seuils et les pondérations ne le sont pas. Un seuil publié est une cible. Si nous disions « un écart-type inférieur à N millisecondes est signalé », la version suivante de chaque script ajouterait N plus un. Les caractéristiques que nous évaluons :
L’intervalle moyen entre deux touches et sa variabilité. La frappe humaine est irrégulière. Dans l’étude menée en 2018 par Dhakal et ses collègues sur 168 960 personnes, l’intervalle moyen entre deux touches était d’environ 239 ms, avec un écart-type d’environ 112 ms. Un script qui tape à intervalle fixe ne varie presque pas ; une étude arXiv de 2025 sur un CAPTCHA fondé sur la frappe a constaté exactement cela avec son bot de test, qui tapait avec un délai fixe de 50 ms. C’est notre signal le plus fort, et celui qu’a déclenché notre outil de test.
La part des intervalles inférieurs à 40 ms. Un intervalle de 40 ms, tenu dans la durée, représente 1 500 caractères par minute, soit 300 WPM à cinq caractères par mot. Les doigts produisent bien des intervalles isolés aussi courts quand ils chevauchent des touches lors du rollover, donc un seul intervalle court ne signifie rien. Un journal où une large part des intervalles est aussi courte, ce n’est pas de la frappe.
Les temps d’appui des touches. De vrais doigts varient de plusieurs dizaines de millisecondes ; les événements synthétiques ont souvent des temps d’appui identiques ou quasi nuls, parce que l’outil envoie keydown et keyup coup sur coup.
Le taux de rollover. La fréquence à laquelle la touche suivante descend avant que la précédente soit remontée. Dhakal a mesuré un taux moyen de rollover de 25 %, la plupart des personnes rapides chevauchant 40 à 70 % de leurs frappes, avec des touches qui se superposent de 30 ms en moyenne. Les personnes lentes n’en font presque pas, donc un résultat rapide sans rollover se remarque. Les bots chevauchent rarement les touches.
La pause la plus longue, les variations de vitesse d’une seconde à l’autre, et la part des intervalles de plus d’une seconde. Les gens hésitent d’une façon qu’un script doit apprendre à imiter.
Un modèle de score combine ces éléments et peut signaler un résultat comme suspect. En dessous de 130 WPM, un signalement ne rejette rien à lui seul. Votre résultat ne vous est jamais caché ; ces contrôles décident seulement s’il est classé.
La triche à un test de frappe peut-elle déjouer les contrôles de rythme ?
Oui, si la triche est conçue avec soin. Un article arXiv de janvier 2026 signé David Condrey a testé des détecteurs fondés sur le rythme de frappe, censés distinguer un texte tapé par un humain d’un texte généré par une IA. Ils séparaient parfaitement l’injection entièrement automatisée, mais les attaques au rythme humain (une personne qui retape un texte d’IA, ou un programme qui tire ses délais de données de frappe humaine) ont échappé aux cinq classifieurs dans au moins 99,8 % des cas. L’article porte sur la détection de l’auteur d’un texte, pas sur les tests de frappe, mais la leçon s’applique : la troisième étape attrape les négligents, et guère plus.
Notre propre outil de test le montre à petite échelle : une variation aléatoire et quelques pauses l’ont fait passer d’évidemment synthétique à plausible.
La troisième étape est donc un filtre. Le verdict vient de la quatrième.
Quatrième étape : le test de confirmation
Si un résultat chronométré dépasse 130 WPM et que son rythme paraît aussi inhabituel, vous le voyez et il est enregistré, mais il reste hors des classements publics jusqu’à ce que vous réussissiez un test de confirmation. Il s’agit d’un nouveau test de 30 secondes, où vous devez atteindre au moins 75 % de la vitesse revendiquée. Un coup de chance isolé ou un journal emprunté ne survit pas à une deuxième série.
Pourquoi 130 WPM ? C’est environ deux fois et demie la moyenne de 51,56 WPM des données de Dhakal, bien au-delà de la plupart des gens, et quiconque tape vraiment aussi vite peut le refaire. Un résultat soudainement rapide avec un rythme étrange, c’est le profil que produit un journal emprunté ou un script, et s’il est honnête, un test de plus est un petit prix à payer.
Le test de confirmation est un test de frappe ordinaire, sur un texte ordinaire, pas une image déformée ni une page de symboles bizarres. Un texte difficile à lire ralentit tout le monde, et ceux qu’il ralentit le plus sont justement les personnes rapides et honnêtes que le test de confirmation doit blanchir. Une vérification que ratent les personnes rapides et honnêtes est pire que pas de vérification du tout. Un texte ordinaire rend aussi le contrôle équitable : le journal du test de confirmation passe par les mêmes contrôles de rythme que n’importe quel autre résultat.
Limites d’envoi et bannissements
Les envois sont limités : trente par minute par utilisateur connecté, soixante par adresse IP. Un compte qui déclenche sans cesse les contrôles est banni en sourdine (shadow-ban), c’est-à-dire discrètement masqué des classements, et trois événements anti-triche graves en 24 heures le déclenchent automatiquement. Compter les événements dans une fenêtre de temps fait qu’un résultat bizarre isolé ne vous coûte jamais votre compte, alors qu’un script qui échoue encore et encore est vite arrêté.
Les classements de tous les temps exigent aussi 30 minutes de frappe sur le compte, si bien qu’un compte tout neuf avec une seule série parfaite ne peut pas en prendre la tête.
Ce qui peut vous faire signaler par accident
La plupart des résultats signalés ne sont pas de la triche. Les façons honnêtes de déclencher un contrôle :
La correction automatique sur téléphone. Un remplacement arrive sous la forme d’un seul événement input qui modifie plusieurs caractères. Nous le comptons comme une seule frappe, nous le signalons, et nous gardons le résultat hors des classements publics avec une note, sans le rejeter.
Le texte collé. Le collage est bloqué, et un résultat où il a été tenté est exclu des classements.
Le changement d’onglet. Si la page perd le focus plus de deux secondes pendant un test, celui-ci est marqué comme interrompu ; il est enregistré et affiché, mais pas classé.
Les pauses. Un intervalle de plus de cinq secondes dans un test de mots ou de citation marque le résultat comme mis en pause. Même traitement.
La composition IME. Le japonais, le coréen et le chinois arrivent par des événements de composition, donc nous ne leur appliquons pas la règle du keydown. Si quelque chose paraît encore anormal, c’est un bug, et nous aimerions avoir le journal.
Les résultats hors ligne. Un résultat synchronisé plus de dix minutes après la fin du test reste dans votre historique sans être classé, parce que nous ne pouvons pas valider son horloge.
Être vraiment rapide. Au-dessus de 130 WPM, vous passerez par le test de confirmation, probablement lors de votre premier bon jour.
Comment faire appel
Chaque exclusion affiche son motif dans votre historique. Si vous pensez que nous nous trompons sur un résultat ou une restriction, écrivez à l’adresse d’appel indiquée sur notre page anti-triche depuis l’adresse e-mail de votre compte, avec le lien du résultat ou la date et l’heure du test. Une personne regarde la relecture des frappes et répond sous quelques jours. Les appels ne sont jamais tranchés par le seul modèle automatique.
Venons-nous de publier un mode d’emploi pour passer les contrôles ? En partie. La liste des caractéristiques a toujours pu se déduire du comportement, et les seuils restent privés. Le test de confirmation est la partie qui compte, et le moyen de le réussir, c’est de taper.
Questions fréquentes
Comment les tests de frappe détectent-ils les bots ?
Les bons lisent le journal de frappe : si chaque caractère correspond à un appui de touche, à quel point les intervalles entre les touches varient, et comment les touches sont maintenues et chevauchées. Les scripts ont tendance à être trop réguliers ; les bots soignés peuvent imiter les humains, et c’est pourquoi nous ajoutons un test de confirmation.
Un bot peut-il passer l’anti-triche d’un test de frappe ?
Un bot soigné peut passer les contrôles de rythme : une étude sur les détecteurs fondés sur le rythme de frappe a montré qu’un rythme humain contrefait leur échappait presque à tous les coups. C’est pourquoi nous retenons les résultats rapides pour un test de confirmation, qu’un bot doit réussir à son tour avec un second journal qui passe les mêmes contrôles.
Pourquoi mon résultat au test de frappe n’a-t-il pas été classé ?
Le plus souvent : un test de moins de 15 secondes ou 10 mots, une pause de plus de cinq secondes, un changement d’onglet, ou un résultat au-dessus de 130 WPM en attente de son test de confirmation. Votre historique indique le motif.