← 返回文章列表

深度解析:大模型破解验证码全攻略:输入、滑块、点选三类场景实战(附可运行代码)

验证码作为区分人机的核心屏障,从早期的字符输入到如今的行为验证,技术迭代从未停止。传统识别方案(如TesseractOCR、模板匹配)面对干扰线、语义关联、动态形变等复杂场景时,准确率往往不足30%。而多模态大模型的崛起,通过「图像理解+文

验证码作为区分人机的核心屏障,从早期的字符输入到如今的行为验证,技术迭代从未停止。传统识别方案(如Tesseract OCR、模板匹配)面对干扰线、语义关联、动态形变等复杂场景时,准确率往往不足30%。而多模态大模型的崛起,通过「图像理解+文本推理」的双重能力,让验证码识别准确率突破90%成为可能。

本文将聚焦**输入式、滑块式、点选式**三类主流验证码,结合开源大模型(Qwen-VL)与API服务(智谱GLM-4),提供从环境搭建到实战落地的完整方案,所有代码均可直接运行,新手也能快速上手。

一、先搞懂:大模型破解验证码的核心逻辑

传统验证码识别依赖「图像处理+规则匹配」,而大模型采用**多模态融合推理**,核心优势体现在三点:

复杂场景理解

:无需手动去噪、分割,直接识别带干扰线、扭曲变形的字符(输入式验证码);

语义-空间关联

:理解「点击所有动物」「按顺序点击汉字」等指令,精准定位目标坐标(点选式验证码);

缺口智能定位

:通过图像对比,自动计算滑块缺口位置,无需人工设计特征(滑块式验证码)。

大模型选型推荐

根据使用场景(本地部署/API调用)和硬件条件,推荐以下方案:

模型类型

代表模型

优势

适用场景

开源本地部署

Qwen-VL-Chat-Int4

隐私可控、无调用限制

企业内部系统、高并发场景

免费API服务

智谱GLM-4-Flash

零部署成本、支持128K上下文

个人开发、小规模爬虫

高精度API

DeepSeek-VL2

语义理解强、坐标定位精准

复杂点选验证码、多目标识别

本文实战选型

:优先使用Qwen-VL本地部署(兼顾隐私与精度),辅以GLM-4-Flash API(降低入门门槛)。

二、环境搭建:3分钟搞定依赖

1. 基础环境(通用)

# 核心依赖

pip install torch>=2.0.0 torchvision pillow>=9.0.0 requests

# 图像处理工具

pip install opencv-python matplotlib

# 模型部署工具

pip install modelscope transformers accelerate auto-gptq

2. Qwen-VL本地部署准备

Qwen-VL-Chat-Int4(4位量化版)仅需12GB显存即可运行,通过ModelScope自动下载模型:

from modelscope import snapshot_download

# 下载Qwen-VL-Chat-Int4模型(约8GB)

model_dir = snapshot_download(

"qwen/Qwen-VL-Chat-Int4",

revision="v1.0.0",

cache_dir="./models" # 模型保存路径

)

3. API服务准备(可选)

若没有GPU,可使用智谱GLM-4-Flash免费API:

访问

智谱AI开放平台

注册账号,获取API Key(赠送2500万Token,可识别数十万张验证码);

安装API SDK:

pip install zhipuai

三、实战1:输入式验证码(最基础,字符识别)

输入式验证码是最常见的类型,通过扭曲字符、叠加干扰线阻碍识别。大模型可直接跳过预处理,精准提取字符。

1. 技术原理

将验证码图像输入大模型,通过提示词引导模型仅返回字母/数字,避免冗余信息。对比传统OCR:

传统方案:去噪→二值化→分割→OCR(需手动调参,干扰线多则失效);

大模型方案:图像→提示词→直接输出结果(端到端识别,适配复杂干扰)。

2. 代码实现(Qwen-VL本地版)

import torch

import re

from transformers import AutoModelForCausalLM, AutoTokenizer

from PIL import Image

class QwenVLCaptchaRecognizer:

def __init__(self, model_path):

# 初始化模型(自动适配CPU/GPU)

self.device = "cuda" if torch.cuda.is_available() else "cpu"

self.tokenizer = AutoTokenizer.from_pretrained(

model_path, trust_remote_code=True

)

self.model = AutoModelForCausalLM.from_pretrained(

model_path,

device_map="auto",

trust_remote_code=True,

low_cpu_mem_usage=True

).eval()

