结果演示
滑块验证码登录
测试网站
提供各类型验证码识别验证,主要提供人机识别与验证服务
行为验证4.0-适应型验证码-滑动验证,点选验证,图片验证-极验GeeTest
代码实现
-
相关前置依赖可参考
自动化脚本-图片验证码识别登陆-CSDN博客
-
具体实现
# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.chrome.options import Options
import requests
import re
import ddddocr# 等待元素出现并点击
def wait_and_click(driver, by, identifier):element = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((by, identifier)))ActionChains(driver).move_to_element(element).click(element).perform()# 执行JS脚本
def execute_script(driver, script):driver.execute_script(script)WebDriverWait(driver, 10).until(lambda d: d.execute_script('return document.readyState') == 'complete')# 保存图片
def save_img(driver, xpath, img_name):element = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, xpath)))style = element.get_attribute("style")url = re.findall(r'[(](.*?)[)]', style)[0]url = eval(url)img_response = requests.get(url, verify=False)with open(img_name, "wb") as f:f.write(img_response.content)# 计算滑块滑动位置
def ocr_slide(slide_pic, bg_pic):# slide_pic: 滑块的路径# bg_pic: 背景的路径# return: 移动到的坐标位置det = ddddocr.DdddOcr(det=False, ocr=False)with open(slide_pic, 'rb') as f:target_bytes = f.read()with open(bg_pic, 'rb') as f:background_bytes = f.read()res = det.slide_match(target_bytes, background_bytes, simple_target=True)print(res.get("target"))return resdef main():options = Options()options.add_experimental_option("detach", True)options.add_argument("--start-maximized")driver = webdriver.Chrome(options=options)driver.get("https://www.geetest.com/adaptive-captcha-demo")execute_script(driver, "window.scrollBy(0,130);")wait_and_click(driver, By.XPATH, '//button[text()="滑动拼图验证"]')wait_and_click(driver, By.XPATH, '//div[@aria-label="点击按钮开始验证"]')save_img(driver, '//*[@id="captcha"]/div[2]/div[1]/div[4]/div[1]/div[2]/div/div/div[1]/div[1]/div[1]', "slide.png")save_img(driver, '//*[@id="captcha"]/div[2]/div[1]/div[4]/div[1]/div[2]/div/div/div[1]/div[2]', "bg.png")# 等待滑块元素加载完成wait = WebDriverWait(driver, 10)slide = wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id="captcha"]/div[2]/div[1]/div[4]/div[1]/div[2]/div/div/div[1]/div[1]/div[1]')))# 确定滑块坐标res = ocr_slide("slide.png", "bg.png")x1, y1, x2, y2 = res.get("target")if res is not None:# 等待滑块元素可点击wait.until(EC.element_to_be_clickable((By.XPATH, '//*[@id="captcha"]/div[2]/div[1]/div[4]/div[1]/div[2]/div/div/div[1]/div[1]/div[1]')))# 执行滑动动作slide_width = slide.size.get("width")ActionChains(driver).drag_and_drop_by_offset(source=slide, xoffset=(x1+x2)/2-(slide_width/2), yoffset=0).perform()else:print("未能识别滑块位置。")# 关闭驱动# driver.quit()if __name__ == "__main__":main()