声明:本文只作学习研究,禁止用于非法用途,否则后果自负,如有侵权,请告知删除,谢谢!
今天为大家讲解一下如何通过OpenCV图像识别库破解滑块验证码
此方法能够为一下情景使用:
已处理的案例:头号、京、抖*、企*号等
selenium 支持 python2.7 以及 python3.5 等主流 python 版本,其安装较为简单,有网的环境下,打开cmd输入即可自动安装: pip install selenium
selenium 安装完成后,下载所选浏览器的 webdriver,本文以 ChromeDriver为例,下载解压后切记将.exe文件放入对应Python应用程序的同级目录下,以确保将 webdriver 的路径添加至系统 PATH 变量中。同时还需将.exe文件放入Chrome应用程序的同级目录下,注意下载的ChromeDriver版本需与Chrome浏览器版本对应才可使用。ChromeDriver下载地址
在计算机视觉项目的开发中,OpenCV作为较大众的开源库,拥有了丰富的常用图像处理函数库,采用C/C++语言编写,可以运行在Linux/Windows/Mac等操作系统上,能够快速的实现一些图像处理和识别的任务。此外,OpenCV还提供了Java、python、cuda等的使用接口、机器学习的基础算法调用,从而使得图像处理和图像分析变得更加易于上手,让开发人员更多的精力花在算法的设计上。
pip install opencv-python
pip install opencv-python==3.3.0.10 -i https://pypi.doubanio.com/simple
def slider_verify(self):
# 根据偏移量和手动操作模拟计算移动轨迹
try_verify = 0
SigninPage = self.driver.current_url
while try_verify >= 10:
try:
time.sleep(random.uniform(4, 6))
CurrentPage = self.driver.current_url
if SigninPage != CurrentPage:
print("slider verify success")
time.sleep(5)
break
# 获取背景图片元素
target = self.driver.find_element_by_xpath('//img[@id="captcha-verify-image"]')
# 获取滑块图片元素
template = self.driver.find_element_by_xpath(
'//*[@id="sdk-login-box-slide-container"]/div/div[2]/img[2]')
image_background = target.get_attribute('src') # 获取背景元素下载路径
image_slider = template.get_attribute('src') # 获取滑块元素下载路径
# request请求图片路径保存为二进制格式,并将其存为图片保存到本地
res_background = requests.get(image_background)
tth_background = res_background.content
with open('./background.png', 'wb')as f:
f.write(tth_background)
res_slider = requests.get(image_slider)
tth_slider = res_slider.content
with open('./slider.png', 'wb')as f:
f.write(tth_slider)
time.sleep(random.uniform(2, 4))
except Exception as error:
print("储存图片出错", error)
pass
# 通过open-cv计算背景片偏移量
distance = self.find_pic()
# calculate the scale
img = cv2.imread('./background.png') # imread函数有两个参数,第一个参数是图片路径,第二个参数表示读取图片的形式
# 获取实际页面上背景图片的长度
w1 = img.shape[1]
w2 = target.size['width']
# 本地的图片尺寸和网页的尺寸计算出缩放比例,再把原本计算出的偏移进一步计算就可以得出网页上的偏移距离
distance = distance * w2 / w1
distance = int(distance)
print('distance:{} ,{} times to try'.format(distance, try_verify + 1))
self.slide_by_pyautogui(x=820, y=677, offset=distance) # 滑块的坐标与实际偏移量
try_verify += 1
def find_pic(self, target='./background.png', template='./slider.png'):
try:
# 比较图片以找出距离
# 读取背景图片
target_rgb = cv2.imread(target)
# 灰度处理
target_gray = cv2.cvtColor(target_rgb, cv2.COLOR_BGR2GRAY)
# 读取滑块图片
template_rgb = cv2.imread(template, 0)
# 比较位置
res = cv2.matchTemplate(target_gray, template_rgb, cv2.TM_CCOEFF_NORMED)
# 获得结果
distance = cv2.minMaxLoc(res)
return distance[2][0]
except Exception as error:
print('破解函数出错')
print(error)
由于某东的登陆滑块含有人工智能算法识别,因此该方法能成功绕过识别!如果没有识别的情况下利用普通的滑动算法也是可以的。
def slide_by_pyautogui(self, x, y, offset):
"""
slide by pyautogui
:param x: X轴起始位置
:param y: Y轴起始位置
:param offset: 实际移动距离
"""
# 人工智能拟人滑动算法,结合Opencv的成功率,目前有80%的成功率
xx = x + offset
pyautogui.moveTo(x, y, duration=2.3)
pyautogui.mouseDown()
y += random.randint(9, 19)
pyautogui.moveTo(x + int(offset * random.randint(15, 23) / 20), y, duration=2.4)
y += random.randint(-9, 0)
pyautogui.moveTo(x + int(offset * random.randint(17, 21) / 20), y, duration=(random.randint(20, 31)) / 100)
pyautogui.moveTo(xx, y, duration=1.8)
pyautogui.mouseUp()
完整的代码需要关注微信公众号【城东书院】(直接扫码)发送消息:opencv破解滑块验证码后台会自动回复。