python滑块验证码的破解实现
作者:我爱静静 发布时间:2023-11-27 11:46:17
标签:python,滑块验证码
破解滑块验证码的思路主要有2种:
获得一张完整的背景图和一张有缺口的图片,两张图片进行像素上的一一对比,找出不一样的坐标。
获得一张有缺口的图片和需要验证的小图,两张图片进行二极化以及归一化,确定小图在图片中间的坐标。
之后就要使用初中物理知识了,使用直线加速度模仿人手动操作
本次就使用第2种,第一种比较简单。废话不多说,直接上代码:
以下均利用无头浏览器进行获取
获得滑块验证的小图片
def get_image1(self,driver):
"""
获取滑块验证缺口小图片
:param driver:chrome对象
:return:缺口小图片
"""
canvas = driver.find_element_by_xpath("//div[@id='xy_img']").get_attribute("style")
image_data=re.findall("data:image/jpg;base64,(.*?)\"\)",canvas)[0]
# print(image_data)
binary_image_data=base64.b64decode(image_data,'-_')
file_like=BytesIO(binary_image_data)
image=Image.open(file_like)
return image
一般来说,这张小图片都是独立的,比较好获取,图片如下:
获得滑块验证的背景图片
!!!这个背景图片网页一般会返回乱序的图片,然后通过js对图片进行重新排序,要破解需要的时间较多,且每个js排序算法不一样,不具有复用性。这里就取了个巧,直接对当前浏览器截屏,然后在截取指定范围图片。
def get_image2(self,driver):
"""
获取滑块验证码背景图片
:param driver:chrome对象
:return:背景图片
"""
driver.save_screenshot('yanzhengma.png')
# 通过图片元素节点获取坐标值
# element = driver.find_element_by_id("bgImg")
# left = element.location['x']
# top = element.location['y']
# right = element.location['x'] + element.size['width']
# bottom = element.location['y'] + element.size['height']
# 通过画图软件直接获取相应图片的坐标值
left=359
top=238
right=658
bottom=437
# print((left, top, right, bottom))
im = Image.open('yanzhengma.png')
im = im.crop((left, top, right, bottom))
return im
图片如下:
轨迹计算方法
def get_track(self, distance):
"""
根据偏移量获取移动轨迹
:param distance:偏移量
:return:移动轨迹
"""
# 移动轨迹
track = []
# 当前位移
current = 0
# 减速阈值
mid = distance * 4 / 5
# 计算间隔
t = 0.2
# 初速度
v = 0
while current < distance:
if current < mid:
# 加速度为正2
a = 2
else:
# 加速度为负3
a = -3
# 初速度v0
v0 = v
# 当前速度v = v0 + at
v = v0 + a * t
# 移动距离x = v0t + 1/2 * a * t^2
move = v0 * t + 1 / 2 * a * t * t
# 当前位移
current += move
# 加入轨迹
track.append(round(move))
return track
验证主程序
def slider_verification_code(self,driver,cnt):
"""
破解滑块验证主程序
:param driver:chrome对象;cnt:已验证次数
:return:已验证次数
"""
print("出现滑块验证,验证中")
# 1、出现滑块验证,获取验证小图片
picture1 = self.get_image1(driver)
picture1.save("./picture1.png")
# 2、获取有缺口验证图片
picture2 = self.get_image2(driver)
picture2.save("./picture2.png")
#二值化图片,进行对比,输出匹配的坐标系
target_rgb=cv2.imread("./picture2.png")
target_gray=cv2.cvtColor(target_rgb,cv2.COLOR_BGR2GRAY)
template_rgb=cv2.imread("./picture1.png",0)
res=cv2.matchTemplate(target_gray,template_rgb,cv2.TM_CCOEFF_NORMED)
value=cv2.minMaxLoc(res)
value = value[3][0]
cnt += 1
print("需要位移的距离为:"+str(value)+",已验证"+str(cnt)+"次")
#根据距离获取位移的轨迹路线
track=self.get_track(value)
time.sleep(1)
ActionChains(driver).click_and_hold(driver.find_element_by_class_name("handler.handler_bg")).perform()
for x in track:
ActionChains(driver).move_by_offset(xoffset=x, yoffset=0).perform()
time.sleep(0.5)
ActionChains(driver).release().perform()
return cnt
看!有 飞 机:
来源:https://segmentfault.com/a/1190000020955506
0
投稿
猜你喜欢
- 先装 MYSQL 的 ODBC 驱动然后'connect to MySQL server&n
- XPath(XML Path language)是一种处理XML文档段的语言。XSLT(Extensible Stylesheet Lang
- 你用过css么?当然,我是指你喜欢做网页的话,用过?很好,那你用过它的特效么?没有?那请跟我来。让我先通俗的介绍一下css,cs
- 如何提高SQL Server数据库的性能,该从哪里入手呢?笔者认为,该遵循从外到内的顺序,来改善数据库的运行性能。如下图: 第一层
- 开发web应用程序是一件非常辛苦的事情,你需要花大把大把的时间来做无数的事情。假如你不运用有条理的方法,尤其是在复杂的项目中,你会承受忽视项
- 正则表达式(Regular Expression)为字符串模式匹配提供了一种高效、方便的方法。几乎所有高级语言都提供了对正则表达式的支持,或
- 有没有办法更快一点? 有没有办法一次性收缩所有数据库? 代码如下:alter database 数据库名 set recovery simp
- 本文实例讲述了Golang算法问题之数组按指定规则排序的方法。分享给大家供大家参考,具体如下:给出一个二维数组,请将这个二维数组按第i列(i
- SQL Server数据库涉及到的数据仓库概念:1.多维数据集:多维数据集是联机分析处理 (OLAP) 中的主要对象,是一项可对数据仓库中的
- 在学习与运用ASP中,response对象涉及到的方面也比较多,想全部都掌握也并非一两天的事,我也是最近才发现response对象中居然有这
- Linux Journal 发表了一篇优化 Oracle 数据库的文章,感觉十分的有用。简要介绍其摘要和大家共同分享 Linux 在企业级数
- SQL SERVER数据存储的形式在谈到几种不同的读取方式之前,首先要理解SQL SERVER数据存储的方式.SQL SERVER存储的最小
- 有时候让了解放双手,让电脑来帮我们自动发一些我们想要发的消息,挺省力的,比如说白天写好了演讲稿,晚上要在群里进行文字演讲,那么我们就可以用脚
- 最近一直忙,我们的注册页面还是在持续优化。今天抽时间分析了下数据,依然以主注册表单为例,对表单里3个区块、9个字段做了个小小出错排行;看看哪
- 一. 建库,建表,加约束. 1.1建库 代码如下:use master go if exists (select * from sysdat
- 实例如下所示:#!/usr/bin/python# -*- coding: UTF-8 -*-import reimport urllib,
- 目录前言1. 使用Lambda来修改Pandas数据框中的值2. 使用f-string来连接字符串3. 用Zip()函数对多个列表进行迭代4
- 问题描述时间在我们日常的代码编写中会是经常出现的筛选或排序条件,尤其是一些特殊时间节点的时间显得尤为突出,例如昨天,当前日期,当前月份,当前
- JSON 基础简单地说,JSON 可以将 JavaScript 对象中表示的一组数据转换为字符串,然后就可以在函数之间轻松地传递这个字符串,
- Microsoft SQL Server 2005 Mobile Edition 3.0 (SQL Server Mobile) 支持两种与