ddddocr: 滑块验证码的一个例子

一,代码:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By

from selenium.webdriver.common.action_chains import ActionChains

import time

import pyautogui
import pyperclip
from urllib.parse import urlparse, parse_qs

from ddddocr import DdddOcr

def change_url(url):
    # 就在当前标签页打开网页
    driver.get(url)
    print(driver.title)
    
    # 获取所有窗口句柄并切换到最后一个
    handles = driver.window_handles
    driver.switch_to.window(handles[-1])

def open_new_url(url):
    # 就在当前标签页打开网页
    driver.execute_script("window.open('"+url+"', '_blank');")

    # 获取所有窗口句柄并切换到最后一个
    handles = driver.window_handles
    driver.switch_to.window(handles[-1])

def get_name_by_url(url):
    parsed_url = urlparse(url)
    filename = parsed_url.path.split('/')[-1]
    print(filename)  # 输出: file.txt
    return filename

def save_one_img(driver,pic,dest_file):


    action = ActionChains(driver).move_to_element(pic)  # 移动到该元素
    action.context_click(pic)  # 右键点击该元素
    action.perform() # 执行
    pyautogui.typewrite(['v']) # 敲击V进行保存
    # 单击图片另存之后等1s敲回车
    time.sleep(1)
    # dest_file = dest_dir+"/"+no_ext
    pyperclip.copy(dest_file)  # 把 指定的路径拷贝到过来
    time.sleep(1)  # 等待一秒
    pyautogui.hotkey('ctrlleft', 'v')  # 粘贴
    time.sleep(0.5)  # 等待一秒

    pyautogui.typewrite(['enter'])

    

if __name__ == '__main__':
	
    # 指定驱动路径
    driver_path = '/opt/soft/chromedriver-linux64/chromedriver'
    # 创建Service对象并传入ChromeOptions
    service = Service(driver_path)
    # 得到options
    chrome_options = Options()
    chrome_options.add_experimental_option("debuggerAddress", "127.0.0.1:9222")
    driver = webdriver.Chrome(options=chrome_options,service=service)
    # 通过JavaScript在新窗口打开URL
    # URL = 'https://movie.douban.com/explore?support_type=movie&is_all=false&category=%E7%83%AD%E9%97%A8&type=%E5%85%A8%E9%83%A8'
    URL = 'https://sso1.xxx.cn/websitelogin.html'
    open_new_url(URL)
    
    time.sleep(3)
    
    # print(driver.page_source)

    # 打开滑动时的浮动框
    """基础鼠标悬停操作"""
    # 定位需要悬停的元素
    code_img = driver.find_element(By.ID, "id-code-btn")
    
    # 创建ActionChains实例
    actions = ActionChains(driver)
    
    # 构建悬停操作链
    actions.move_to_element(code_img)  # 移动鼠标到元素
    
    # 执行操作
    actions.perform()
    
    print("鼠标悬停操作执行完成")
    
    time.sleep(1)


 

    '''
    time.sleep(0.5)
    action_chains.drag_and_drop_by_offset(drag_btn, 10, 0).perform()

    time.sleep(0.5)
    action_chains.drag_and_drop_by_offset(drag_btn, 10, 0).perform()

    time.sleep(0.5)
    action_chains.drag_and_drop_by_offset(drag_btn, 10, 0).perform()
    '''


    
    # 获取背景图的地址
    back_img = driver.find_element(By.XPATH, "//div[@id='id-code-img']/div[@class='code-img-con']/img[@class='code-back-img']")
    print(back_img)
    print(back_img.tag_name)
    # back_src = back_img.get_attribute('src')
    back_src = back_img.get_attribute('src')
    back_name = get_name_by_url(back_src)
    no_ext = back_name.split('.')[0]
    ext = back_name.split('.')[1]


    # 保存图片
    dest_dir = "/data/python/xianyu/slider/"
    dest_file = dest_dir+no_ext

    save_one_img(driver,back_img,dest_file)

    time.sleep(1)  # 等待一秒
    
    # 获取mask的地址

    """基础鼠标悬停操作"""
    # 定位需要悬停的元素
    code_img = driver.find_element(By.ID, "id-code-btn")
    
    # 创建ActionChains实例
    actions = ActionChains(driver)
    
    # 构建悬停操作链
    actions.move_to_element(code_img)  # 移动鼠标到元素
    
    # 执行操作
    actions.perform()
    
    print("鼠标悬停操作执行完成")
    
    time.sleep(1)


    mask_img = driver.find_element(By.XPATH, "//div[@id='id-code-img']/div[@class='code-img-con']/div[@class='code-mask']/img[@class='code-front-img']")
    print(mask_img)
    print(mask_img.tag_name)
    # back_src = back_img.get_attribute('src')
    mask_src = mask_img.get_attribute('src')
    mask_name = get_name_by_url(mask_src)
    mask_no_ext = mask_name.split('.')[0]
    mask_ext = mask_name.split('.')[1]


    # 保存图片
    #dest_dir = "/data/python/xianyu/slider/"
    dest_mask_file = dest_dir+mask_no_ext

    save_one_img(driver,mask_img,dest_mask_file)

    time.sleep(1)  # 等待一秒

    # 得到mask在背景图上的位置

    ocr = DdddOcr(det=False, ocr=False)

    with open(back_name, "rb") as f:
        background = f.read()
    with open(mask_name, "rb") as f:
        slide_block = f.read()

    pos = ocr.slide_match(slide_block,background)
    print(f"缺口位置: {pos}")
    left = pos['target'][0]
    left = left-2    #校正位置   
    print(f"目标left: {left}")



    """基础鼠标悬停操作"""
    # 定位需要悬停的元素
    code_img = driver.find_element(By.ID, "id-code-btn")
    
    # 创建ActionChains实例
    actions = ActionChains(driver)
    
    # 构建悬停操作链
    actions.move_to_element(code_img)  # 移动鼠标到元素
    
    # 执行操作
    actions.perform()
    
    print("鼠标悬停操作执行完成")
    
    time.sleep(1)

   # 得到按钮
    
    drag_btn = driver.find_element(By.XPATH, "//div[@id='id-code-btn']/div[@class='code-btn-img code-btn-m']")

    # 拖动按钮到目标位置
    action_chains = ActionChains(driver)
    action_chains.drag_and_drop_by_offset(drag_btn, left, 0).perform()

    drag_btn.click()

 

 

二,效果测试:

image

posted @ 2025-11-24 18:22  刘宏缔的架构森林  阅读(4)  评论(0)    收藏  举报