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()

 

posted @ 2025-06-18 11:16  金一九  阅读(132)  评论(0)    收藏  举报