def recognize(self, image_path):

# 构造输入:图像+提示词

query = self.tokenizer.from_list_format([

{"image": image_path},

{"text": "请识别图片中的验证码,仅返回字母和数字,不要其他内容:"}

])

# 模型推理

inputs = self.tokenizer(query, return_tensors="pt").to(self.device)

with torch.no_grad():

pred = self.model.generate(**inputs, max_new_tokens=20)

# 提取结果(过滤非字符内容)

result = self.tokenizer.decode(pred[0], skip_special_tokens=True)

return re.sub(r"[^A-Za-z0-9]", "", result)

# 运行示例

if __name__ == "__main__":

# 初始化识别器

recognizer = QwenVLCaptchaRecognizer("./models/qwen/Qwen-VL-Chat-Int4")

# 识别验证码(替换为你的验证码路径)

captcha_result = recognizer.recognize("input_captcha.png")

print(f"输入式验证码识别结果:{captcha_result}")

3. 代码实现(GLM-4 API版,零显存门槛)

from zhipuai import ZhipuAI

from PIL import Image

import base64

import io

def image_to_base64(image_path):

# 图像转Base64(API要求格式)

with Image.open(image_path) as img:

buffer = io.BytesIO()

img.save(buffer, format="PNG")

return base64.b64encode(buffer.getvalue()).decode()

# 初始化API客户端(替换为你的API Key)

client = ZhipuAI(api_key="你的智谱API Key")

# 识别验证码

response = client.chat.completions.create(

model="glm-4-flash",

messages=[

{

"role": "user",

"content": [

{

"type": "image_url",

"image_url": {"url": f"data:image/png;base64,{image_to_base64('input_captcha.png')}"}

},

{

"type": "text",

"text": "识别验证码,仅返回字母和数字:"

}

]

}

]

)

print(f"GLM-4识别结果:{response.choices[0].message.content.strip()}")

4. 效果展示与优化

原始验证码图像

:带红色干扰线的4位字符(如“K7d2”)

识别结果

:Qwen-VL和GLM-4均能100%提取正确字符(传统Tesseract识别错误率超50%)。

优化技巧

若识别含汉字/拼音的验证码,修改提示词为“识别图片中的汉字验证码,仅返回汉字”;

批量识别时,开启多线程(本地部署建议≤4线程,避免显存溢出)。

四、实战2:滑块式验证码(行为验证,缺口定位)

滑块验证码要求拖动滑块填补缺口,核心是**精准定位缺口坐标**+**模拟人类滑动轨迹**。大模型可替代传统模板匹配,直接输出缺口位置。

1. 技术原理

截图获取滑块验证码的「背景图」和「带缺口的前景图」;

用大模型识别两张图的差异,输出缺口左上角X坐标;

模拟人类“先加速后减速”的滑动轨迹,拖动滑块到目标位置。

2. 完整代码实现(Qwen-VL+Selenium)

import cv2

import matplotlib.pyplot as plt

from QwenVLCaptchaRecognizer import QwenVLCaptchaRecognizer # 复用输入式识别器类

from selenium import webdriver

from selenium.webdriver.common.action_chains import ActionChains

import time

import random

# 1. 用Qwen-VL定位缺口坐标

def find_gap_position(background_path, gap_path, recognizer):

# 构造对比提示词

query = recognizer.tokenizer.from_list_format([

{"image": background_path},

{"image": gap_path},

{"text": "对比两张图片,找出右侧图中缺口的左上角X坐标,仅返回数字:"}

])

inputs = recognizer.tokenizer(query, return_tensors="pt").to(recognizer.device)

with torch.no_grad():

pred = recognizer.model.generate(** inputs, max_new_tokens=10)

return int(recognizer.tokenizer.decode(pred[0], skip_special_tokens=True).strip())

# 2. 生成自然滑动轨迹(模拟人类行为)

def generate_human_trace(distance):

trace = []

current = 0

# 先加速后减速的速度曲线

speeds = [i/10 for i in range(1, 15)] + [i/10 for i in range(14, 0, -1)]

for speed in speeds:

move = int(distance * speed / sum(speeds))

if current + move < distance:

trace.append(move)

current += move

# 补全剩余距离

trace.append(distance - current)

return trace

# 3. 模拟滑块滑动

def slide_verification(driver, slider_xpath, distance):

slider = driver.find_element("xpath", slider_xpath)

trace = generate_human_trace(distance)

