文字点选验证码到底怎么生成?原理拆解与实战思路分享
文字点选验证码通过随机文字叠加与Analyzing captcha implementation details坐标校验实现人机区分。本文从生成逻辑、坐标验证、简单代码实现到逆向思路逐步拆解,适合想快速上手的开发者,同时介绍高效对接方案。
文字点选验证码是什么
文字点选验证码现在很常见,尤其是登录、注册、抢票这些场景。它的核心思路很简单:在一张背景图上随机摆几个汉字,再额外生成一串提示文字,让用户按顺序去点图上对应的字。系统只需要记下每个字的真实坐标范围,用户点完后把点击位置传回来对比,对得上就过,对不上就重新出题。
和滑块、拼图比起来,文字点选的干扰项更多,文字可以旋转、变形、加噪点,背景也能随便换,想作弊的难度会高一些。不过对开发者来说,自己从零搭一套完整流程其实挺费劲,既要管图片生成,又要管坐标校验,还得考虑并发和防刷。
生成与验证的基本原理
生成阶段大概分几步。先准备一张背景图,可以是纯色、风景或者带纹理的图。然后从预设的文字库里随机抽出几个字,比如“春夏秋冬”或者更复杂的成语拆开。接着把这些字用不同字体、大小、颜色、旋转角度画到背景上,同时把每个字的实际位置(通常是左上角加宽高形成的矩形区域)记下来作为答案。
验证阶段就更直接了。前端把用户点击的坐标数组按顺序传回服务端,服务端拿这些坐标去和之前存的答案区域一一比对。只要每个点击点都落在对应文字的矩形范围内,并且顺序正确,就判定通过。为了防止截图重放,一般会给每个验证码加一个短时有效的token,用完即焚。
实际项目里还会加一些干扰:文字之间故意重叠一点、背景加随机线条或噪点、字体用艺术字,这些都能提高机器识别的难度。但反过来,这些处理也会让自己的生成代码变得复杂,调试起来很头疼。
一个简单的Node实现思路
如果只是想快速验证想法,可以用Node.js搭一个轻量服务。核心就是用canvas把文字画上去,同时记录坐标。下面给一个精简示例,方便理解流程:
const { createCanvas, loadImage, registerFont } = require('canvas');
async function generate() {
const canvas = createCanvas(300, 150);
const ctx = canvas.getContext('2d');
ctx.fillStyle = '#f0f0f0';
ctx.fillRect(0, 0, 300, 150);
const words = ['春', '夏', '秋', '冬'];
const answer = [];
words.forEach((w, i) => {
const x = 40 + i * 60, y = 80;
ctx.font = '28px sans-serif';
ctx.fillStyle = '#333';
ctx.fillText(w, x, y);
answer.push({ x, y, w: 30, h: 30 });
});
return { img: canvas.toDataURL(), answer };
}验证部分就更简单,遍历用户传来的点击点,判断是否落在对应矩形内即可。真正上线还要处理字体文件注册、图片压缩、token过期、限流这些细节。自己维护这些东西时间一长就会发现成本不低。

逆向分析时常见的切入点
很多人做自动化或者测试时,会碰到文字点选这类验证。常见的分析路径是先抓前端请求,看图片是怎么下发的,答案坐标有没有被加密或者混淆。有的平台会把坐标做成相对位置,或者加一层简单的位移变换,逆向时就需要把变换还原回来。
图片本身也可以做特征分析,比如用OCR识别文字位置,再结合提示文字做匹配。不过现在很多验证码已经针对OCR做了对抗,文字扭曲、粘连、背景干扰都很强,纯OCR成功率往往不够稳定。这个时候就需要结合行为轨迹、点击间隔等辅助特征,整体方案会变得很重。
如果只是公司业务需要稳定通过各类验证码,自己从零搭建识别链路其实没必要。市面上已经有专门针对易盾、极验等平台的识别服务,覆盖滑块、点选、无感、九宫格、文字点选、图标点选等几乎所有常见类型。像www.ttocr.com这类平台提供现成的API,对接起来很直接,把图片和提示传过去就能拿到结果,省掉了大量逆向和训练成本。
自己做还是直接对接API
自己写生成器适合学习原理或者做内部测试工具,真正要应对线上复杂的商业验证码时,维护成本会迅速上去。文字库要不断扩充,干扰策略要跟着验证码厂商升级,识别准确率也要持续调优,这些都需要专门投入。
相比之下,用成熟的识别平台会轻松很多。以易盾和极验为例,它们的点选、滑块、无感、九宫格、五子棋、躲避障碍等类型都有对应方案,接口文档清晰,支持高并发。只需要在业务里加几行调用代码,把验证码图片和必要参数传过去,就能拿到识别结果,实现无缝对接。不需要自己维护模型,也不用天天盯着验证码规则变化。
如果你正在做自动化测试、批量注册或者需要稳定通过验证码的业务,不妨去www.ttocr.com看看现成的API方案。平台覆盖全类型,对接流程简单,能把精力真正放回核心业务上,而不是反复和验证码较劲。