使用 Python+Selenium 破解滑块验证码
开发工具
Python版本:3.6.4
相关模块:
pillow模块;
selenium模块;
numpy模块;
以及一些Python自带的模块。
其他:
chromedriver
环境搭建
安装Python并添加到环境变量,pip安装需要的相关模块即可。
实战记录
本文将记录一次春秋航空的会员注册页面所使用的滑块验证码破解过程,地址为:
https://account.ch.com/NonRegistrations-Regist
一. 验证码简介
验证码,即 CAPTCHA,全自动区分计算机和人类的公开图灵测试,换而言之,验证码是一种用于区分人类与计算机的测试,只有通过了 CAPTCHA,当前用户才被认为是人类。
二.破解滑块验证码
滑块验证码,即用户使用鼠标将滑块从某个位置拖动到另一个位置,服务器通过用户拖动滑块的轨迹来判断当前用户是否为人类。本文将尝试破解的是一种拼图式的滑块验证码:
首先,我手动完成了一次滑块验证码的验证,想看看需要向服务器端发送什么请求才算是通过了验证,随便点开了一个,发现请求需要的参数是这样的:
搞清楚每个参数当然是可以的,但大夏天的实在没有这个耐心,而且万一过几天验证码的版本又升级了呢?岂不是透心凉。罢了罢了,安心当个咸鱼吧,反正是自己玩,没有环境等因素限制,用Selenium 算了吧。那么问题来了,如何用 Selenium 破解滑块验证码呢?简单想了一下,感觉应该是这样的:
首先,利用图像处理技术计算滑块到缺口的距离。然后,利用机器以与人类行为相似的方式将滑块拖到缺口位置,完成验证。
OK,有了大致思路,就可以开始干活了!
2.1 计算滑块到缺口的距离
首先,我们利用 Selenium 进入滑块验证码界面:
也就是这个界面:
那么滑块到缺口的距离该如何计算呢?
之前看到很多人是这么算的:
出现滑块验证码界面时对屏幕进行截图(此时背景图是完整的),然后模拟点击滑动圆球,使滑块和缺口出现(此时背景图是有缺口的),此时再次截图,通过对比两次截图即可轻松地找到缺口位置。
但是,此方案的前提是在点击滑动圆球之后才出现滑块和缺口,点击之前是完整的背景图。这个方案在不久前还是可行的,但是魔高一尺道高一丈,数天前滑块验证码版本升级了!!!滑块验证码直接显示滑块和缺口了!!!也就是不给你看原图了。
这该如何是好呢?边缘检测?机器学习?
试了两分钟 Canny 算子,感觉效果很差,果断放弃了边缘检测,准备投入机器学习的怀抱。
既然准备用机器学习,算法先不考虑,总得先有训练数据吧,于是我手动刷新了几次,想研究一下验证码图片该如何获取,实在不行就手动保存个几百张。可一刷新,发现了一件了不起的事情,这网站滑块验证码的背景图只有四张!!!这也太可爱了吧。
根本不需要爬验证码,手工标注,然后训练了。或许有人会问,为什么呢?
因为就四张背景图啊!!!你完全可以这样:
对当前的滑块验证码界面进行截图,与对应的完整背景图进行对比,找到缺口位置,即可计算出滑块到缺口的距离了(滑块初始位置的横坐标是固定的)。
上述方案有如下两个问题:
(1)如何获取完整的背景图?
答案:当你完成滑块验证码的验证时,还是会出现对应的完整背景图的,通过截屏软件截下图就好了。
结果如下:

