python完成滑动拼图验证码破解

8 篇文章 0 订阅
5 篇文章 0 订阅

滑动拼图验证码是滑动验证码的进阶版,主要是多了缺口位置,需要我们准确定位缺口位置,并将滑动按钮移动到相应的位置,滑动拼图验证分为两种,一种是能用元素选择工具定位缺口位置的,一种是无法用元素选择工具定位的缺口位置的,能够用元素选择工具选中缺口的滑动拼图验证,其原理与之前的滑动验证差别不大,思路为:定位滑动按钮大小,定位缺口位置,相减后利用selenium移动,完成验证。
本次,我们主要完成的是无法用元素选择工具定位的滑动拼图验证。
面对无法用元素选择工具定位的滑动拼图,我们使用的是PIL库的ImageChops对图像进行对比,以此确定定位缺口位置,首先,我们获取原始图片和缺口图片以便对它们进行对比,代码如下:

browser.find_element(by=By.XPATH,value='//*[@id="jigsawCanvas"]').screenshot('origin.png')  # 获取原始图片

slider = browser.find_element(by=By.XPATH,value='//*[@id="jigsawCircle"]')  # 获取滑动按钮
slider.click()  # 先模拟点击下,方便下面获取到有缺口的图片
browser.find_element(by=By.XPATH,value='//*[@id="jigsawCanvas"]').screenshot('after.png')  # 获取有缺口的图片

之后我们通过PIL库的ImageChops的difference方法识别两张图片的区别并通过getbbox()函数返回坐标位置,以此确定缺口元素坐标,代码如下:

image_a = Image.open('origin.png').convert('RGB')  # 打开原始图片
image_b = Image.open('after.png').convert('RGB')  # 打开有缺口的图片
x = ImageChops.difference(image_a, image_b).getbbox()  # 比较两个图片的差别
print(x)  # 举个例子:倘若x为:(226, 103, 277, 154);返回缺口对应的左边横坐标(由左往右看),上边纵坐标(由上往下看),右边横坐标,下边纵坐标
distance = x[0]  # 第一个元素x[0]表示的就是缺口左边横坐标,也就是滑块需要移动的距离
print(distance)  # 如果例子为:(226, 103, 277, 154),那么需要移动的距离为226

获取到坐标后我们只需让他与滑动按钮相减确定滑动距离后利用selenium操纵鼠标滑动按钮即可完成验证,完整代码如下:

from selenium import webdriver
import os
import time
from PIL import Image, ImageChops
from selenium.webdriver.common.by import By

# 1.访问网址
browser = webdriver.Chrome()
# url = r'E:\验证码反爬\高级滑动拼图验证码\index.html'  # 自己用的话可以直接写这样的固定路径
current_dir = os.path.dirname(os.path.abspath(__file__))  # 获取代码所在的文件夹目录
url = current_dir + '/index.html'  # 获取HTML文件的文件绝对路径
print('此时的文件路径为:' + url)  # 打印此时的文件路径,所以如果文件位置固定,可以直接写url = r'文件路径'
browser.get(url)  # 访问网址
time.sleep(2)

# 2.获取原始图片
browser.find_element(by=By.XPATH,value='//*[@id="jigsawCanvas"]').screenshot('origin.png')  # 获取原始图片

# 3.获取有缺口的图片
slider = browser.find_element(by=By.XPATH,value='//*[@id="jigsawCircle"]')  # 获取滑动按钮
slider.click()  # 先模拟点击下,方便下面获取到有缺口的图片
browser.find_element(by=By.XPATH,value='//*[@id="jigsawCanvas"]').screenshot('after.png')  # 获取有缺口的图片

# 4.比较两幅图片的区别,获取需要移动的距离
image_a = Image.open('origin.png').convert('RGB')  # 打开原始图片
image_b = Image.open('after.png').convert('RGB')  # 打开有缺口的图片
x = ImageChops.difference(image_a, image_b).getbbox()  # 比较两个图片的差别
print(x)  # 举个例子:倘若x为:(226, 103, 277, 154);返回缺口对应的左边横坐标(由左往右看),上边纵坐标(由上往下看),右边横坐标,下边纵坐标
distance = x[0]  # 第一个元素x[0]表示的就是缺口左边横坐标,也就是滑块需要移动的距离
print(distance)  # 如果例子为:(226, 103, 277, 154),那么需要移动的距离为226

# 5.开始滑动!
action = webdriver.ActionChains(browser)  # 启动Selenium的动作链
action.click_and_hold(slider).perform()  # 按住滑动按钮不松开
action.move_by_offset(distance-10, 0)  # 开始滑动!这里-10,是把初始圆角矩形左侧left属性值给减去了,这样更准确
action.release().perform()  # 释放滑块
  • 1
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值