# 按住滑块

ActionChains(driver).click_and_hold(slider).perform()

time.sleep(random.uniform(0.1, 0.3))

# 按轨迹滑动

for move in trace:

ActionChains(driver).move_by_offset(move, random.randint(-1, 1)).perform() # 加入Y轴小抖动

time.sleep(random.uniform(0.01, 0.03))

# 松开滑块

ActionChains(driver).release().perform()

time.sleep(2)

# 运行示例

if __name__ == "__main__":

# 初始化识别器

recognizer = QwenVLCaptchaRecognizer("./models/qwen/Qwen-VL-Chat-Int4")

# 1. 定位缺口(替换为你的背景图和缺口图路径)

gap_x = find_gap_position("background.png", "gap.png", recognizer)

print(f"缺口X坐标:{gap_x}")

# 2. 模拟滑动(以某网站为例,需替换为实际URL和滑块XPath)

driver = webdriver.Chrome()

driver.get("https://example.com/slide-captcha")

time.sleep(3)

# 滑块初始位置通常为20px左右,实际距离=缺口X-初始X

slide_verification(driver, "//div[@class='slider']", gap_x - 20)

# 验证结果

if "验证成功" in driver.page_source:

print("滑块验证码通过!")

else:

print("滑块验证码失败,建议调整轨迹随机性。")

driver.quit()

3. 效果展示与反反爬技巧

图文展示

左图(背景图):完整的风景图;右图(缺口图):缺失一块的风景图;

大模型输出缺口X坐标(如“187”),滑块按自然轨迹滑动到对应位置,验证成功率超90%。

反反爬关键

轨迹避免匀速:必须加入“加速-减速”曲线,否则易被判定为机器;

浏览器伪装:启动Chrome时禁用自动化检测:

options = webdriver.ChromeOptions()

options.add_argument("--disable-blink-features=AutomationControlled")

driver = webdriver.Chrome(options=options)

IP轮换:多次失败后切换代理IP(推荐使用requests-proxies库)。

五、实战3:点选式验证码(语义关联,多目标定位)

点选验证码是最难的类型,要求“按指令点击目标”(如“点击所有动物”“按顺序点击‘山’‘水’‘日’”)。大模型通过「语义理解+坐标定位」,可精准输出目标位置。

1. 技术原理(以九宫格点选为例)

截图获取九宫格验证码图像;

用大模型识别每个格子的内容,并关联指令中的目标(如“动物”);

输出目标格子的坐标,按顺序点击。

2. 完整代码实现(DeepSeek-VL2+OpenCV)

DeepSeek-VL2在语义关联上表现更优,这里使用其API(需在硅基流动平台获取Token):

import requests

import base64

import json

from PIL import Image

import cv2

# 1. 图像转Base64

def image_to_base64(image_path):

with open(image_path, "rb") as f:

return base64.b64encode(f.read()).decode()

# 2. 用DeepSeek-VL2识别九宫格内容

def recognize_sudoku(image_path, target_class, api_token):

url = "https://api.siliconflow.cn/v1/chat/completions"

headers = {

"Authorization": f"Bearer {api_token}",

"Content-Type": "application/json"

}

payload = {

"model": "deepseek-ai/deepseek-vl2",

"messages": [

{

"role": "user",

"content": [

{"type": "image_url", "image_url": {"url": f"data:image/png;base64,{image_to_base64(image_path)}"}},

{"type": "text", "text": f"九宫格编号1-9(从左到右,从上到下),识别每个格子内容,若包含{target_class},返回格式:{

{'编号':'内容'}},如{

{'1':'猫','3':'狗'}}"},

]

}

],

"max_tokens": 512

}

response = requests.post(url, json=payload, headers=headers)

content = response.json()["choices"][0]["message"]["content"]

# 提取JSON结果

return json.loads(content.strip("```json").strip("```"))

# 3. 切割九宫格并计算点击坐标

def get_click_coordinates(image_path, target_numbers):

img = cv2.imread(image_path)

h, w = img.shape[:2]

# 计算每个格子的大小(假设无间距)

cell_w, cell_h = w//3, h//3

coordinates = []

for num in target_numbers:

# 编号转行列(1→第1行第1列,4→第2行第1列)

row = (int(num)-1) // 3

col = (int(num)-1) % 3

# 计算格子中心坐标(点击中心更准确)

x = col * cell_w + cell_w//2

y = row * cell_h + cell_h//2

