python 用cv2过滑块安全验证 playwright
算法是通过识别滑块边沿位置来定位滑块距离
下面是利用playwright对图片截图,并拖动滑块的程序(如果安全验证识别,会循环验证,直到通过为止)
import re from playwright.sync_api import Playwright, sync_playwright, expect import time from find_position import find_position def login(page: Playwright) -> None: # p = sync_playwright().start() #绕过webdrive检测 js = """ Object.defineProperties(navigator, {webdriver:{get:()=>undefined}}); """ page.add_init_script(js); # 绕过webdrive检测 page.goto("https:xxx",timeout=100000) page.get_by_role("textbox", name="账户").click() page.get_by_role("textbox", name="账户").fill("admin") page.get_by_role("textbox", name="密码").click() page.get_by_role("textbox", name="密码").fill("admin") page.get_by_role("button", name="登 录").click() time.sleep(2) # 获取拖动按钮位置并拖动 safe_verify_title=page.get_by_text("请完成安全验证") while(safe_verify_title.is_visible()): element= page.locator("img").first output_file="C:/work/python_program/try_playwright/08.png" element.screenshot(path=output_file) time.sleep(1) print(f"Element screenshot saved to {output_file}") P_position=find_position(output_file) print("The block position is:", P_position) # page.locator(".verify-icon").click() dropbutton = page.locator(".verify-icon") box = dropbutton.bounding_box() page.mouse.move(box['x'] + box['width'] / 2, box['y'] + box['height'] / 2) page.mouse.down() mov_x = box['x'] + box['width'] / 2 + P_position page.mouse.move(mov_x, box['y'] + box['height'] / 2) page.mouse.up() time.sleep(3)
下面是定位滑块目标位置的函数
import cv2 import numpy as np def find_position(image_path): image_path = "08.png" #图片路径 img = cv2.imread(image_path) #cv2.imshow("ori", img) for row in range(len(img)): for colume in range(len(img[row])): if row>140: img[row][colume] = [0, 0, 0] if img[row][colume][0]>185 and img[row][colume][1]>185 and img[row][colume][2]>185: img[row][colume]=[255,255,255] else: img[row][colume]=[0,0,0] #cv2.imshow("white", img) #灰度化 gray_image = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #比较图像中每列的相似度 image_colume=list(zip(*gray_image)) test_colume=image_colume[1] simi_list=[] simi_value=0 final_num=0 for colume in range(len(image_colume)): simi_value = 0 for num in range(len(test_colume)): if test_colume[num]==image_colume[colume][num]: simi_value=simi_value+5 else: simi_value=simi_value-1 simi_list.append(simi_value) for index in range(len(simi_list)): if simi_list[index]>680 and index>100: final_num=index print(f"列数:{index},值:{simi_list[index]}",) break return final_num # #画出定位线 # # for row in range(len(img)): # for colume in range(len(img[row])): # if colume==final_num: # img[row][colume]=[255,255,255] # cv2.imshow("position", img) # cv2.waitKey(0) # 无限期显示窗口 # # cv2.destroyAllWindows()
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号