滑块验证码识别方法
1、打开浏览器网址

def get_url(url, user, password):
	'''
		url:网址
		user:用户名
		password:密码
	'''
    browser = webdriver.Chrome()
    browser.get(url)
    #  浏览器最大化
    browser.maximize_window()
    browser.implicitly_wait(15)
    wait = WebDriverWait(browser, 10)
    #  等待页面加载完成
    wait.until(EC.presence_of_element_located((By.CLASS_NAME, '元素类名')))
    user_input = browser.find_element_by_id('登录元素id')
    pwd_input = browser.find_element_by_id('密码元素id')
	#  设置用户名、密码
    user_input.send_keys(user)
    pwd_input.send_keys(password)
    time.sleep(0.5)
    return browser

2、获取滑块验证码


def get_position(img_label):
    panel_height = browser.execute_script('return window.outerHeight - window.innerHeight')
    location = img_label.location
    size = img_label.size
    top, bottom, left, right = location['y'] + panel_height, location['y'] + panel_height + size['height'], location[
        'x'], location['x'] + size[
                                   'width']
    return (left, top, right, bottom)

if __name__ == '__main__':
    flag = 0
    for j in range(3):
        print(f'第{j + 1}次开启网页')
        browser = get_url('网址', '用户名', '密码')  
        for i in range(4):
            print(f'第{i + 1}遍登录')
            btn = browser.find_element_by_class_name('类名')
            btn.click()
            time.sleep(1)
            full_img_label = browser.find_element_by_class_name('类名')  # 原始图片的标签
            print('完整图片坐标为:', full_img_label.location)
            position = get_position(full_img_label)  # 获取滑动验证图片的位置
            print(position)
            pic = ImageGrab.grab()   # 截屏
            imgsrc = r'D:\tmp\source.jpg'
            pic.save(imgsrc)  # 保存截屏至本地
            image = Image.open(imgsrc)
            img = image.crop(position)   # 截取滑块验证码部分
            img.save(imgsrc)
            imgobj = r'D:\tmp\find111.jpg'   # 滑块缺失部分,自行截图

3、匹配验证码缺失部分

def matchImg(imgsrc, imgobj, confidencevalue=0.5):
    # imgsrc=原始图像,imgobj=待查找的图片, confidencevalue=识别准确度
    imsrc = ac.imread(imgsrc)
    imobj = ac.imread(imgobj)
    match_result = ac.find_template(imsrc, imobj,
                                    confidencevalue) 
    if match_result is not None:
        match_result['shape'] = (imsrc.shape[1], imsrc.shape[0])  # 0为高,1为宽
    return match_result

4、完整代码:

def get_url(url, user, password):
	'''
		url:网址
		user:用户名
		password:密码
	'''
    browser = webdriver.Chrome()
    browser.get(url)
    #  浏览器最大化
    browser.maximize_window()
    browser.implicitly_wait(15)
    wait = WebDriverWait(browser, 10)
    #  等待页面加载完成
    wait.until(EC.presence_of_element_located((By.CLASS_NAME, '元素类名')))
    user_input = browser.find_element_by_id('登录元素id')
    pwd_input = browser.find_element_by_id('密码元素id')
	#  设置用户名、密码
    user_input.send_keys(user)
    pwd_input.send_keys(password)
    time.sleep(0.5)
    return browser
def get_position(img_label):
    panel_height = browser.execute_script('return window.outerHeight - window.innerHeight')
    location = img_label.location
    size = img_label.size
    top, bottom, left, right = location['y'] + panel_height, location['y'] + panel_height + size['height'], location[
        'x'], location['x'] + size[
                                   'width']
    return (left, top, right, bottom)


def get_track(distance):
    # 移动轨迹
    track = []
    # 当前位移
    current = 0
    # 减速阈值
    mid = distance * 4 / 5
    # 计算间隔
    t = 0.2
    # 初速度
    v = 0
    while current < distance:
        if current < mid:
            # 加速度为正 2
            a = 4
        else:
            # 加速度为负 3
            a = -3
        # 初速度 v0
        v0 = v
        # 当前速度 v = v0 + at
        v = v0 + a * t
        # 移动距离 x = v0t + 1/2 * a * t^2
        move = v0 * t + 1 / 2 * a * t * t
        # 当前位移
        current += move
        # 加入轨迹
        track.append(round(move))
    if len(track) != 0:
        track.reverse()
    return track


def move_to_gap(browser, slider, tracks):
    ActionChains(browser).click_and_hold(slider).perform()
    print(tracks)
    for x in tracks:
        ActionChains(browser).move_by_offset(xoffset=x, yoffset=0).perform()
    time.sleep(0.5)
    ActionChains(browser).release().perform()


def matchImg(imgsrc, imgobj, confidencevalue=0.5):
    # imgsrc=原始图像,imgobj=待查找的图片
    imsrc = ac.imread(imgsrc)
    imobj = ac.imread(imgobj)
    match_result = ac.find_template(imsrc, imobj,
                                    confidencevalue)
    if match_result is not None:
        match_result['shape'] = (imsrc.shape[1], imsrc.shape[0]) 
    return match_result

if __name__ == '__main__':
    flag = 0
    for j in range(3):
        print(f'第{j + 1}次开启网页')
        browser = get_url('网址', '用户名', '密码')  
        for i in range(4):
            print(f'第{i + 1}遍登录')
            btn = browser.find_element_by_class_name('类名')
            btn.click()
            time.sleep(1)
            full_img_label = browser.find_element_by_class_name('类名')  # 原始图片的标签
            print('完整图片坐标为:', full_img_label.location)
            position = get_position(full_img_label)  # 获取滑动验证图片的位置
            print(position)
            pic = ImageGrab.grab()   # 截屏
            imgsrc = r'D:\tmp\source.jpg'
            pic.save(imgsrc)  # 保存截屏至本地
            image = Image.open(imgsrc)
            img = image.crop(position)   # 截取滑块验证码部分
            img.save(imgsrc)
            imgobj = r'D:\tmp\find111.jpg'   # 滑块缺失部分,自行截图
            match_result = matchImg(imgsrc, imgobj, 0.1)   # 匹配位置
            if match_result is None:
                continue
            print(match_result)
            X, Y = match_result['rectangle'][0]
            left = X
            print(left)
            slide_btn = browser.find_element_by_class_name('handler.handler_bg')  # 获取滑动按钮
            track = get_track(left)  # 获取滑动的轨迹,此函数定义在第9点
            move_to_gap(browser, slide_btn, track)  # 进行滑动,此函数定义在第10点
            success = browser.find_element_by_id('drag')  # 获取显示结果的标签
            time.sleep(2)
            if success.get_attribute('class') == "ok":
                login_btn = browser.find_element_by_xpath('//button[(text()="登录")]')  # 如果验证成功,则点击登录按钮
                login_btn.click()
                flag = 1
                break
            else:
                print(success.text)
                print('失败')
                time.sleep(1)
                continue
        if flag == 1:
            break
        browser.close()
Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