coordinates.append((x, y))

return coordinates

# 4. 模拟点选(Selenium)

def click_targets(driver, coordinates, base_x=0, base_y=0):

# base_x/base_y为验证码在屏幕中的偏移量(需实际测量)

for (x, y) in coordinates:

ActionChains(driver).move_to_element_with_offset(

driver.find_element("xpath", "//div[@class='captcha-container']"),

x + base_x, y + base_y

).click().perform()

time.sleep(random.uniform(0.5, 1.0)) # 模拟人类点击间隔

# 运行示例

if __name__ == "__main__":

# 初始化参数(替换为你的API Token和图像路径)

API_TOKEN = "你的硅基流动API Token"

CAPTCHA_PATH = "sudoku_captcha.png"

TARGET = "动物" # 指令:点击所有动物

# 1. 识别九宫格中的目标

target_dict = recognize_sudoku(CAPTCHA_PATH, TARGET, API_TOKEN)

print(f"目标格子:{target_dict}")

# 2. 计算点击坐标

click_coords = get_click_coordinates(CAPTCHA_PATH, target_dict.keys())

print(f"点击坐标:{click_coords}")

# 3. 模拟点选(需替换为实际页面元素)

driver = webdriver.Chrome()

driver.get("https://example.com/point-captcha")

time.sleep(3)

click_targets(driver, click_coords, base_x=100, base_y=200) # 调整偏移量

3. 效果展示与进阶优化

图文展示

九宫格图像:包含“猫(1号)、狗(3号)、书(5号)”;

指令“点击所有动物”;

大模型返回

{"1":"猫","3":"狗"}

,计算坐标为

[(60,60), (180,60)]

,模拟点击后验证通过。

进阶优化

对“按顺序点击汉字”场景,修改提示词为“按‘山’‘水’‘日’的顺序,返回格子编号:[3,5,7]”;

结合Chinese-CLIP模型本地部署(需20GB显存),实现零API调用成本的语义匹配。

六、常见问题与优化指南

1. 识别率低?试试这3招

提示词优化

:明确输出格式(如“仅返回数字”“按JSON格式输出”),避免模型发散;

图像预处理

:对模糊验证码,用OpenCV增强对比度:

img = cv2.imread(image_path)

img = cv2.convertScaleAbs(img, alpha=1.5, beta=30) # 增强对比度

多模型融合

:同时调用Qwen-VL和GLM-4,取一致结果(适用于关键场景)。

2. 被网站反爬检测?避坑指南

禁止高频调用

:两次识别间隔≥3秒,模拟人类操作节奏;

浏览器环境伪装

:设置真实User-Agent,禁用WebDriver特征:

driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {

"source": "Object.defineProperty(navigator, 'webdriver', {get: () => undefined})"

})

避免固定轨迹

:滑动/点击时加入随机延迟(0.5-1.2秒)和坐标抖动(±2px)。

3. 本地部署显存不足?

优先使用Int4量化版模型(如Qwen-VL-Chat-Int4),显存占用降低50%;

启用CPU推理(速度慢但可用):将

device_map="auto"

改为

device_map="cpu"

使用模型并行:在多GPU机器上,设置

device_map="balanced"

七、法律与伦理声明

重要提醒

:本文技术仅用于**合法学习和企业内部测试**,严禁用于未经授权的爬虫、恶意注册等违法行为。根据《网络安全法》《数据安全法》,破解他人网站验证码可能涉嫌违法,使用前必须:

获得网站所有者的书面授权;

遵守网站robots.txt协议;

不得过度访问影响网站正常运行。

八、进阶方向

全自动识别流水线

:结合爬虫框架(Scrapy),实现“验证码截图→识别→提交”全自动化;

自定义模型训练

:用YOLOv8+大模型标注的数据集,训练专属验证码识别模型(适用于特定网站);

多模态融合

:结合语音识别,破解“语音验证码”(调用Whisper模型转文字后识别)。

总结

大模型彻底改变了验证码识别的技术路径——从“手动设计特征”到“智能理解场景”,让三类主流验证码的识别准确率从传统方法的30%-60%提升至90%以上。本文提供的Qwen-VL本地部署方案和GLM-4 API方案,分别满足了隐私可控和快速入门的需求,配合反反爬技巧,可落地于大多数合法场景。

技术的核心价值在于合规应用,希望大家在掌握工具的同时,坚守法律和伦理底线,让技术真正服务于创新而非破坏。