(2)怎么找到当前滑块验证码对应的完整背景图?
答案:因为只有四张图,没必要用一些高大上的图像匹配算法,看了下四张图左上角顶点处的像素值,其中R值分别为:255,217,227,100,显然,通过对比背景图左上角顶点处的像素值即可找到当前滑块验证码对应的完整背景图了,代码实现如下:
注意,因为截图是这样子的:
所以验证码背景图左上角顶点处的坐标会随着电脑和截屏方式的改变而改变(具体而言,Selenium和我电脑上的截屏软件截出来的图,验证码背景图的位置坐标是不一样的,需要通过画图软件确定具体位置)。
所以如果你无法用我的代码完成滑块验证码破解的话,请自行修改(787, 282)和(787, 293)为适合你自己电脑实际情况的坐标值。
接下来,我们就可以计算滑块到缺口的距离了!
先截取当前滑块验证码界面,代码实现如下:
这里我们把滑块先移动到最右端再截图,否则滑块将影响当前验证码界面与对应的完整背景图之间的像素对比(即第一次找到的像素差异较大点在滑块上而不是在期望的缺口上)。
然后通过与对应的完整背景图进行像素值对比,找到缺口位置,即可计算出滑块到缺口的距离了(因为滑块初始位置的横坐标是固定的):
2.2 将滑块拖到缺口位置
接下来,我们需要利用机器以与人类行为相似的方式将滑块拖到缺口位置,完成验证。
一般而言,人手工拖动滑块的轨迹是这样的:
即:先快速向右拖动,快到缺口时,再减速慢调。那么这样的轨迹该如何生成呢?
我想了两种方案:
方案一是根据物理学中的加速度减速度来模拟拖动滑块的轨迹,代码实现如下:
方案二是直接构造一些函数来模拟拖动滑块的轨迹,函数代码实现如下:
最后,使用 Selenium 按照设定的轨迹将滑块移动到缺口处即可:
That'all~
效果展示:https://v.qq.com/x/page/s134539448s.html
代码截止2018-07-29测试无误。
关注微信公众号“Charles的皮卡丘”回复‘滑块验证码’获取资料。
原文链接:http://t.cn/Rel1VAc
51Reboot 最新课程公告
第 19 期Python实战班正在火热招生中
第 8 期自动化运维班正在招生中
详情扫码咨询
使用 Python+Selenium 破解滑块验证码的更多相关文章
- 使用Python + Selenium破解滑块验证码
在前面一篇博客<使用 Python + Selenium 打造浏览器爬虫>中,我介绍了 Selenium 的基本用法和爬虫开发过程中经常使用的一些小技巧,利用这些写出一个浏览器爬虫已经完全 ...
- Python Selenium Cookie 绕过验证码实现登录
Python Selenium Cookie 绕过验证码实现登录 之前介绍过博客园的通过cookie 绕过验证码实现登录的方法.这里并不多余,会增加分析和另外一种方法实现登录. 1.思路介绍 1.1. ...
- python+selenium破解极验验证登录
1.前言: 目前很多网站会在正常的账号密码认证之外加一些验证码,以此来明确区分人/机行为,最典型的就是极验滑动验证.(如下图) 这里我们以简单实例说明如何实现自动校验类似验证. 2.步骤: 1)点击验 ...
- Python脚本破解图形验证码(tesserocr和pytesseract)
在学习之前,我们先了解OCR.tesseract.tesserocr.pytesseract和opencv这几个跟图片处理有关的库. OCR(Optical Character Recognition ...
- selenium破解数字验证码
搞了半天,总算弄出来了,识别率还可以,普通的数字验证码 from selenium import webdriver from PIL import Image import pytesseract ...
- python+selenium进行简单验证码获取
# _*_ coding:utf-8 _*_from PIL import Imagefrom selenium import webdriverimport pytesseractimport ti ...
- python+selenium识别图片验证码
import timeimport pytesseractfrom PIL import Image, ImageEnhancefrom selenium import webdriver url = ...
- python+selenium滑动式验证码解决办法
from selenium.webdriver import ActionChains action = ActionChains(driver) source=driver.find_element ...
- python3 破解 geetest(极验)的滑块验证码
Kernel_wu 快速学习的实践者 python3 破解 geetest(极验)的滑块验证码 from selenium import webdriver from selenium.webdriv ...
随机推荐
- 微信自定义菜单的emoji图标
微信公众号自定义菜单添加emoji表情图标 第一步:打开微信公众平台接口调试工具,点击前往接口调试工具: 第二步:把这段代码 {"button":[{"sub_butt ...
- UNIX高级环境编程(1)File I/O
引言: Unix系统中主要的文件操作包括: open read write lseek close unbuffered IO和standard I/O相对应,后面的章节我们会讨论这两者的区别. 在讨 ...
- spring中MessageSource的配置使用方法3--ResourceBundleMessageSource【转】
本文转载仅供自己学习收录,不做任何商业用途,如有需要请访问原地址:http://blog.csdn.net/qyf_5445/article/details/8124431 ApplicationCo ...
- 看懂shebang吧,只需一点点shell知识,从此再也不犯强迫症
Python2: 开启一个terminal,输入下面命令: yshuangj@ubuntu:~$ vim helloA.py 在vim编辑器中,进入编辑模式(按i),输入下面的代码,然后退出编辑模式( ...
- Day1 Spring初识(一)
在网上看到一篇文章,感觉写得挺不错的,转载一下,本文转载自:http://www.cnblogs.com/xdp-gacl/p/3707631.html和http://www.cnblogs.com/ ...
- 一个简单的统计问题(解决方案:Trie树)
题目如图 输入几个不重复的单词和几个前缀,分别统计出单词中包含前缀的个数. Trie树 这个题目用到了 Trie 树.它在百度百科中的定义如下:在计算机科学中,Trie,又称字典树.单词查找树 ...
- virtualbox+vagrant学习-4-Vagrantfile-5-Machine Settings
Machine Settings 配置命名空间:config.vm config.vm的设置将修改vagrant管理的机器的配置 Available Settings可用设置 config.vm.ba ...
- Python Flask高级编程
第1章 课程导语介绍课程的内容1-1 开宗明义 试看1-2 课程维护与提问 第2章 Flask的基本原理与核心知识本章我们首先介绍Python官方推荐的最佳包与虚拟环境管理工具:Pipenv.接着我们 ...
- ZCMU 1019: 分金币
解题思路: 附上刘汝佳老师的解题过程: 首先最终每个人的金币数量可以计算出来,它等于金币总数除以人数n.接下来用M来表示每个人最终拥有的金币数. 现在假设编号为 i 的人初始有Ai 枚金币,对于1号来 ...
- SQL进阶语法的多表操作
AS别名 多张表联合操作,如果表多,字段名长,不方便阅读.这里我们可以使用 as 关键字来对字段名设置别名. as也可以省略,看个人喜好,在这里我还是支持把 as 写上,这样我们在面对复杂的SQL ...