Selenium+opencv识别有缺口的滑动验证码

2023-11-02 14:10

本文主要是介绍Selenium+opencv识别有缺口的滑动验证码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

完整代码我放文末

这里的有缺口图片我指的是这种类型的哈(验证码网站:https://pintia.cn/auth/login)

第一步:先创建一个driver对象访问该网站,并配置一些信息防止网站识别出是驱动的

 def __init__(self):"""构造方法设置配置一些启动项"""super(CrackSlider, self).__init__()self.opts = webdriver.ChromeOptions()self.opts.add_experimental_option('excludeSwitches', ['enable-logging'])self.opts.add_experimental_option('useAutomationExtension', False)  # 禁用Chrome的自动化拓展程序self.opts.add_experimental_option('excludeSwitches', ['enable-automation'])  # 确保浏览器不会因为启用自动化模式而出现不必要的错误或异常。self.opts.add_argument("--disable-blink-features=AutomationControlled")  # 禁用由自动化测试或脚本控制的 Blink 功能。chrome_path = r"chromedriver.exe"  # google驱动路径self.driver = webdriver.Chrome(chrome_path, options=self.opts)self.url = 'https://pintia.cn/auth/login'  # 滑块验证码的地址self.wait = WebDriverWait(self.driver, 10)

第二步:就点点到有验证码的页面呗,然后保存两张图片

def get_pic(self):self.driver.get(self.url)  # 访问地址time.sleep(3)self.driver.find_element(by=By.XPATH, value='//*[@id="username"]').send_keys("2313859086@qq.com")self.driver.find_element(by=By.XPATH, value='//*[@id="password"]').send_keys("bo18212410475")self.driver.find_element(by=By.XPATH,value='//*[@id="sparkling-daydream"]/div[2]/div/div[2]/div[2]/button/div/div').click()time.sleep(3)  # 可以设置久一些,方便页面充分加载出来target_link = self.driver.find_element(By.CLASS_NAME, "yidun_bg-img").get_attribute('src')  # 缺口图片地址template_link = self.driver.find_element(By.CLASS_NAME, "yidun_jigsaw").get_attribute('src')  # 待滑块图片地址target_img = Image.open(BytesIO(requests.get(target_link).content))  # 访问图片链接template_img = Image.open(BytesIO(requests.get(template_link).content))target_img.save('PTA_A.jpg')  # 保存图片template_img.save('PTA_B.png')

也就是图片一(含缺口图片)

还有图片二(滑块的图片)

第三步:就到了我们利用深度学习的opencv库读取我们两个图片然后识别出他们之间的距离

def match(img_jpg_path, img_png_path):# 读取图像img_jpg = cv2.imread(img_jpg_path, cv2.IMREAD_UNCHANGED)img_png = cv2.imread(img_png_path, cv2.IMREAD_UNCHANGED)# 判断jpg图像是否已经为4通道(提高去噪效果,支持透明度)if img_jpg.shape[2] == 3:"""如果是三通道就用add_alpha_channel转为4通道"""img_jpg = add_alpha_channel(img_jpg)img = handel_img(img_jpg)small_img = handel_img(img_png)res_TM_CCOEFF_NORMED = cv2.matchTemplate(img, small_img, 3)  # 计算输入图像 img 与模板图像 small_img 的相似度value = cv2.minMaxLoc(res_TM_CCOEFF_NORMED)  # 计算输入图像与模板图像的相似度,并找到相似度最高的区域value = value[3][0]  # 获取到移动距离

下面这两个函数不是我们的主线,这段代码只是为了让识别率变得高(深度学习的知识,我也在代码中解释了)

def add_alpha_channel(img):""" 为jpg图像添加alpha通道 """r_channel, g_channel, b_channel = cv2.split(img)  # 剥离jpg图像通道alpha_channel = np.ones(b_channel.shape, dtype=b_channel.dtype) * 255  # 创建Alpha通道img_new = cv2.merge((r_channel, g_channel, b_channel, alpha_channel))  # 融合通道return img_newdef handel_img(img):"""主要是为了提高图像处理的效率和效果"""imgGray = cv2.cvtColor(img, cv2.COLOR_RGBA2GRAY)  # 转灰度图imgBlur = cv2.GaussianBlur(imgGray, (5, 5), 1)  # 高斯模糊imgCanny = cv2.Canny(imgBlur, 60, 60)  # Canny算子边缘检测return imgCanny

第四步:不要学网上那种什么魔幻滑动公式s = v * t + 0.5 * a * (t ** 2),直接在滑动的时候添加抖动就可以了(也就是yoffset设置小数点)

   def crack_slider(self, distance):"""得到了需要向右滑动的距离distance值"""slider = self.wait.until(EC.element_to_be_clickable((By.CLASS_NAME, 'yidun_slider__icon')))  # 等待滑块出来ActionChains(self.driver).click_and_hold(slider).perform()  # 按住滑块# 魔幻运动ActionChains(self.driver).move_by_offset(xoffset=distance - 5, yoffset=0.81).perform()ActionChains(self.driver).move_by_offset(xoffset=3, yoffset=0.77).perform()ActionChains(self.driver).move_by_offset(xoffset=2, yoffset=-1.3).perform()ActionChains(self.driver).pause(1).perform()# 松开鼠标ActionChains(self.driver).release().perform()  # 松开鼠标time.sleep(0.5)try:wait = WebDriverWait(self.driver, 5)  # 设置最长等待时间为20秒# 大概意思就是设置20秒的等待时间,然后如果滑动准确,就会找到其他地方,然后跳转slider = wait.until(EC.presence_of_element_located((By.XPATH,'//*[@id="sparkling-daydream"]/div[1]/div/div[1]/a[2]/div/divxxx')))slider.click()print('yes')except TimeoutException:cs = CrackSlider()cs.get_pic()# 2. 对比图片,计算距离img_jpg_path = 'a.jpg'  # 读者可自行修改文件路径(我保存的是在本地)img_png_path = 'b.png'distance = match(img_jpg_path, img_png_path)  # 可以得到需要滑动的值distance = distance + 9  # 距离的进一步特殊处理# 3. 移动cs.crack_slider(distance)finally:self.driver.quit()

另外添加了一个滑动不过就继续重新滑处理,不过我一般在滑动所有这种类似网站的验证码都是一遍过

第五步:差点忘记提醒一个地方了,最后识别出距离了,然后查看照片的分辨率和页面上的分辨率是否一致,

如果不一致就转换一下,如果某些网站精度要较高,则可以加减一些数字,微调

distance = distance / 图片实际的x * 页面上的x如果图片实际为30*15
页面上为48*36
则distance = distance/30*48

完整代码如下

import requests
import time
from io import BytesIO
import cv2
import numpy as np
from PIL import Image
from selenium import webdriver  # selenium版本3.141.0配合urllib3版本1.26.0(其他包默认最新)
from selenium.common.exceptions import TimeoutException
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWaitclass CrackSlider():# 通过浏览器截图,识别验证码中缺口位置,获取需要滑动距离,并破解滑动验证码def __init__(self):"""构造方法设置配置一些启动项"""super(CrackSlider, self).__init__()self.opts = webdriver.ChromeOptions()self.opts.add_experimental_option('excludeSwitches', ['enable-logging'])self.opts.add_experimental_option('useAutomationExtension', False)  # 禁用Chrome的自动化拓展程序self.opts.add_experimental_option('excludeSwitches', ['enable-automation'])  # 确保浏览器不会因为启用自动化模式而出现不必要的错误或异常。self.opts.add_argument("--disable-blink-features=AutomationControlled")  # 禁用由自动化测试或脚本控制的 Blink 功能。chrome_path = r"./Selenium/chromedriver.exe"  # google驱动路径self.driver = webdriver.Chrome(chrome_path, options=self.opts)self.url = 'https://pintia.cn/auth/login'  # 滑块验证码的地址self.wait = WebDriverWait(self.driver, 10)def get_pic(self):self.driver.get(self.url)  # 访问地址time.sleep(3)self.driver.find_element(by=By.XPATH, value='//*[@id="username"]').send_keys("2313859086@qq.com")self.driver.find_element(by=By.XPATH, value='//*[@id="password"]').send_keys("bo18212410475")self.driver.find_element(by=By.XPATH,value='//*[@id="sparkling-daydream"]/div[2]/div/div[2]/div[2]/button/div/div').click()time.sleep(3)  # 可以设置久一些,方便页面充分加载出来target_link = self.driver.find_element(By.CLASS_NAME, "yidun_bg-img").get_attribute('src')  # 缺口图片地址template_link = self.driver.find_element(By.CLASS_NAME, "yidun_jigsaw").get_attribute('src')  # 待滑块图片地址target_img = Image.open(BytesIO(requests.get(target_link).content))  # 访问图片链接template_img = Image.open(BytesIO(requests.get(template_link).content))target_img.save('PTA_A.jpg')  # 保存图片template_img.save('PTA_B.png')def crack_slider(self, distance):"""得到了需要向右滑动的距离distance值"""slider = self.wait.until(EC.element_to_be_clickable((By.CLASS_NAME, 'yidun_slider__icon')))  # 等待滑块出来ActionChains(self.driver).click_and_hold(slider).perform()  # 按住滑块# 魔幻运动ActionChains(self.driver).move_by_offset(xoffset=distance - 5, yoffset=0.81).perform()ActionChains(self.driver).move_by_offset(xoffset=3, yoffset=0.77).perform()ActionChains(self.driver).move_by_offset(xoffset=2, yoffset=-1.3).perform()ActionChains(self.driver).pause(1).perform()# 松开鼠标ActionChains(self.driver).release().perform()  # 松开鼠标time.sleep(0.5)try:wait = WebDriverWait(self.driver, 5)  # 设置最长等待时间为20秒# 大概意思就是设置20秒的等待时间,然后如果滑动准确,就会找到其他地方,然后跳转slider = wait.until(EC.presence_of_element_located((By.XPATH,'//*[@id="sparkling-daydream"]/div[1]/div/div[1]/a[2]/div/divxxx')))slider.click()print('yes')except TimeoutException:cs = CrackSlider()cs.get_pic()# 2. 对比图片,计算距离img_jpg_path = 'PTA_A.jpg'  # 读者可自行修改文件路径(我保存的是在本地)img_png_path = 'PTA_B.png'distance = match(img_jpg_path, img_png_path)  # 可以得到需要滑动的值distance = distance + 9  # 距离的进一步特殊处理# 3. 移动cs.crack_slider(distance)finally:self.driver.quit()def add_alpha_channel(img):""" 为jpg图像添加alpha通道 """r_channel, g_channel, b_channel = cv2.split(img)  # 剥离jpg图像通道alpha_channel = np.ones(b_channel.shape, dtype=b_channel.dtype) * 255  # 创建Alpha通道img_new = cv2.merge((r_channel, g_channel, b_channel, alpha_channel))  # 融合通道return img_newdef handel_img(img):"""主要是为了提高图像处理的效率和效果"""imgGray = cv2.cvtColor(img, cv2.COLOR_RGBA2GRAY)  # 转灰度图imgBlur = cv2.GaussianBlur(imgGray, (5, 5), 1)  # 高斯模糊imgCanny = cv2.Canny(imgBlur, 60, 60)  # Canny算子边缘检测return imgCannydef match(img_jpg_path, img_png_path):# 读取图像img_jpg = cv2.imread(img_jpg_path, cv2.IMREAD_UNCHANGED)img_png = cv2.imread(img_png_path, cv2.IMREAD_UNCHANGED)# 判断jpg图像是否已经为4通道(提高去噪效果,支持透明度)if img_jpg.shape[2] == 3:"""如果是三通道就用add_alpha_channel转为4通道"""img_jpg = add_alpha_channel(img_jpg)img = handel_img(img_jpg)small_img = handel_img(img_png)res_TM_CCOEFF_NORMED = cv2.matchTemplate(img, small_img, 3)  # 计算输入图像 img 与模板图像 small_img 的相似度value = cv2.minMaxLoc(res_TM_CCOEFF_NORMED)  # 计算输入图像与模板图像的相似度,并找到相似度最高的区域value = value[3][0]  # 获取到移动距离return valueif __name__ == '__main__':cs = CrackSlider()cs.get_pic()# 2. 对比图片,计算距离img_jpg_path = 'PTA_A.jpg'  # 读者可自行修改文件路径(我保存的是在本地)img_png_path = 'PTA_B.png'distance = match(img_jpg_path, img_png_path)  # 可以得到需要滑动的值distance = distance + 9  # 距离的进一步特殊处理# 3. 移动cs.crack_slider(distance)

这篇关于Selenium+opencv识别有缺口的滑动验证码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/331151

相关文章

如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解

《如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解》:本文主要介绍如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别的相关资料,描述了如何使用海康威视设备网络SD... 目录前言开发流程问题和解决方案dll库加载不到的问题老旧版本sdk不兼容的问题关键实现流程总结前言作为

Java中的Opencv简介与开发环境部署方法

《Java中的Opencv简介与开发环境部署方法》OpenCV是一个开源的计算机视觉和图像处理库,提供了丰富的图像处理算法和工具,它支持多种图像处理和计算机视觉算法,可以用于物体识别与跟踪、图像分割与... 目录1.Opencv简介Opencv的应用2.Java使用OpenCV进行图像操作opencv安装j

SpringBoot整合kaptcha验证码过程(复制粘贴即可用)

《SpringBoot整合kaptcha验证码过程(复制粘贴即可用)》本文介绍了如何在SpringBoot项目中整合Kaptcha验证码实现,通过配置和编写相应的Controller、工具类以及前端页... 目录SpringBoot整合kaptcha验证码程序目录参考有两种方式在springboot中使用k

opencv实现像素统计的示例代码

《opencv实现像素统计的示例代码》本文介绍了OpenCV中统计图像像素信息的常用方法和函数,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 统计像素值的基本信息2. 统计像素值的直方图3. 统计像素值的总和4. 统计非零像素的数量

SpringBoot如何集成Kaptcha验证码

《SpringBoot如何集成Kaptcha验证码》本文介绍了如何在Java开发中使用Kaptcha生成验证码的功能,包括在pom.xml中配置依赖、在系统公共配置类中添加配置、在控制器中添加生成验证... 目录SpringBoot集成Kaptcha验证码简介实现步骤1. 在 pom.XML 配置文件中2.

使用 Python 和 LabelMe 实现图片验证码的自动标注功能

《使用Python和LabelMe实现图片验证码的自动标注功能》文章介绍了如何使用Python和LabelMe自动标注图片验证码,主要步骤包括图像预处理、OCR识别和生成标注文件,通过结合Pa... 目录使用 python 和 LabelMe 实现图片验证码的自动标注环境准备必备工具安装依赖实现自动标注核心

基于Redis有序集合实现滑动窗口限流的步骤

《基于Redis有序集合实现滑动窗口限流的步骤》滑动窗口算法是一种基于时间窗口的限流算法,通过动态地滑动窗口,可以动态调整限流的速率,Redis有序集合可以用来实现滑动窗口限流,本文介绍基于Redis... 滑动窗口算法是一种基于时间窗口的限流算法,它将时间划分为若干个固定大小的窗口,每个窗口内记录了该时间

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

阿里开源语音识别SenseVoiceWindows环境部署

SenseVoice介绍 SenseVoice 专注于高精度多语言语音识别、情感辨识和音频事件检测多语言识别: 采用超过 40 万小时数据训练,支持超过 50 种语言,识别效果上优于 Whisper 模型。富文本识别:具备优秀的情感识别,能够在测试数据上达到和超过目前最佳情感识别模型的效果。支持声音事件检测能力,支持音乐、掌声、笑声、哭声、咳嗽、喷嚏等多种常见人机交互事件进行检测。高效推

opencv 滚动条

参数介绍:createTrackbar( trackbarname , "hello" , &alpha_slider ,alpha_max ,  on_trackbar )  ;在标签中显示的文字(提示滑动条的用途) TrackbarName创建的滑动条要放置窗体的名字 “hello”滑动条的取值范围从 0 到 alpha_max (最小值只能为 zero).滑动后的值存放在