滑动拼图验证码是滑动验证码的进阶版,主要是多了缺口位置,需要我们准确定位缺口位置,并将滑动按钮移动到相应的位置,滑动拼图验证分为两种,一种是能用元素选择工具定位缺口位置的,一种是无法用元素选择工具定位的缺口位置的,能够用元素选择工具选中缺口的滑动拼图验证,其原理与之前的滑动验证差别不大,思路为:定位滑动按钮大小,定位缺口位置,相减后利用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()  # 释放滑块

python完成滑动拼图验证码破解相关推荐

  1. 爬虫之极验验证码破解-滑动拼图验证码破解

    滑动拼图验证码破解 前言 步骤分析 第一步,获取原图 第二步 拼接图片 第三步 计算豁口所在位置 第四步 计算拖动距离 模拟拖动 其他 前言 滑动验证码已经流行很多年了,我们在这里尝试一下如何实现滑动 ...

  2. Python实战 | 滑块拼图验证码高级版详解

    目录 1.如何实现滑块拼图验证码高级版? 2.HTML代码: 3.Python代码: 4.执行后报错,解决方案: 5.完整代码,修改后如下: 1.如何实现滑块拼图验证码高级版? 2.HTML代码: & ...

  3. 滑动拼图验证码操作步骤:_拼图项目:一个不完整的难题

    滑动拼图验证码操作步骤: 马克·雷因霍尔德(Mark Reinhold)最近提议延迟Java 9,以花更多的时间完成项目Jigsaw,这是即将发布的版本的主要功能. 虽然这个决定肯定会使Java的厄运 ...

  4. 滑动拼图验证码操作步骤:_拼图项目:延期的后果

    滑动拼图验证码操作步骤: Mark Reinhold先生于2012年7月宣布 ,他们计划从Java 8撤消Jigsaw项目 ,因为Jigsaw计划于2013年9月(从现在开始一年)推迟其发布. 这个日 ...

  5. uniapp、vue实现滑动拼图验证码

    实际开发工作中,在登陆的时候需要短信验证码,但容易引起爬虫行为,需要用到反爬虫验证码,今天介绍一下拼图验证码,解决验证码反爬虫中的滑动验证码反爬虫. 原理 滑动拼图验证码是在滑块验证码的基础上增加了一 ...

  6. js php滑动拼图解锁,js 滑动拼图验证码

    以前的验证码很简单,就是一个带些背景色或背景图和干扰线的纯数字字母类的验证码,现在已经发展变得很丰富了.我见过的就有好几种:纯字母数字类,数学计算类,依次点击图片上的文字类,从下列图片列表里选取符合描 ...

  7. 滑动拼图验证码 免费 java_js+canvas实现滑动拼图验证码功能

    上图为网易云盾的滑动拼图验证码,其应该有一个专门的图片库,裁剪的位置是固定的.我的想法是,随机生成图片,随机生成位置,再用canvas裁剪出滑块和背景图.下面介绍具体步骤. 首先随便找一张图片渲染到c ...

  8. Android 滑动拼图验证码控件

    Android 滑动拼图验证码控件 简介: 很多软件为了安全防止恶意攻击,会在登录/注册时进行人机验证,常见的人机验证方式有:谷歌点击复选框进行验证,输入验证码验证,短信验证码,语音验证,文字按顺序选 ...

  9. 小视频app源码,Android 滑动拼图验证码控件

    小视频app源码,Android 滑动拼图验证码控件 代码实现: 滑块视图类:SlideImageView.java.实现小视频APP源码随机选取拼图位置,对拼图位置进行验证等功能. public c ...

  10. php滑动拼图验证,JS怎么实现滑动拼图验证码

    这次给大家带来JS怎么实现滑动拼图验证码,JS实现滑动拼图验证码的注意事项有哪些,下面就是实战案例,一起来看一下. 上图为网易云盾的滑动拼图验证码,其应该有一个专门的图片库,裁剪的位置是固定的.我的想 ...

最新文章

  1. iOS 开发 OC编程 字典和集合 排序方法
  2. python 调用linux命令-python3调用linux命令——Subprocess
  3. MySQL高级知识(十五)——主从复制
  4. ospf序列号等问题
  5. golang type 说明和使用
  6. Kafka系列之-Kafka监控工具KafkaOffsetMonitor配置及使用
  7. Spark学习-SparkSQL--04-SparkSQL CLI 单节点运行与yarn集群运行
  8. 对称加密和非对称加密转载
  9. iOS开发——自定义下拉框
  10. SQL2005中row_number( )、rank( )、dense_rank( )、ntile( )函数的用法(2)
  11. 网优5g前景_网优行业的吐槽,附吐槽记录
  12. Swing 显示良好JPanel保存为图片
  13. 7 centos 查看程序文件数量_MongoDB最大连接数(centos7应用程序最大打开文件数)设置失效的异常分析过程与解决方法...
  14. Python实现桌面程序:PyQt5 + QtDesigner -- 界面设计与逻辑编写
  15. 解决“配置系统未能初始化”异常
  16. 欢迎中文社区新版主@刘文艺
  17. 巴比特独家丨从0.06%飙涨到30%,BAT在Compound的利率飙涨背后实际危机四伏
  18. DataSource和SessionFactory的区别
  19. 金融行业IT运维现状问题和发展方向
  20. 【论文笔记】Towards Privacy-Preserving Affect Recognition: A Two-Level Deep Learning Architecture

热门文章

  1. 阿里海量大数据平台的运维智能化实践
  2. 微信中调用扫一扫最简便的方法 5行代码实现H5扫一扫 HTML5扫二维码最简便的办法
  3. EXCEL保存“加载宏”
  4. mouseenter和mouseleave跟mouseover和mouseout
  5. 2019年最新web前端笔试题
  6. 微信公众号php支付设置回调,php微信公众号支付讲解(JSAPI)
  7. SPSS调节效应分析插件 v1.1.1
  8. 数字城市新型基础设施——打造以“运营与安全并重”为特色的新型数字空间
  9. 任玉刚【Android开发艺术探索】读后笔记一
  10. 元分析教程 | 手把手教你使用CMA 2.0