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()
至此,旋转图片验证码的识别和破解执行完毕!
本文介绍使用Python结合selenium、numpy和OpenCV来识别和破解旋转图片验证码。重点是将旋转角度转换为滑块的拖动距离,生成并执行拖动轨迹,模拟真实拖动过程,包括加速和减速,以及解决因忽视Y轴变化导致的识别问题。
完结&spm=1001.2101.3001.5002&articleId=106922078&d=1&t=3&u=ba88890803c94fa78c4433e6d9b2c904)
1864

被折叠的 条评论
为什么被折叠?



