selenium实现滑块验证码自动识别
·
滑块验证码识别方法
1、打开浏览器网址
def get_url(url, user, password):
'''
url:网址
user:用户名
password:密码
'''
browser = webdriver.Chrome()
browser.get(url)
# 浏览器最大化
browser.maximize_window()
browser.implicitly_wait(15)
wait = WebDriverWait(browser, 10)
# 等待页面加载完成
wait.until(EC.presence_of_element_located((By.CLASS_NAME, '元素类名')))
user_input = browser.find_element_by_id('登录元素id')
pwd_input = browser.find_element_by_id('密码元素id')
# 设置用户名、密码
user_input.send_keys(user)
pwd_input.send_keys(password)
time.sleep(0.5)
return browser
2、获取滑块验证码
def get_position(img_label):
panel_height = browser.execute_script('return window.outerHeight - window.innerHeight')
location = img_label.location
size = img_label.size
top, bottom, left, right = location['y'] + panel_height, location['y'] + panel_height + size['height'], location[
'x'], location['x'] + size[
'width']
return (left, top, right, bottom)
if __name__ == '__main__':
flag = 0
for j in range(3):
print(f'第{j + 1}次开启网页')
browser = get_url('网址', '用户名', '密码')
for i in range(4):
print(f'第{i + 1}遍登录')
btn = browser.find_element_by_class_name('类名')
btn.click()
time.sleep(1)
full_img_label = browser.find_element_by_class_name('类名') # 原始图片的标签
print('完整图片坐标为:', full_img_label.location)
position = get_position(full_img_label) # 获取滑动验证图片的位置
print(position)
pic = ImageGrab.grab() # 截屏
imgsrc = r'D:\tmp\source.jpg'
pic.save(imgsrc) # 保存截屏至本地
image = Image.open(imgsrc)
img = image.crop(position) # 截取滑块验证码部分
img.save(imgsrc)
imgobj = r'D:\tmp\find111.jpg' # 滑块缺失部分,自行截图
3、匹配验证码缺失部分
def matchImg(imgsrc, imgobj, confidencevalue=0.5):
# imgsrc=原始图像,imgobj=待查找的图片, confidencevalue=识别准确度
imsrc = ac.imread(imgsrc)
imobj = ac.imread(imgobj)
match_result = ac.find_template(imsrc, imobj,
confidencevalue)
if match_result is not None:
match_result['shape'] = (imsrc.shape[1], imsrc.shape[0]) # 0为高,1为宽
return match_result
4、完整代码:
def get_url(url, user, password):
'''
url:网址
user:用户名
password:密码
'''
browser = webdriver.Chrome()
browser.get(url)
# 浏览器最大化
browser.maximize_window()
browser.implicitly_wait(15)
wait = WebDriverWait(browser, 10)
# 等待页面加载完成
wait.until(EC.presence_of_element_located((By.CLASS_NAME, '元素类名')))
user_input = browser.find_element_by_id('登录元素id')
pwd_input = browser.find_element_by_id('密码元素id')
# 设置用户名、密码
user_input.send_keys(user)
pwd_input.send_keys(password)
time.sleep(0.5)
return browser
def get_position(img_label):
panel_height = browser.execute_script('return window.outerHeight - window.innerHeight')
location = img_label.location
size = img_label.size
top, bottom, left, right = location['y'] + panel_height, location['y'] + panel_height + size['height'], location[
'x'], location['x'] + size[
'width']
return (left, top, right, bottom)
def get_track(distance):
# 移动轨迹
track = []
# 当前位移
current = 0
# 减速阈值
mid = distance * 4 / 5
# 计算间隔
t = 0.2
# 初速度
v = 0
while current < distance:
if current < mid:
# 加速度为正 2
a = 4
else:
# 加速度为负 3
a = -3
# 初速度 v0
v0 = v
# 当前速度 v = v0 + at
v = v0 + a * t
# 移动距离 x = v0t + 1/2 * a * t^2
move = v0 * t + 1 / 2 * a * t * t
# 当前位移
current += move
# 加入轨迹
track.append(round(move))
if len(track) != 0:
track.reverse()
return track
def move_to_gap(browser, slider, tracks):
ActionChains(browser).click_and_hold(slider).perform()
print(tracks)
for x in tracks:
ActionChains(browser).move_by_offset(xoffset=x, yoffset=0).perform()
time.sleep(0.5)
ActionChains(browser).release().perform()
def matchImg(imgsrc, imgobj, confidencevalue=0.5):
# imgsrc=原始图像,imgobj=待查找的图片
imsrc = ac.imread(imgsrc)
imobj = ac.imread(imgobj)
match_result = ac.find_template(imsrc, imobj,
confidencevalue)
if match_result is not None:
match_result['shape'] = (imsrc.shape[1], imsrc.shape[0])
return match_result
if __name__ == '__main__':
flag = 0
for j in range(3):
print(f'第{j + 1}次开启网页')
browser = get_url('网址', '用户名', '密码')
for i in range(4):
print(f'第{i + 1}遍登录')
btn = browser.find_element_by_class_name('类名')
btn.click()
time.sleep(1)
full_img_label = browser.find_element_by_class_name('类名') # 原始图片的标签
print('完整图片坐标为:', full_img_label.location)
position = get_position(full_img_label) # 获取滑动验证图片的位置
print(position)
pic = ImageGrab.grab() # 截屏
imgsrc = r'D:\tmp\source.jpg'
pic.save(imgsrc) # 保存截屏至本地
image = Image.open(imgsrc)
img = image.crop(position) # 截取滑块验证码部分
img.save(imgsrc)
imgobj = r'D:\tmp\find111.jpg' # 滑块缺失部分,自行截图
match_result = matchImg(imgsrc, imgobj, 0.1) # 匹配位置
if match_result is None:
continue
print(match_result)
X, Y = match_result['rectangle'][0]
left = X
print(left)
slide_btn = browser.find_element_by_class_name('handler.handler_bg') # 获取滑动按钮
track = get_track(left) # 获取滑动的轨迹,此函数定义在第9点
move_to_gap(browser, slide_btn, track) # 进行滑动,此函数定义在第10点
success = browser.find_element_by_id('drag') # 获取显示结果的标签
time.sleep(2)
if success.get_attribute('class') == "ok":
login_btn = browser.find_element_by_xpath('//button[(text()="登录")]') # 如果验证成功,则点击登录按钮
login_btn.click()
flag = 1
break
else:
print(success.text)
print('失败')
time.sleep(1)
continue
if flag == 1:
break
browser.close()
更多推荐
所有评论(0)