声明:本教程只能用于教学目的,如果用于非法目的与本人无关
滑动验证码
教学视频:https://www.bilibili.com/video/BV19yWre4E7A/?vd_source=4e60c6c3075c23c4aef0f545b39459b8
对应教学资料:https://github.com/tomysky/slide_match
1.前言
滑动验证码是一种常见的用户验证方式,通常用于防止自动化程序(如机器人)恶意访问网站。滑动验证码的基本原理是用户需要将一个滑块拖动到特定位置以完成验证,目的是验证用户的行为是人工操作而非自动化脚本。
滑动验证码的工作流程通常包括以下步骤:
- 验证码生成:系统生成一个带有滑块和背景图片的验证码界面。背景图片通常包含一个缺口,而滑块是与缺口形状匹配的小块图像。
- 用户操作:用户将滑块拖动到背景图片的缺口处。如果滑块与缺口精确对齐,则验证通过;否则,验证失败。
- 验证机制:
- 前端验证:前端根据用户的操作判断滑块是否对齐。
- 后端验证:在滑块对齐后,前端会将验证数据发送给服务器,服务器通过算法再次确认用户操作的有效性。
- 处理结果:如果验证通过,用户可以继续进行后续操作;如果验证失败,系统可能要求用户重新进行验证或提供其他验证方式。
滑动验证码的优势在于能够有效防止简单的自动化攻击,因为它需要人工操作才能完成验证。然而,随着技术的发展,某些高级自动化脚本可能依然能够通过滑动验证码,因此这类验证码常常与其他验证机制(如文字验证码、短信验证等)结合使用以增强安全性。
某验:
有混淆的背景图案,混淆的类似拼图,但是缺口明显
![]()
某易:
滑块和缺口有白色的混淆,简单
![]()
某美:
背景和缺口对比明显,但是有对应的混淆的滑块小图
![]()
某象:
背景和缺口混淆一般,滑块和正确的缺口特征明显
![]()
2.ddddocr方案
网址:https://github.com/sml2h3/ddddocr
安装:pip install ddddocr
使用说明:
import ddddocr # 导入 ddddocr 库,用于滑块验证码的目标检测
import cv2 # 导入 OpenCV 库,用于图像处理和显示
# 定义一个函数,用于显示背景图像并在匹配到的目标位置绘制矩形框
def cv_show(bg_path, res):
# 读取背景图像
img = cv2.imread(bg_path)
# 在匹配到的位置绘制一个矩形框
# res['target'] 包含了匹配到的目标的坐标 [x1, y1, x2, y2]
cv2.rectangle(img,
(res['target'][0], res['target'][1]), # 左上角坐标
(res['target'][2], res['target'][3]), # 右下角坐标
(0, 255, 0), # 颜色为绿色
2) # 线条宽度为 2 像素
# 显示结果图像
cv2.imshow("res", img)
# 等待用户按键,随后关闭窗口
cv2.waitKey(0)
# 初始化 ddddocr 的滑块验证码匹配模型,禁用字符检测和OCR功能
det = ddddocr.DdddOcr(det=False, ocr=False)
# 背景图像路径
bg_path = "bg6.jpg"
# 打开并读取目标图像(滑块)文件
with open('target6.png', 'rb') as f:
target_bytes = f.read()
# 打开并读取背景图像文件
with open(bg_path, 'rb') as f:
background_bytes = f.read()
# 使用 ddddocr 进行滑块验证码匹配,获取匹配结果
res = det.slide_match(target_bytes, background_bytes,simple_target=True)
# 打印匹配结果,res 是一个包含匹配位置等信息的字典
print(res)
# 调用自定义函数 cv_show,在背景图像上绘制匹配到的目标矩形框,并显示
cv_show(bg_path, res)
3.opencv方案
使用opencv打开图片,然后把目标图片用模板匹配的方式在背景图上查找。因为全匹配干扰比较大,所以采用canny找到图像的边缘,用边缘匹配,准确率高
import cv2
# 定义一个函数用于在图像上绘制矩形框,并显示结果
def cv_show_target(img, x1, y1, x2, y2):
# 在图像上绘制矩形框,颜色为绿色,线条宽度为2
cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2)
# 显示处理后的图像
cv2.imshow("res", img)
# 等待用户按键继续
cv2.waitKey(0)
# 关闭所有显示的窗口
cv2.destroyAllWindows()
# 定义一个函数用于显示图像
def cv_show(img, title="img"):
# 显示图像
cv2.imshow(title, img)
# 等待用户按键继续
cv2.waitKey(0)
# 关闭所有显示的窗口
cv2.destroyAllWindows()
# 加载背景图像
bg = cv2.imread(