Python对旋转图片验证码的识别和破解(三)完结

本文介绍使用Python结合selenium、numpy和OpenCV来识别和破解旋转图片验证码。重点是将旋转角度转换为滑块的拖动距离,生成并执行拖动轨迹,模拟真实拖动过程,包括加速和减速,以及解决因忽视Y轴变化导致的识别问题。

Python对旋转图片验证码的识别和破解

本文主要使用python + selenium来破解旋转突破的验证码;其中用到numpy和OpenCV(CV2)来进行图片拼接,转换,遮罩,识别等,共分三个部分:

(三)将旋转角度转换为拖动距离,并生成拖动轨迹,并拖动滑块

  • 找到滑块和滑块容器
    在这里插入图片描述

  • 将角度转换为移动距离

js_code = '''
w1 = document.getElementsByClassName('control-tips')[0].clientWidth; //滑块容器宽
w2 = document.getElementsByClassName('control-btn slideDragBtn')[0].offsetWidth; //滑块宽
zoom = (w2-w1)/360;
return zoom
'''
zoom = driver.execute_js(js_code)

distance = int(zoom * angle) # 角度转换为滑块拖动距离,
# distance = int(zoom * (360-angle)) 有的滑块拖动是逆时针旋转则angle = 360-angle
  • 生成移动轨迹
    模拟手动拖动时,加速再减速的过程,又时候会拖过去再返回,代码优化了网上滑动验证码类似轨迹计算
def get_track(distance:int)->list:
    '''
    根据偏移量distance获取移动轨迹
    返回: 
        移动轨迹
    '''
    track = []  # 移动轨迹
    current = 0  # 当前位移
    mid = distance * 2 / 3  # 减速阈值
    t = 0.2  # 计算间隔
    v = 0  # 初速度

    while current < distance:
        if current < mid:
            a = random.randint(30, 40)  # 加速度为正
        else:
            a = -random.randint(40, 80)  # 加速度为负

        v0 = v  # 初速度v0

        v = v0 + a * t  # 当前速度v = v0 + at
        # 移动距离x = v0t + 1/2 * a * t^2
        move = v0 * t + 1 / 2 * a * t * t
        current += move  # 当前位移
        track.append(round(move))  # 加入轨迹
    rest = sum(track) - distance
    while rest > 0:
        if rest > 3:
            max = 3
        else:
            max = rest
        move = -random.randint(1, max)
        track.append(round(move))
        rest += move
        if rest <= 2:
            move = -rest
            track.append(round(move))
            break
    return track
  • 根据移动轨迹拖动滑块

拖动滑块的一个坑就是,我们有时候只会关注到x轴拖动,并尽可能模拟加速再减速的拖动过程防止被机器设别,但是有的网址会检测y轴的变化(正常人拖动时,y轴不可能完全不移动),我当时为了这坑忙活了一整天,在x轴上模拟各种方法,就是不被机器识别,最后才找到了症结所在

track_list = get_track(distance)

slide_button = driver.find_element_by_xpath(
            '//div[@class="control-btn slideDragBtn"]')
            
# 开始拖拽滑块

ActionChains(driver).click_and_hold(slide_button).perform()
for track in track_list:
    ActionChains(driver).move_by_offset(
        xoffset=track, yoffset=random.randint(0, 5) - 3).perform() # 特别注意yoffset要随机变动,否则会被识别为机器拖动
        
# 释放滑块
ActionChains(driver).release(slide_button).perform()

至此,旋转图片验证码的识别和破解执行完毕!

评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值