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


猜你喜欢
- 任务描述本次实践是一个多分类任务,需要将照片中的宝石分别进行识别,完成宝石的识别实践平台:百度AI实训平台-AI Studio、Paddle
- vue使用formData传递文件类型的数据1.需求 传递文件类型的数据和其
- 使用的这么长时间的mysql,有一天我突然需要使用mysql 的配置文件my.ini时发现没有这个文件并且这个文件不是被隐藏了。查看自己的m
- 本文为大家分享了mysql 8.0.12的 安装教程,供大家参考,具体内容如下安装教程环境:系统:Windows8.1安装包:mysql-8
- pyecharts介绍pyecharts 是一个用于生成 Echarts 图表的类库。Echarts 是百度开源的一个数据可视化 JS 库。
- 一个有点绕的例子,用PyScripter调试器步进跟踪可以看清楚对 象结构的具体细节。对原作改变了一下,在未定义子对象属性时__getite
- json文件格式这是yolov4模型跑出来的检测结果result.json下面是截取的一张图的检测结果{ "frame_id&qu
- 文字比较难解释,直接看图应该就懂是要做什么了。需求工作中遇到的,需求就是超过四行得有个展开按钮,点击展开显示所有内容,不超过四行的话就不需要
- 守护进程(daemon)是指在UNIX或其他多任务操作系统中在后台执行的电脑程序,并不会接受电脑用户的直接操控。此类程序会被以进程的形式初始
- 前言对于JavaScript程序的调试,相比于alert(),使用console.log()是一种更好的方式,原因在于:alert()函数会
- 我听说在ASP里,可以不用DSN来连接EXCEL,请问如何实现?确实ASP提供了替代DSN的其他方法,甚至可以在运行时建立连接看看下面的范例
- 1 概述1.1 无监督学习 在一个典型的监督学习中,我们有一个有标签的训练集,我们的目标是找到能够区
- /** 2 * 检索数组元素(原型扩展或重载) 3 * @param {o} 被检索的元素值 4 * @type int 5 * @retu
- 目录urllib库urllib.request模块Request对象1 . 请求头添加2. 操作cookie3. 设置代理urllib.pa
- facade模式,即门面模式,也称外观模式,这个模式的核心思想是使用facade对象为外部客户端提供一个统一的访问一组子系统的接口,即客户端
- 注:以下文章原文来自于Dr Charles Severance 的 《Python for Informatics》11.3 组合查询和抽取
- PYTHON首先要安装scapy模块PY3的安装scapy-python3,使用PIP安装就好了,注意,PY3无法使用pyinstaller
- 上个版本的Python OpenCV图片局部区域像素值处理,虽然实现了我需要的功能,但还是走了很多弯路,我意识到图片本就是数组形式,对于8位
- 工作需要开始学Perl,下载个Window版(5.16)的: 下载链接 http://www.activestate.com/activep
- 本文实例讲述了JavaScript简单获取页面图片原始尺寸的方法。分享给大家供大家参考,具体如下:这里通过Image()对象获取原始宽高这种