破解极验验证码之模拟登录B站

本文介绍了如何破解B站采用的极验滑动验证码,通过计算滑动距离和模拟真实拖动轨迹来成功登录。首先,通过对比两张图片找到滑动距离,然后使用selenium执行JS代码获取不带缺口的图片。接着,模拟加速和减速的拖动过程,最终实现自动化登录。
摘要由CSDN通过智能技术生成

破解极验验证码之模拟登录B站

声明:截至2019年7月5号,本人实测此程序可有效破解极验验证码,但是因为极验验证码也是不断在更新的,所以在这之后,如果你发现此程序并不能破解,也请多多包涵,此外如果大家有更好的思路,可以多多交流!

正文:

很多网站登录时都采用了极验验证码作为区分正常用户和爬虫程序的方法之一,B站正是其中的一个,只要掌握了破解的思路和方法,即使是面对不一样的网站也可以采用相似的方法进行破解。本文主要从破解思路来向大家分享破解的过程,最后后放上源码供大家参考和指正!

初探极验验证码

首次登录B站时会先输入账号和密码,点击登录时一般会调出一个滑动验证码,要求你拖动滑块到缺口处,就是下图的样子B站等录时的滑动验证码
对于我们人来说,只需要鼠标点击并拖动滑块到缺口处就可以了。但是当你使用selenium进行同样的操作将滑块直接拖动到缺口处时往往并不能成功, 这是因为服务器在你拖动的过程中会收集你的拖动信息,然后利用算法来判断你是人为拖动还是机器拖动,因为人为拖动时的速度不可能是绝对的匀速的,而利用selenium直接让滑块移动一段距离的速度是衡定的。了解这些之后,下面就跟大家分享破解的思路。

破解过程和思路

从验证过程来看只需要将滑块拖动一段距离让他刚好到达缺口处就可以了,也就是说第一个关键点在于如何获得需要滑动的距离,第二个关键点就是应该以什么样的速度去拖动滑块。

计算滑动距离

验证码本质上是由图片成,通过观察我们可以发现验证码的缺口部分是有阴影的,如果我们能同时获得带缺口和不带缺口的图片,那么我们就可以通过对比两张图片的每个像素点,找到不同的像素点,也就是阴影部分的位置,然后通过简单的计算就可以得到需要滑动的距离了。
通过使用Chrome浏览器观察点击登录后服务器返回的信息可以发现验证码主要是有以下三张图片生成的,分别是滑块、带缺口的图片以及不带缺口的图片,但是两张主要的图片都做了一定的处理,就是把图片分割成了很多块,然后打乱这些块的顺序(早期的极验验证码的图片是没有经过分割并打乱的),那么接下来我们可以通过算法把这两张图片重新合成正确的图片,然后对比计算滑动距离,这么做确实可以,但是比较麻烦,感兴趣的可以看一下知乎上 “小帅b” 的方法:小帅b破解B站验证码的方法而我要分享的是另一种更简单易懂的方法。请继续向下看
滑块
滑块
带缺口的图片
打乱的带缺口的图片
不带缺口的图片
打乱的不带缺口的图片

首先要告诉大家的是我是通过截图的方法来获取两张图片的,但是正常浏览时只能看到带缺口的图片,那也就是说通过截图的方法只能获取一张带缺口的图片,无法获得不带缺口的图片,没关系,我们继续分析。
使用Chrome浏览器选中生成的验证码,然后会发现生成这几张图片的css代码如下:
生成验证码图片的css注意最后一行代码的style属性为"display:none",当我把它改为"display:block"时,神奇的一幕发生了,不带缺口的图片竟然以迅雷不及掩耳的速度的突然出现,而我悬着的心也终于可以悄然落下。那么接下来的问题就变成了如何把style的属性变为"display:block"。方法就是通过selenium执行一段js代码,代码如下:

js = 'document.querySelectorAll("canvas")[3].style="display:block"'		# 大家可以根据自己要破解的网站来修改js代码
browser.execute_script(js)

带缺口的图片
带缺口的图片
不带缺口的图片
不带缺口的图片

现在我们已经有了两张图片了,接下来就是逐一对比两张图片的每个像素点,不同的地方就是阴影的位置,需要注意的点是对比的部分不包括带有滑块的那些像素点,因为阴影部分不可能在那里,也就是说是从图片左边开始的某一不包括滑块的位置开始对比的。至此获取滑动距离的部分就完结了。总结一下:

获取滑动距离的步骤:

  1. 通过验证码的位置,截取第一张也就是带缺口的图片
  2. selenium执行一段js代码,不带缺口的图片出现
  3. 截取第二张不带缺口的图片
  4. 对比两张图片,获取阴影位置,计算出滑动距离

计算滑动轨迹

前面说了,直接使用selenium拖动滑块到缺口处会被服务器认为拖动的速度过于诡异(匀速)而被判定不合格,那么只要我们能模拟人的拖动过程就可以迷惑服务器,让它认为程序是人为拖动的。通常来说,人为操作是先加速,接近缺口时减速,同时可能会超过缺口位置而需要向后再拖动一小段距离,并且松开鼠标的时候可能会有一点点抖动,而造成滑块有轻微的滑动。程序模拟的过程也是如此,加速以及减速过程通过高中物理中的速度位移公式x= v0*t + 1/2*a*t*t),详细过程请大家根据后面的代码加以思考,代码部分也有详细的备注,毕竟没有思考也就没有真正的收获!关键点在于理解selenium在拖动滑块移动一段距离的时间是基本相等的,那么等于是在很多段固定的时间移动不一样的距离而模拟出加速与减速的,最后这很多段距离加起来就是需要滑动的距离。剩下的就是向后拖动一段距离,然后模拟释放时的抖动了。总结如下:

计算滑动轨迹的步骤

  1. 通过滑动距离计算出加速以及减速的轨迹,(这时的滑动距离比前面计算的要长一些,因为后面还有向后拖动一小段距离的动作,计算出的轨迹为一个轨迹列表,通过循环使selenium不断拖动列表中的每个距离)
  2. 向后拖动一小段距离
  3. 模拟释放时的抖动

只要总的距离加在一起等于或接近我们前面通过对比两张图片计算出的距离就可以了,因为即使是人为操作也是存在一定的误差的,并且计算出的距离也存在一定的误差,所以不一定非得绝对的等于。至此,破解极验验证码的思路分析就结束了,因为每个网站的验证码图片是有差异的,大家可以通过改变代码中BORDER的值来调出最适合自己要破解的网站的程序。最后,因为本人也是一个初学者,代码以及分析有不正确的地方恳请大家指正,感谢阅读!

献上代码:
使用前记得安装好相关的库

# Python3!
# 模拟登录B站,破解极验验证码


from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver import ActionChains
from PIL import Image
from io import BytesIO
import time


# 滑块离左边界的距离,可根据验证效果自行调整
BORDER = 7
# B站登录地址
URL = 'https://passport.bilibili.com/login'
# 登录账号(仅作为展示使用)
USER = '284992633@qq.com'
# 登录密码(仅作为展示使用)
PASSWORD = 'qq284992633'


class BrackGeetest():


    def __init__(self):
        """
        初始化
        """
        self.browser = webdriver.Chrome()
        self.wait = WebDriverWait(self.browser,15)

    def open(self):
        """
        打开初始网页
        :return:None
        """
        self.browser.get(URL)
        self.browser.maximize_window()

    def close(self
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值