深度解析:大模型破解验证码全攻略:输入、滑块、点选三类场景实战(附可运行代码)
验证码作为区分人机的核心屏障,从早期的字符输入到如今的行为验证,技术迭代从未停止。传统识别方案(如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方案,分别满足了隐私可控和快速入门的需求,配合反反爬技巧,可落地于大多数合法场景。
技术的核心价值在于合规应用,希望大家在掌握工具的同时,坚守法律和伦理底线,让技术真正服务于创新而非破坏。