打字测试检测作弊的方法,是检查每个成绩背后的按键记录。我们会根据按键记录重新计算每个成绩,核对哈希值,检验记录的结构和计时;任何超过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毫秒内出现。这能抓住粘贴的文本、脚本生成的输入事件,以及大多数按键注入工具,因为它们不经过实体按键就直接输出文字。通过输入法输入(IME组字)不受此规则约束,手机成绩也不进入公开排行榜。
- 没有开始、没有结束或时间戳不单调递增的记录属于格式错误,直接拒绝。
这些都谈不上高明,但能挡掉绝大多数作弊提交。
第三步:按键计时能透露什么?
这是我们刻意不完整公开的部分:特征列表是公开的,阈值和权重不公开。公布出来的阈值就是靶子。如果我们说“标准差低于N毫秒就会被标记”,下一版的所有脚本都会把它设成N加一。我们评分的特征有:
按键之间的平均间隔,以及它的波动程度。人类打字是不规则的。在Dhakal等人2018年对168,960名打字者的研究中,平均按键间隔约为239毫秒,标准差约为112毫秒。以固定间隔打字的脚本几乎没有波动;2025年arXiv上一篇关于基于按键的验证码(CAPTCHA)的研究,在其测试机器人身上看到的正是这一点,那个机器人以固定的50毫秒延迟打字。这是我们最强的信号,也是我们的测试辅助程序触发的那一项。
间隔小于40毫秒的比例。40毫秒的间隔如果一直保持,就是每分钟1,500个字符,按每个单词5个字符计就是300 WPM。手指在滚键时按键重叠,确实会产生单个这么短的间隔,所以一个短间隔说明不了什么。但如果一份记录里有很大比例的间隔都这么短,那就不是在打字。
按键按住的时长。真实的手指会有几十毫秒的差异;合成事件的按住时长往往完全相同或接近零,因为工具是把keydown和keyup紧挨着发出去的。
滚键比例。也就是下一个键在上一个键弹起之前就被按下的频率。Dhakal测得平均滚键比例为25%,大多数快手有40%到70%的按键是滚键,按键平均重叠30毫秒。打字慢的人几乎不滚键,所以一个没有滚键的快速成绩会很显眼。机器人很少让按键重叠。
最长停顿、每秒速度的起伏,以及超过一秒的间隔所占比例。人会以各种方式迟疑,而脚本必须被专门告知才会模仿。
一个评分模型综合这些特征,可以把成绩标记为可疑。在130 WPM以下,标记本身不会拒绝任何成绩。你的成绩永远不会对你隐藏;这些检查只决定它是否参与排名。
打字测试作弊能骗过计时检查吗?
能,只要作弊手段做得足够用心。David Condrey在2026年1月发表于arXiv的一篇论文,测试了用来区分人工打字文本和AI生成文本的按键计时检测器。它们能完美区分全自动的注入,但带有人类计时特征的攻击(由人重新打一遍AI文本,或由程序从人类打字数据中抽样延迟),在全部五个分类器上的逃脱率都至少达到99.8%。这篇论文研究的是作者身份检测,不是打字测试,但道理是相通的:第三步能抓住粗心的作弊者,除此之外作用不大。
我们自己的测试辅助程序也在小范围内说明了同一点:加上随机抖动和几次停顿,它就从明显合成变成了看起来可信。
所以第三步只是一道过滤。最终结论来自第四步。
第四步:验证复测
如果一个限时成绩超过130 WPM,计时又显得异常,你能看到它,它也会被保存,但在你通过验证复测之前,它不会进入公开排行榜。复测是一次新的30秒测试,你需要达到所声称速度的至少75%。偶然的一次走运或借来的记录,过不了第二次测试。
为什么是130 WPM?它大约是Dhakal数据中平均值51.56 WPM的两倍半,远超大多数打字者,而真能打这么快的人可以再做到一次。一个突然出现、计时又古怪的快速成绩,正是借来的记录或脚本会产生的样子;如果它是真实的,多测一次也只是很小的代价。
复测就是一次普通的打字测试,用普通的文本,而不是扭曲的图片或一页奇怪的符号。难以辨认的文本会让所有人变慢,而受影响最大的,恰恰是复测本来要放行的那些诚实的快手。一个连诚实的快手都过不了的验证,还不如没有。普通文本也让检查更公平:复测本身的按键记录,要经过和其他成绩完全相同的计时检查。
频率限制与封禁
提交有频率限制:每个已登录用户每分钟30次,每个IP地址每分钟60次。一个账号如果反复触发检查,就会被影子封禁(shadow ban),也就是被悄悄地从排行榜上隐藏;24小时内出现三次严重的反作弊事件会自动触发这一处理。在时间窗口内计数,意味着一次奇怪的成绩永远不会让你丢掉账号,而一再失败的脚本会很快被叫停。
全时段排行榜还要求账号累计打字30分钟,所以一个只有一次完美成绩的新账号无法登顶。
哪些情况会被误标记
大多数被标记的成绩都不是作弊。诚实的人触发检查的情况有:
手机上的自动更正。一次替换以一个input事件到达,却改动了好几个字符。我们把它计为一次按键并加以标记,这个成绩不进入公开排行榜,但会附上说明,而不是被拒绝。
粘贴文本。粘贴是被禁止的,尝试过粘贴的成绩不进入排行榜。
切换标签页。测试期间焦点离开页面超过两秒,成绩会被标记为中断;它会被保存和显示,但不参与排名。
停顿。在单词或引文测试中,单词内出现超过五秒的间隔,成绩会被标记为暂停。处理方式同上。
输入法组字。日文、韩文和中文输入都是通过composition事件到达的,所以我们对它们跳过keydown规则。如果仍然有什么看起来不对,那是个bug,我们希望拿到那份记录。
离线成绩。在完成十多分钟之后才同步的成绩,会留在你的历史记录里但不参与排名,因为我们无法验证它的时钟。
确实打得快。超过130 WPM你就会遇到复测,很可能在你第一次发挥出色的那天就会遇到。
如何申诉
每一个被排除的成绩,都会在你的历史记录里显示原因。如果你认为我们对某个成绩或某项限制判断有误,请用账号绑定的邮箱,给我们反作弊页面上的申诉地址发邮件,附上成绩链接,或者测试的日期和时间。会有一个真人观看按键回放,并在几天内回复。申诉从不只由自动模型裁决。
我们是不是刚刚公开了一份通过检查的攻略?算是一部分。特征列表本来就能从系统的表现中推测出来,而阈值仍然保密。真正起作用的是复测,而通过复测的方法,就是自己打字。
常见问题
打字测试如何检测机器人?
好的打字测试会读取按键记录:每个字符背后是否都有一次按键,按键之间的间隔波动有多大,按键如何按住和重叠。脚本往往太规律;精心制作的机器人可以模仿人类,所以我们加了复测。
机器人能通过打字测试的反作弊检查吗?
精心制作的机器人能通过计时检查:关于按键计时检测器的研究发现,伪造的类人计时几乎每次都能逃过检测。所以我们会把快速成绩留待复测,机器人必须再提交一份通过同样检查的按键记录,才能过关。
为什么我的打字测试成绩没有参与排名?
通常是因为测试不足15秒或10个单词、有超过五秒的停顿、切换了标签页,或者成绩超过130 WPM、正在等待复测。你的历史记录里会显示原因。