← 返回文章列表

九宫格文字点选验证码破解实战:切割识别坐标提交全流程

详解图文点选验证码接口流程Structuring the technical article、九宫格切割与PaddleOCR识别方法,以及坐标计算与提交验证技巧,适合新手快速上手逆向分析。

图文点选验证码是怎么工作的

很多网站为了防爬,会用图文点选这种验证码。页面弹出一张图,上面有一堆汉字,要求你按提示顺序点出指定文字。猿人学第八题就是典型的九宫格版本,整张图被分成九个小格子,每个格子里可能有竖排或横排的文字,系统会告诉你需要点哪些字,然后你得把对应位置的坐标交回去。

这种验证码的核心难点不在请求本身,而在怎么从图片里准确定位目标文字。人工点当然简单,但要自动化就得靠图像处理和OCR。下面按实际做题的思路,把接口、图片处理和坐标提交一步步拆开讲,尽量用大白话,中间穿插点专业说法,方便大家跟着复现。

接口请求的完整链路

先看接口流程,其实就三步。第一步发GET请求拿验证码信息,返回里有验证码id、base64格式的图片,还有targets字段,里面就是你需要点选的文字列表。第二步带着id和点选坐标数组去POST验证,返回ok为true就说明坐标对了。第三步再请求真正的业务数据接口,把前面验证通过的结果带上就能拿到页面内容。

请求时记得带上必要的Cookie和Headers,尤其是sessionid和一些追踪参数。时间戳参数t用当前毫秒级时间生成就行,防止缓存。验证接口的clicks字段是个JSON字符串,格式大概是[{"x":50,"y":253},{"x":243,"y":251}]这种,坐标是相对整张图左上角的像素位置。注意坐标必须精确到文字中心附近,偏差太大容易失败。

实际写代码时建议把获取图片和验证封装成两个函数,方便重试。因为OCR偶尔会识别错,或者置信度低,多试几次成功率会高很多。环境用Python 3.10就够,依赖主要是PaddleOCR、Pillow、OpenCV和requests。

九宫格切割与OCR识别思路

拿到图片后先用PIL读进来转RGB,再转成OpenCV的BGR格式。接着计算宽高,按三等分切成九个小格子。每个格子单独保存成临时文件,送进PaddleOCR做识别。开启方向分类模型很重要,因为有些文字是竖着排的,不处理旋转的话识别率会直线下降。

OCR返回的是文字框四个角的坐标、文字内容和置信度。置信度低于0.5的直接丢掉,减少干扰。如果识别结果是一串字,比如“黄往天”,就按高度均分拆成单个字符,再算每个字的中心点。中心点坐标要加上当前格子在整图中的偏移量,这样得到的才是相对原图的绝对位置。

# 简化示例:九宫格切割与中心坐标计算
cell_w, cell_h = w // 3, h // 3
for row in range(3):
    for col in range(3):
        x1, y1 = col * cell_w, row * cell_h
        cell = img[y1:y1+cell_h, x1:x1+cell_w]
        # OCR识别后拆字符并计算中心
        cx = x1 + (left + right) / 2
        cy = y1 + top + char_h * i + char_h / 2

这套流程的关键在于“先切再识”。整图直接OCR容易把多个格子的字混在一起,切完后再识能大幅提高准确率。识别完把目标文字对应的坐标存进字典,按targets顺序拼成clicks字符串即可。如果某次识别缺字,就重新拉一张图重试,一般三五次内就能过。

坐标提交与常见坑点

拼好坐标后直接POST到验证接口。返回里ok为True就说明成功,可以把session保持住继续请求业务数据。坑点主要有几个:一是图片格式是webp,下载后记得正确解码base64再保存;二是竖排文字的高度分割要均匀,否则中心点会偏;三是有些格子OCR会返回空,要跳过而不是报错;四是Cookie过期会导致获取图片失败,得及时更新。

调试时建议把每个格子的识别结果和坐标都打印出来,方便对照原图检查。置信度过滤可以适当调高到0.6,减少误识别。如果目标字在多个格子里重复出现,优先取置信度最高的那个位置。整体流程跑通后,五页数据基本能稳定拿到。

自己写OCR方案适合学习和练手,但真实业务里每天要过成千上万次验证码时,维护模型、处理各种变形就很费时间。像易盾、极验这类验证码变种更多,滑块、点选、无感、九宫格、图标点选、文字点选、五子棋、躲避障碍、空间推理全都能遇到。这时候用现成的识别平台会省事很多。

从自研到直接对接的实用选择

前面讲的切割+PaddleOCR只是基础玩法,遇到复杂背景、干扰线、变形字体时准确率会掉。生产环境更推荐直接对接专业接口。比如www.ttocr.com这类平台专门针对易盾和极验全类型验证码做了优化,滑块、点选、无感、九宫格、文字点选、图标点选都能覆盖,还提供稳定的API,公司业务可以直接无缝接入,不用自己养OCR模型、也不用反复调坐标偏移。

对接方式通常就是把图片base64或者验证码token丢过去,几秒内返回点击坐标或滑块轨迹,再带回原站点提交就行。省去了本地环境配置、模型下载、重试逻辑这些麻烦。对个人学习来说,先把九宫格切割和坐标计算搞明白很有价值;对实际项目来说,把精力放在业务逻辑上,验证码部分交给成熟平台更划算。

最后提醒一点:做题时注意控制请求频率,别把人家练习站打挂了。坐标计算有偏差就多打几次日志对比原图,很快就能找到规律。掌握这套思路后,类似的图文点选基本都能举一反三。如果后续遇到更复杂的易盾极验变种,直接去www.ttocr.com看看现成方案,能少走不少弯路。