滑块验证码之模拟人工滑速
前言
代码直接运行即可
此处是用的selenium模拟,主要记录的难点是如何 模拟人工滑速
具体原理和利用到的东西都有做注释,逻辑完整,小白还是可以尝试理解的
一、正常简单模拟滑动
目标网址:点击
import base64
import time
import ddddocr
from selenium import webdriver
from selenium.webdriver.common.by import Bydef text_dis(bg, fg):slide = ddddocr.DdddOcr(det=False, ocr=False)with open(bg, 'rb') as f:target_bytes = f.read()with open(fg, 'rb') as f:background_bytes = f.read()res = slide.slide_comparison(target_bytes, background_bytes) # 计算出距离return res.get('target')[0]def get_slide():options = webdriver.ChromeOptions()# 对于老版本的浏览器不行options.add_argument('--disable-blink-features=AutomationControlled')driver = webdriver.Chrome(chrome_options=options)driver.maximize_window()driver.get('https://www.geetest.com/demo/slide-bind.html')driver.find_element(By.ID, 'username').send_keys('13697028751') # 输入框输入账号和密码driver.find_element(By.ID, 'password').send_keys('19961227ai')time.sleep(2)driver.find_element(By.CSS_SELECTOR, 'div.btn').click() # 点击登录time.sleep(2)img_src = driver.execute_script('return document.getElementsByClassName("geetest_canvas_bg geetest_absolute")[0].toDataURL("image/png");')print(img_src)im_base64 = img_src.split(',')[1]im_bytes = base64.b64decode(im_base64)print(im_base64)print(im_bytes)print('-----------------------------------')with open('./bg.png', 'wb') as f:f.write(im_bytes)temp = driver.execute_script("return document.getElementsByClassName('geetest_canvas_fullbg geetest_fade geetest_absolute')[0].toDataURL('image/png');")print(temp)temp_base64 = temp.split(',')[1]temp_bytes = base64.b64decode(temp_base64)with open('./temp.png', 'wb') as f:f.write(temp_bytes)distance = text_dis('bg.png', 'temp.png') # 计算出距离print('距离:', distance)# 拖动滑块slide = driver.find_element(By.CSS_SELECTOR, 'div.geetest_slider_button')action_chains = webdriver.ActionChains(driver)# 点击,准备拖拽action_chains.click_and_hold(slide) # 鼠标左键点击但不释放action_chains.pause(0.2)action_chains.move_by_offset(distance - 10, 0)action_chains.pause(0.8)action_chains.move_by_offset(10, 0)action_chains.pause(1.4)action_chains.move_by_offset(-10, 0)action_chains.release()action_chains.perform()time.sleep(20)get_slide()
扩展
selenium常用模拟操作
1、行为控制
perform --- 执行所有准备好的Action
reset_actions --- 清空所有准备好的Action # 该方法在 selenium 3.141.0版本不生效
pause --- 设置Action之间的动作时间间隔2、鼠标操作
click