21xrx.com
2025-06-30 14:50:24 Monday
文章检索 我的文章 写文章
使用opencv-python实现网页滑块验证码图片的提取
2023-10-09 11:08:22 深夜i     24     0
OpenCV Python 网页滑块验证码 图片提取

在现代互联网应用中,为了保护用户账号的安全,很多网站都使用滑块验证码来阻止恶意机器人或者自动化程序的攻击。而对于开发者而言,如何在自动化测试或爬虫开发中绕过滑块验证码成为了一项具有挑战性的任务。幸运的是,我们可以借助OpenCV-Python这个强大的图像处理库来完成这个任务。

首先,我们需要了解滑块验证码的工作原理。通常,滑块验证码由两部分组成:背景图片和滑块图片。背景图片是一个带有缺口的大图,而滑块图片就是滑块部分的截图。当用户滑动滑块来匹配背景图片中的缺口时,验证码才会被验证成功。

我们的目标是提取滑块验证码中的滑块图片。为了完成这个任务,我们需要先加载滑块验证码的网页,然后通过OpenCV-Python找到滑块图片在整个验证码图像中的位置。

首先,我们需要使用selenium库打开网页并获取验证码图像。具体代码如下:

from selenium import webdriver
from PIL import Image
# 启动浏览器
browser = webdriver.Chrome()
# 打开网页
browser.get("http://example.com")
# 定位滑块验证码的位置,通过selenium获取验证码图像的位置和尺寸
slider = browser.find_element_by_xpath("//div[@class='slider']")
# 获取验证码整体图像
full_img = browser.find_element_by_xpath("//img[@class='bg-img']")
# 获取验证码滑块图像
slider_img = browser.find_element_by_xpath("//img[@class='slider-img']")
# 获取验证码整体图像的位置(左上角坐标)
full_img_location = full_img.location
# 获取验证码整体图像的尺寸
full_img_size = full_img.size
# 获取验证码滑块图像的位置(左上角坐标)
slider_img_location = slider_img.location
# 获取验证码滑块图像的尺寸
slider_img_size = slider_img.size
# 截取整体图像
browser.save_screenshot("screenshot.png")
full_img = Image.open("screenshot.png").crop((full_img_location['x'], full_img_location['y'], full_img_location['x'] + full_img_size['width'], full_img_location['y'] + full_img_size['height']))
# 截取滑块图像
slider_img = Image.open("screenshot.png").crop((slider_img_location['x'], slider_img_location['y'], slider_img_location['x'] + slider_img_size['width'], slider_img_location['y'] + slider_img_size['height']))
# 保存图像
full_img.save("full_img.png")
slider_img.save("slider_img.png")
# 关闭浏览器
browser.quit()

接下来,我们可以使用OpenCV-Python来提取滑块图片中的滑块部分。具体代码如下:

python
import cv2
# 读取图像
full_img = cv2.imread("full_img.png")
slider_img = cv2.imread("slider_img.png")
# 转为灰度图像
full_img_gray = cv2.cvtColor(full_img, cv2.COLOR_BGR2GRAY)
slider_img_gray = cv2.cvtColor(slider_img, cv2.COLOR_BGR2GRAY)
# 使用OpenCV-Python中的模板匹配函数
result = cv2.matchTemplate(full_img_gray, slider_img_gray, cv2.TM_CCOEFF_NORMED)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)
top_left = max_loc
# 获取滑块图片中滑块的位置
slider_width = slider_img.shape[1]
slider_height = slider_img.shape[0]
bottom_right = (top_left[0] + slider_width, top_left[1] + slider_height)
# 在滑块验证码整体图像上画出滑块的位置矩形
cv2.rectangle(full_img, top_left, bottom_right, (0, 0, 255), 2)
# 保存结果
cv2.imwrite("result.png", full_img)

通过以上步骤,我们成功地使用OpenCV-Python实现了滑块验证码图片的提取。现在我们可以在提取出的滑块图片上画出滑块的位置,并将结果保存为result.png文件。

总之,借助OpenCV-Python的强大图像处理功能,我们可以很方便地在网页滑块验证码中提取出滑块图片,为自动化测试和爬虫开发提供了更多可能性。

  
  

评论区

    相似文章