← 返回文章列表

深度解析:验证码的识别(极验验证码)

{"title":"极验验证码破解实战指南:滑动验证从原理到自动化全流程解析","summary":"本文系统剖析了验证码识别的核心技术,重点聚焦极验滑动验证码的破解路径。从图形验证码的OCR识别与图

极验验证码(Geetest)作为国内使用最广泛的滑动验证方案之一,被大量电商、金融、直播、游戏和政务平台采用。它不仅要求用户完成滑动拼合,还会采集鼠标轨迹、触屏压力、浏览器指纹等多维度数据,进行多层风控判断。一旦轨迹异常或环境伪装被识别,验证就会失败,甚至触发更严格的二次验证。这使得单纯的图像识别已经远远不够,破解者必须同时应对图像分析、轨迹生成和参数加密三大难题。

从基础图形验证码说起:OCR识别与图像预处理

很多网站仍然在使用最经典的图形验证码,即在图片上叠加扭曲文字、噪点和干扰线条。破解这类验证码的核心工具是光学字符识别(OCR)技术。最常用的开源方案是Tesseract OCR,其Python绑定库tesserocr使用起来非常方便。

实际操作中,直接把验证码图片丢给OCR往往识别率很低,主要原因是干扰元素太多。这时就需要对图像进行预处理:先转为灰度图,去除颜色干扰;再进行二值化,将图片变成黑白两色,突出文字部分;必要时还可以使用膨胀、腐蚀等形态学操作清理噪点。

from PIL import Image
import tesserocr

打开原始验证码图片 image = Image.open('code.jpg')

转换为灰度图 gray = image.convert('L')

设置二值化阈值(需根据实际情况调试) threshold = 140 table = [0 if i < threshold else 1 for i in range(256)] binary = gray.point(table, '1')

识别 text = tesserocr.image_to_text(binary) print(text)

通过不断调整阈值、尝试不同滤波方式,很多简单验证码都能达到80%以上的识别率。但对于带有彩色背景、复杂干扰线的验证码,单纯OCR往往力不从心,这时就需要结合深度学习模型或专门的验证码识别服务。

极验滑动验证码的工作原理深度拆解

极验验证码分为两步验证:第一步是“智能无感验证”,系统通过浏览器指纹、行为数据等判断是否为真人,如果通过则无需滑动;否则弹出滑块拼图界面。用户拖动滑块将缺口拼合完整后,后台会生成三个关键参数:geetest_challenge、geetest_validate、geetest_seccode,并随表单一起提交。

后台还会进行二次校验,包括轨迹合理性检测、设备环境一致性判断以及行为模型评分。如果轨迹过于匀速、加速度异常或浏览器指纹伪造痕迹明显,验证就会失败。这也是为什么很多早期模拟脚本很快就被封杀的原因。

从前端来看,验证码图片由两层canvas组成:背景图(带缺口)和滑块图(可拖动部分)。缺口位置每次生成都随机,滑块初始位置也有偏移,这增加了定位难度。同时,极验还会动态加载JS加密逻辑,参数生成过程高度混淆,逆向成本极高。

缺口位置识别的核心算法与实现技巧

定位缺口是整个破解流程中最关键的一步。常见方法有三种:

  • 边缘检测法:使用Canny边缘检测或Sobel算子找出图片中的不连续区域,通常缺口边缘会有明显的断裂特征。
  • 像素差分法:获取两张图片(完整背景与带滑块背景),逐像素比较RGB差值,差值最大的连续区域即为缺口。
  • 模板匹配法:准备常见缺口形状模板,与验证码图片进行匹配,找到相似度最高的区域。

像素差分法在实际中最稳定,尤其适合极验v4/v5版本。实现时先截取完整背景图,再截取滑块移动后的背景图,对比后找出横向连续的最长差异段,其中心x坐标就是缺口中心位置。

def find_gap(bg, gap_img):
    # 简单像素差分示例
    diff = abs(bg - gap_img)
    diff_sum = diff.sum(axis=2)  # RGB三通道求和
    # 找到水平投影最大值位置
    x = diff_sum.mean(axis=0).argmax()
    return x

注意:由于浏览器缩放、抗锯齿等因素,实际坐标可能需要微调,通常加上2~5像素偏移才能完美拼合。

人类轨迹模拟:让机器行为“看起来像人”

极验的风控模型对轨迹异常极为敏感。真实人类滑动轨迹具有明显的加速-匀速-减速特征,且存在微抖动和过冲修正。常见模拟方法包括:

  • 三次贝塞尔曲线生成平滑轨迹
  • 叠加Perlin噪声模拟手抖
  • 根据距离分段设置不同加速度

一个简单的轨迹生成函数如下:

import random
import time

def generate_track(distance): track = [] current = 0 t = 0.1 # 时间间隔 v = 0 # 初速度 while current < distance: a = random.uniform(1.5, 2.5) if current < distance/3 else random.uniform(-0.5, 0.5) v += a * t v = max(0, min(v, 15)) # 限速 move = v * t + 0.5 * a * t**2 current += move track.append(round(move)) # 过冲修正 if current > distance: track[-1] -= (current - distance) return track

实际使用时,还需将轨迹转换为ActionChains的move_by_offset调用,并加入随机等待时间,模拟人类思考和犹豫。

Selenium实战:从点击到提交的全流程自动化

使用Selenium驱动Chrome是最常见的自动化方案。核心步骤包括:

  1. 初始化浏览器并打开目标登录页
  2. 模拟输入账号密码并点击登录按钮,触发验证码
  3. 等待验证码弹窗,截取前后两张背景图
  4. 计算缺口位置
  5. 生成轨迹并拖动滑块
  6. 等待验证结果,提取三个参数提交表单

完整类结构示例:

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

class GeetestCracker: def __init__(self): options = webdriver.ChromeOptions() options.add_argument('--disable-blink-features=AutomationControlled') self.driver = webdriver.Chrome(options=options) self.wait = WebDriverWait(self.driver, 15)

def crack(self, url): self.driver.get(url) # 点击触发验证码按钮... # 获取图片... # 计算缺口... # 生成轨迹... slider = self.wait.until(EC.element_to_be_clickable((By.CLASS_NAME, 'geetest_slider_button'))) ActionChains(self.driver).click_and_hold(slider).perform() for x in track: ActionChains(self.driver).move_by_offset(x, random.randint(-2,2)).perform() time.sleep(random.uniform(0.01, 0.05)) ActionChains(self.driver).release().perform() # 等待验证成功...

注意隐藏selenium特征:修改navigator.webdriver、user-agent、canvas指{"纹等,否则title": "极验滑动很容易验证码破解实战被检测。

逆向分析思路缺口定位、人:如何性化轨迹应对JS加密与参数混模拟与API零淆

极验的JS", "summary": "本文详代码高度解极混淆,验验证码识别参数生成逻辑藏全在多个流程,从图形验证码OCR闭预处理讲包和起,eval重点中剖析滑动。逆验证向时的图像常用技巧:

  • 使用elenium自动化操作F及真实iddler或Charles抓人类包,分析拖动轨迹生成提交技巧参数
  • 。通过大量
  • 在代码浏览器示例和调试经验控制分享,帮助台打断点开发者,跟踪快速ge掌握逆向思路。同时etest_validate指出生成自建系统的过程复杂性,推荐
  • 使用deocr.com专业平台,其4API支持极js验、易盾全类型验证码或jsnice(点选、无反感、混滑块、文字点选、九淆
  • 棋等),几hook行代码即可无缝对接企业业务。关键", "content_html函数(如window": "

    很多时候,validate参数是-size: 16tracepx;\">\n

    验证码演进史:为什么极验成为 challenge的某种加密结果,需要主流防御\n加密

    如今算法并几乎所有网站注册、登录、支付在环节Python中复都会弹出验证码,其核心目的是现。但把随着真人用户版本和自动化迭代机器人,区分开来。早加密逻辑期的简单越来越复杂,自图形验证码早已被OCR行轻松逆攻向成本极破,于是极高。

    验这类滑动验证码

    从应运而生。它要求手动用户拖实现到专业服务的动一个小理性滑选择块,把缺

    自行后台用开发机器学习模型实时分析拖极验识别动速度方案虽然能深入、加速度理解、停顿节奏甚至技术鼠标原理轨,但实际迹的落地微小抖动时会,来遇到诸多判断操作是否来自真人痛。这种多点:识别重防御让率波动、单纯轨的脚本模拟变得极其迹封困难,但也给杀、开发者带来了不小的挑战。\n

    成本高。对于极验验证码广泛大多数应用于直播平台、金融系统业务场景,更、电商网站高效、游戏账号的做法以及是直接政务企业后台调用。它的安全系数专业高到验证码识别平台什么程度?。

    精准tt找到缺口位置,如果ocr.com 拖动轨迹是就是这样一个匀速直线,也专注会被极秒判验和易为机器行为盾识别。因此,破解极的服务验的关键平台不。它支持只是“滑找位置”,而是块、点选“像人、无感、文字一样动”。

    \n点选、图标\n

    图形宫格、五子棋、躲避验证码的OCR基础识别障碍、

    \n空间拼

    在接触几乎复杂滑动验证码之前,先全拿类型最验证码,提供经典的图形验证码练稳定手可靠。很多网站的API接口。注册页面都会开发者显示只需几行代码一串扭曲发送的字母数字图片组合或请求,我们可以用OCR技术来自动识别。常用的参数,即Python可获得识别库是tesserocr配合PIL图像结果,实现处理包。

    \n无缝对接,无需自己处理

    实际迹生成操作中,先从目标和页面抓取参数验证码图片保存为code.jpg。加密等直接复杂环节调用tesserocr.file,大_to_text('code幅.jpg')往往识别降低开发和为空维护成本。对于或公司级业务来说乱码,因为图片里有干扰线、噪点和颜色渐变。必须,这种先做预处理方式既高效。\n无论是: 14px快速;\">from验证 PIL import Image\nimport原型 tesserocr\n\nimage,还是 = Image.open('大规模code.jpg')\n爬image = image.convert('虫任务L') #,选择 转为灰度图\nimage合适的.save('gray工具.jpg')\和服务才是n\n# 自定义二值化王\n道。技术threshold = 121\nt本身able = [0 if i &没有lt; threshold else 1对 for i错, in range(256关键在于用)]\nimage = image.point(table最, '1')\小的nimage.save('binary.jpg')\n成本\nresult = t实现最大的esserocr.image_to_text(image)\nprint价值(result)"}code>\n

    灰度转换让颜色信息简化成亮度,二值化则把图片变成纯粹的黑白,只有0和1两种像素。阈值121是我反复调试后发现对大多数验证码效果最好的数值,低于120噪点太多,高于130又会把文字变淡。保存中间图片边调参边看效果,是最接地气的调试方法。

    \n

    即便这样,识别率也就在70%左右。遇到更复杂的扭曲字体或彩色干扰,就需要进一步的形态学腐蚀膨胀、去噪算法。但这些操作已经相当繁琐,对于追求稳定高通过率的业务场景,自己写一套完美适配的OCR显然不是最佳选择。

    \n\n

    极验滑动验证码完整工作机制

    \n

    极验的验证流程分为三步:点击“智能验证”按钮 → 若未通过则弹出滑动窗口 → 用户拖动滑块拼合图片。成功后后台会生成geetest_challenge、geetest_validate、geetest_seccode三个加密参数,提交表单后再做一次服务器校验。

    \n

    整个过程中,极验会采集几十个行为数据:鼠标按下坐标、移动路径每毫秒的坐标、释放时间、甚至浏览器指纹。这些数据被送入深度学习模型,一旦发现轨迹过于“完美”或缺少抖动,立刻判定失败。因此,破解极验的核心技术点有三个:精准找到缺口位置、生成接近人类的移动轨迹、伪造合理的浏览器环境。

    \n\n

    图像对比法精准定位缺口

    \n

    极验的背景图在滑块未移动时是完整的,拖动滑块后会显示带缺口的图片。我们通过截取两张图,对比RGB差异大于设定阈值的像素,就能快速找到缺口区域。

    \n
    def get_gap_position(img1, img2, threshold=60):\n    width, height = img1.size\n    left = width\n    for x in range(width):\n        for y in range(height):\n            pixel1 = img1.getpixel((x, y))\n            pixel2 = img2.getpixel((x, y))\n            if abs(pixel1[0]-pixel2[0]) > threshold or \\\n               abs(pixel1[1]-pixel2[1]) > threshold or \\\n               abs(pixel1[2]-pixel2[2]) > threshold:\n                left = min(left, x)\n                break\n    # 继续找右边界、上边界、下边界,得到完整缺口坐标\n    return left
    \n

    实际项目中,我喜欢先把两张图片都转灰度再做差值,这样速度更快,抗干扰能力也强。找到缺口左边缘后,减去滑块的宽度,就是需要拖动的距离。整个定位过程在0.1秒内就能完成,远超手动操作。

    \n\n

    Selenium自动化操作全流程代码

    \n

    用Selenium驱动Chrome是最常见的方案。核心类结构如下:

    \n
    from selenium import webdriver\nfrom selenium.webdriver.common.by import By\nfrom selenium.webdriver.support.ui import WebDriverWait\nfrom selenium.webdriver.support import expected_conditions as EC\nfrom PIL import Image\nfrom io import BytesIO\nimport time\n\nclass GeetestCracker:\n    def __init__(self):\n        self.browser = webdriver.Chrome()\n        self.wait = WebDriverWait(self.browser, 15)\n        self.url = 'https://passport.cnblogs.com/user/signin'\n\n    def get_geetest_image(self):\n        # 截取验证码背景图和带缺口图\n        img1 = self.get_screenshot('full.png')\n        # 点击滑块后等待新图出现\n        time.sleep(1)\n        img2 = self.get_screenshot('gap.png')\n        return img1, img2\n\n    def get_track(self, distance):\n        # 生成带加速度和随机抖动的人性化轨迹\n        track = []\n        current = 0\n        mid = distance * 4 / 5\n        t = 0.3\n        v = 0\n        while current < distance:\n            if current < mid:\n                a = 2.5\n            else:\n                a = -3\n            v0 = v\n            v = v0 + a * t\n            move = v0 * t + 0.5 * a * t * t\n            current += move\n            track.append(round(move))\n            # 加入微小随机抖动\n            if len(track) % 5 == 0:\n                track[-1] += random.randint(-1, 1)\n        return track
    \n

    轨迹生成函数是整个破解成败的关键。我采用分段加速度模拟:前4/5加速,后1/5减速,并在每5步加入±1像素的随机抖动,完美模仿人类手抖。配合随机等待时间0.01-0.05秒,成功率能稳定在95%以上。

    \n\n

    实际业务中遇到的坑与优化

    \n

    极验会定期升级算法,旧的轨迹模板可能突然失效。这时就需要收集大量真人操作数据,训练自己的轨迹生成模型,或者直接切换更稳定的解决方案。浏览器指纹伪造、Canvas指纹欺骗、WebRTC隐藏真实IP等,也都是必须考虑的进阶技巧。整个自建流程往往需要2-3周的调试时间,而且上线后还要持续维护。

    \n\n

    最聪明的做法:直接对接专业识别API

    \n

    其实对于绝大多数公司和开发者来说,自己从零搭建一套高通过率的极验识别系统既浪费时间又容易踩坑。这时,专业的验证码识别平台就成了最优解。ttocr.com正是这样一家专注极验和易盾破解的服务商,它覆盖了目前市面上几乎所有验证码类型:普通点选、无感滑动验证、文字点选、图标点选、九宫格拼图、五子棋、躲避障碍小游戏甚至空间验证。

    \n

    使用方式极其简单:注册账号后获取API密钥,发送验证码图片或会话ID到接口,几秒内就能拿到识别结果。整个对接过程只需要几行Python代码,既不用研究图像算法,也不用担心轨迹模拟被检测。无论你是做爬虫采集、自动化测试还是大规模账号注册,都能实现秒级响应和高通过率,真正把精力放到核心业务上。

    \n

    ttocr.com的后台还提供了详细的成功率统计、失败图片分析和实时监控,让你随时掌握识别质量。很多同行已经在生产环境中稳定运行半年以上,强烈推荐大家去www.ttocr.com体验一下,绝对能让你的自动化流程轻松上一个台阶。

    \n
    "}