滑动验证码最简单案例:破解qq空间(豆瓣网)滑块验证码(python+selenium实现) 您所在的位置:网站首页 qq空间登录界面图片 滑动验证码最简单案例:破解qq空间(豆瓣网)滑块验证码(python+selenium实现)

滑动验证码最简单案例:破解qq空间(豆瓣网)滑块验证码(python+selenium实现)

2024-06-11 09:00| 来源: 网络整理| 查看: 265

破解qq空间(豆瓣网)滑块验证码 环境搭建 1、安装chrome浏览器和chromedriver

chromedriver下载连接:淘宝镜像 注意 :chromedriver的版本要与你使用的chrome版本对应 下载完成后将chromedriver.exe文件放到python.exe同一目录下。 在这里插入图片描述

2、搭建selenium环境

打开cmd,用命令直接安装

pip install selenium

然后在pycharm中的file–>settings–>project interpreter 中点击**+**号引入selenium包。 在这里插入图片描述 如果引入包后仍然报错,可以参考:关于pip安装第三方库,但PyCharm中却无法识别的问题

3、环境测试 from selenium import webdriver # 导入webdriver包 driver = webdriver.Chrome() # 初始化一个火狐浏览器实例:driver driver.maximize_window() # 最大化浏览器 driver.get("https://www.baidu.com") # 通过get()方法,打开一个url站点

如果成功打开百度,说明环境已经搭好!

滑块验证码破解思路 计算滑块需要滑动的距离

1、方法一:对比缺口图片和原图的像素值 这个方法的关键在于如何获取到原图。一般情况下我们打开浏览器的开发者模式,可以直接定位到验证码图片的位置。根据图片的呈现方式,我大概分为两种情况:一种是使用img标签呈现,这种方式一般会把图片的路径(qq空间、豆瓣网等)或者经过加密后(京东)放入到标签中,而另一种是使用canvas呈现,这种方式就需要通过修改canvas中的display属性来呈现单独的图片,但是我们无法直接通过路径去获取图片,只能通过截图的方式。(例如:极验的滑块验证码) 2、方法二:使用opencv方法处理缺口图片 就是将缺口图片处理成黑白图片,然后再计算缺口的距离。具体请参考opencv破解滑块验证码

滑块按照怎样的轨迹滑动

1、直接匀速滑动(适用没有使用机器学习验证的网站:qq空间、豆瓣网等) 2、模拟人的动作按照先匀加速,后匀减速滑动,最后多滑一段距离再退回来。(适用于使用机器学习验证的网站:极验、京东等)具体请问度娘。

实现

 本次要讲的是方法一破解qq空间验证码,也是最简单的方法。(豆瓣网的原理一模一样,甚至连验证码图片都是一样的,不难猜测应该是使用了同样的验证码接口)方法一的关键在于我们怎么得到验证码的原图,我们把这个问题解决了其他的都好办了!  首先我们进入qq空间登录界面,随便输入一个qq号和密码点击登录按钮就会弹出滑块验证码,只能是电脑没有记录的才行。然后跳转到控制台–>element,我们可以很容易找到缺口图片和滑块图片,但是怎么也无法找到完整图片,很头疼吧! 在这里插入图片描述  别放弃,我们继续在控制台中找到network,再选择img,我们又发现了之前的两张图片,我们双击图片把图片路径复制下来分析一下。在这里插入图片描述 发现缺口图片路径:index=1&image=*********,&img_index=1&subsid=3。 滑块图片路径:index=2&image=*********,&img_index=2&subsid=3。 于是尝试修改两个index等于0,再访问图片路径,奇迹出现了,我们得到原图的路径,这样问题不就解决了吗? 在这里插入图片描述  获取缺口图片和原图代码实现如下:

def get_img(self): """ 获取验证码阴影图和原图 :return: """ self.driver.switch_to.frame('tcaptcha_iframe') time.sleep(3) # 获取有阴影的图片 src = self.driver.find_element_by_id('slideBg').get_attribute('src') # 分析图片地址,发现原图地址可以通过阴影图地址改动获取 只需要修改一下图片路径中的index #print(src) src_bg=src.replace('index=1','index=0') src_bg=src_bg.replace('img_index=1','img_index=0') #print(src_bg) # 将图片下载到本地 urlretrieve(src, 'img1.png') urlretrieve(src_bg, 'img2.png') #读取本地图片 captcha1 = Image.open('img1.png') captcha2 = Image.open('img2.png') return captcha1, captcha2

 得到两张图片之后,我们是不是就可以直接进行比较计算出缺口的距离的呢?按道理没错,但是这里有一个比较坑的地方就是我们下载下来的图片比网站中的图片要大,所以我们必须将图片缩小之后再进行计算。具体代码如下:

def resize_img(self, img): """ 下载的图片把网页中的图片进行了放大,所以将图片还原成原尺寸 :param img: 图片 :return: 返回还原后的图片 """ # 通过本地图片与原网页图片的比较,计算出的缩放比例 原图(680x390)缩小图(280x161) a = 2.428 (x, y) = img.size x_resize = int(x // a) y_resize = int(y // a) """ Image.NEAREST :低质量 Image.BILINEAR:双线性 Image.BICUBIC :三次样条插值 Image.ANTIALIAS:高质量 """ img = img.resize((x_resize, y_resize), Image.ANTIALIAS) return img def is_pixel_equal(self, img1, img2, x, y): """ 比较两张图片同一点上的像数值,差距大于设置标准返回False :param img1: 阴影图 :param img2: 原图 :param x: 横坐标 :param y: 纵坐标 :return: 是否相等 """ pixel1, pixel2 = img1.load()[x, y], img2.load()[x, y] sub_index = 100 #比较RGB各分量的值 if abs(pixel1[0] - pixel2[0])


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有