0


Selenium滑动验证码破解(缺口对应却无法通过,需要做鼠标轨迹模拟)

1、前言

平台:
windows11    
python         
所涉及内容:
selenium                  4.1.3
selenium-wire             4.6.3
chromedriver 
滑动验证码破解原理:
1、获取完整图片和带有缺口的残图
2、通过比对完整图片和残图,确定缺口偏移量
3、通过selenium模拟鼠标点击移动,完成滑动验证码识别
解决场景:
1、普通滑动验证码的识别验证
2、
    手工启动chrome,人工拖动验证码可以通过验证。
    使用selenium启动chrome,人工拖动验证码可以通过验证。
    使用selenium启动chrome,程序模拟拖动验证码无法通过验证。(原因即为上面所述)

博客:https://blog.csdn.net/sayyy/article/details/99649372 中介绍了chromewebdriver的特征值,
通过修改$cdc_asdjflasutopfhvcZLmcfl_ 可以绕过场景2,本人复现后无法解决,有兴趣的可以去验证一下,有效果烦请留言教教我。

2、缺口图获取

正常情况下,滑动验证码都是在canvas画出来的(残图一般是JS通过对后台返回的完整图片剪裁而来),在网页代码中可以找到对应信息
残图直接画在Canvas上,因此需要通过js代码将其导出,获取图片的base64数据(错存在直接能下载,那就更好了)。

//将canvas上的图片转化为base64,可以直接在chrome的控制台尝试
    js ='''return document.querySelector("#captcha > canvas:nth-child(1)").toDataURL()'''//执行js获取base64
    base64str = driver.execute_script(js)//去除data:image/png;base64等冗余值
    resultstr = base64str.strip("data:image/png;base64")
    resultstr = resultstr[1:]//base64反向编码
    imagedata = base64.b64decode(resultstr)//保存为图片文件
    file =open('./cq.png',"wb")
    file.write(imagedata)
    file.close()

3、完整图片获取

不同的网站存在不同情况
1、可以通过执行JS代码修改CSS属性,达到显示原图的效果
2、完整图片不在前端呈现,但是在前端剪裁,这时候可以通过seleniumwire对请求进行过滤,直接获得对应的原图
场景2 复现,通过seleniumwire对request请求进行过滤,获取原图
all_request = driver.requests
for req in all_request://captcha_photo是获取完整图片的url链接,且只有找个请求存在captcha_photo
    if"captcha_photo"in req.url:file=open('./bg.png',"wb")file.write(req.response.body)file.close()

4、获取偏移值

获取偏移值可以通过缺口图和原图进行比对,找到初始像素值不同的位置,即为偏移值,该过程存在一定误差

defget_gap():"""
    获取缺口偏移量
    :param final_imagebg: 带缺口图片
    :param cq: 不带缺口图片
    :return:
    """

    bg = Image.open('./bg.png')
    cq = Image.open('./cq.png')# 原图和缺口图存在像素差
    final_imagebg=bg.resize((278,150))
    start =60# 模块色差
    color_num =60for x inrange(start, final_imagebg.size[0]):for y inrange(final_imagebg.size[1]):
            rgb1 = final_imagebg.load()[x, y]
            rgb2 = cq.load()[x, y]# abs 获取绝对值
            r =abs(rgb1[0]- rgb2[0])
            g =abs(rgb1[1]- rgb2[1])
            b =abs(rgb1[2]- rgb2[2])ifnot(r < color_num and g < color_num and b < color_num):print(x)return x -7# 误差值大概为7
get_gap()函数获取的是偏移值,但是滑块初始存在一定的偏差,这里需要自行进行调整。

5、滑动滑块

场景1:普通滑动验证码的识别验证
    实现思路:1、拿到移动轨迹,模仿人的滑动行为,先匀加速后匀减速
             2、模拟点击按住按钮,拖拽,释放
场景2:通过selenium模拟鼠标的【点击、按住、拖拽、释放】可以完成拖拽,但是验证时错误的(因为没有鼠标轨迹无法生成鼠标位置参数)

场景1复现

defget_tracks(distance):'''
    拿到移动轨迹,模仿人的滑动行为,先匀加速后匀减速
    匀变速运动基本公式:
    ①v=v0+at
    ②s=v0t+½at²
    ③v²-v0²=2as
    :param distance: 需要移动的距离
    :return: 存放每0.2秒移动的距离
    '''# 初速度
    v =5# 单位时间为0.2s来统计轨迹,轨迹即0.2内的位移
    t =0.2# 位移/轨迹列表,列表内的一个元素代表0.2s的位移
    tracks =[]# 当前的位移
    current =0# 到达mid值开始减速
    mid = distance *4/5while current < distance:if current < mid:# 加速度越小,单位时间的位移越小,模拟的轨迹就越多越详细
            a =8else:
            a =-3# 初速度
        v0 = v
        # 0.2秒时间内的位移
        s = v0 * t +0.5* a *(t **2)# 当前的位置
        current += s
        # 添加到轨迹列表
        tracks.append(round(s))# 速度已经达到v,该速度作为下次的初速度
        v = v0 + a * t
    return tracks

selenium 模拟拖拽

模拟人的行为习惯(先匀加速拖动后匀减速拖动),把需要拖动的总距离分成一段一段小的轨迹
tracks = get_tracks(distance)# 剩下的50%在模拟移动for x in tracks:
    ActionChains(driver).move_by_offset(xoffset=x, yoffset=0).perform()else:
    ActionChains(driver).move_by_offset(xoffset=3, yoffset=0).perform()# 先移过一点
    ActionChains(driver).move_by_offset(xoffset=-1, yoffset=0).perform()# 再退回来,看上去更像人为# 0.5s释放鼠标
time.sleep(3)
ActionChains(driver).release().perform()

场景2复现

PyAutoGUI 是一个简单易用,跨平台的可以模拟键盘鼠标进行自动操作的 python 库

# 安装pyautogui库
pip3 install pyautogui

需要在拖拽过程中存在鼠标拖拽的轨迹参数,因此采用了PyAutoGUI来实现,

# xiaohuakua是待滑动滑块的driver值
xiaohuakuai=driver.find_element_by_xpath('//*[@id="captcha"]/div/div[2]/div')
pyautogui.moveTo(xiaohuakuai.location['x']+1, xiaohuakuai.location['y']+80)# duration是几秒内完成滑动  location['x']是水平轴滑动,
pyautogui.dragTo(xiaohuakuai.location['x']+int(distance)+7, xiaohuakuai.location['y']+84, duration=2)

此时滑动验证码识别通过,填充账号密码点击登录即可!

标签: selenium 前端 python

本文转载自: https://blog.csdn.net/weixin_43801662/article/details/124660755
版权归原作者 大鹏爱分享 所有, 如有侵权,请联系我们删除。

“Selenium滑动验证码破解(缺口对应却无法通过,需要做鼠标轨迹模拟)”的评论:

还没有评论