pitón selenio códigos PIL grietas correderas

Hoy en día, el sitio de Cabo deslizar un código de verificación ha sido la sustitución gradual de código de verificación ordinaria
que sin duda aumentará la carga de trabajo del reptil
código de verificación de deslizamiento puede optimizar significativamente la experiencia del usuario, que en la era de Internet es muy importante.

A través de esta práctica he aprendido mucho
hoy hemos Bilibili un ejemplo para explicar el proceso de código de verificación a la grieta de diapositivas

Es necesario utilizar la biblioteca

from PIL import ImageChops, Image
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
import pyautogui
from time import sleep
import os

En primer lugar, el uso de selenio rellenar automáticamente el nombre de usuario, contraseña y haga clic en Inicio de sesión

driver = webdriver.Chrome()
ac = ActionChains(driver)
driver.implicitly_wait(3)
driver.get('https://passport.bilibili.com/login')
driver.maximize_window()
# 输入账号和密码
input1 = driver.find_element_by_xpath('//div//input[@id="login-username"]').send_keys('18888888888')
input2 = driver.find_element_by_xpath('//div//input[@id="login-passwd"]').send_keys('xxxxxxxx')
driver.find_element_by_xpath('//div/a[@class="btn btn-login"]').click()  # 点击登录按钮
sleep(1)

Obtener una imagen de fondo y los códigos de fondo con huecos deslizante

# 获取带缺口的图片
js = 'document.getElementsByClassName("geetest_canvas_slice")[0].className="geetest_canvas_slice geetest_absolute1"'
driver.execute_script(js)
img = driver.find_element_by_xpath('//*[@class="geetest_canvas_slice geetest_absolute1"]')
ac.context_click(img).perform()
pyautogui.typewrite(['enter', 'enter', 'enter'])

js clase utilizando la vida de la clase modificada para ocultar el control deslizante se puede conseguir fácilmente fondo mellado
Aquí Insertar imagen Descripción

# 获取完整的背景图片
js = 'document.getElementsByClassName("geetest_canvas_fullbg geetest_fade geetest_absolute")[0].style=""'
driver.execute_script(js)
img = driver.find_element_by_xpath('//*[@class="geetest_canvas_slice geetest_absolute1"]')
ac.context_click(img).perform()
pyautogui.typewrite(['enter', 'enter', 'enter'])

Y a continuación, obtener el fondo completo en el estilo de borrado

Aquí Insertar imagen Descripción

# 恢复出带缺口的图片便于滑动时是观察(可选)
js = 'document.getElementsByClassName("geetest_canvas_slice")[0].className="geetest_canvas_slice geetest_absolute"'
driver.execute_script(js)

Elimina los dos deslizadores anteriores, no es propicio para la observación, junto con estas dos frases pueden restaurar la diapositiva original, es decir la parte trasera nombre de la clase a la original

Comparar dos imágenes para encontrar la posición brecha para calcular el número de píxeles deslice

table = []
for i in range(256):
    if i < 50:
        table.append(0)
    else:
        table.append(1)


def compute_gap(img1, img2):
    """计算缺口偏移 这种方式成功率很高"""
    # 将图片修改为RGB模式
    img1 = img1.convert("RGB")
    img2 = img2.convert("RGB")

    # 计算差值
    diff = ImageChops.difference(img1, img2)

    # 灰度图
    diff = diff.convert("L")

    # 二值化
    diff = diff.point(table, '1')

    left = 42
    for w in range(left, diff.size[0]):
        lis = []
        for h in range(diff.size[1]):
            if diff.load()[w, h] == 1:
                lis.append(w)
            if len(lis) > 5:
                return w
# 从下载中获取两张图片
def get_images():
    bg = Image.open('C:/Users/yuaneuro/Downloads/下载.png')
    fullgb = Image.open('C:/Users/yuaneuro/Downloads/下载 (1).png')
    return bg, fullgb

Por último, escribir la función principal

def main():
    bg_img, fullbg_img = get_images()
    gap = compute_gap(fullbg_img, bg_img)
    print(gap)
    # 寻找滑块的元素
    slide = driver.find_element_by_xpath('//*[@class="geetest_slider_button"]')
    ac = ActionChains(driver)
    # 滑动操作(等待大佬更新滑动算法)
    ac.click_and_hold(slide).perform()
    ac.move_by_offset(gap - 10, 0.1).perform()  # 平行移动鼠标
    slide.click()
    ac.reset_actions()


if __name__ == '__main__':
    main()
    os.remove('C:/Users/yuaneuro/Downloads/下载.png')
    os.remove('C:/Users/yuaneuro/Downloads/下载 (1).png')

Aquí el código de verificación deslizante ha sido todavía actualizado para encontrar un método adecuado y eficaz para la pista de deslizamiento, siendo la alternativa más primitivo, el seguimiento de encontrar la vía de deslizamiento se puede utilizar con el nuevo!

El código completo

from PIL import ImageChops, Image
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
import pyautogui
from time import sleep
import os

driver = webdriver.Chrome()
ac = ActionChains(driver)
driver.implicitly_wait(3)
driver.get('https://passport.bilibili.com/login')
driver.maximize_window()
# 输入账号和密码
input1 = driver.find_element_by_xpath('//div//input[@id="login-username"]').send_keys('18888888888')
input2 = driver.find_element_by_xpath('//div//input[@id="login-passwd"]').send_keys('xxxxxxxx')
driver.find_element_by_xpath('//div/a[@class="btn btn-login"]').click()  # 点击登录按钮
sleep(1)
# 获取带缺口的图片
js = 'document.getElementsByClassName("geetest_canvas_slice")[0].className="geetest_canvas_slice geetest_absolute1"'
driver.execute_script(js)
img = driver.find_element_by_xpath('//*[@class="geetest_canvas_slice geetest_absolute1"]')
ac.context_click(img).perform()
pyautogui.typewrite(['enter', 'enter', 'enter'])
# 获取完整的背景图片
js = 'document.getElementsByClassName("geetest_canvas_fullbg geetest_fade geetest_absolute")[0].style=""'
driver.execute_script(js)
img = driver.find_element_by_xpath('//*[@class="geetest_canvas_slice geetest_absolute1"]')
ac.context_click(img).perform()
pyautogui.typewrite(['enter', 'enter', 'enter'])
# 恢复出带缺口的图片便于滑动时是观察(可选)
js = 'document.getElementsByClassName("geetest_canvas_slice")[0].className="geetest_canvas_slice geetest_absolute"'
driver.execute_script(js)
# OpenCV识别滑动验证码的缺口
table = []
for i in range(256):
    if i < 50:
        table.append(0)
    else:
        table.append(1)


def compute_gap(img1, img2):
    """计算缺口偏移 这种方式成功率很高"""
    # 将图片修改为RGB模式
    img1 = img1.convert("RGB")
    img2 = img2.convert("RGB")

    # 计算差值
    diff = ImageChops.difference(img1, img2)

    # 灰度图
    diff = diff.convert("L")

    # 二值化
    diff = diff.point(table, '1')

    left = 42
    for w in range(left, diff.size[0]):
        lis = []
        for h in range(diff.size[1]):
            if diff.load()[w, h] == 1:
                lis.append(w)
            if len(lis) > 5:
                return w

# 从下载中获取两张图片
def get_images():
    bg = Image.open('C:/Users/yuaneuro/Downloads/下载.png')
    fullgb = Image.open('C:/Users/yuaneuro/Downloads/下载 (1).png')
    return bg, fullgb


def main():
    bg_img, fullbg_img = get_images()
    gap = compute_gap(fullbg_img, bg_img)
    print(gap)
    # 寻找滑块的元素
    slide = driver.find_element_by_xpath('//*[@class="geetest_slider_button"]')
    ac = ActionChains(driver)
    # 滑动操作(等待大佬更新滑动算法)
    ac.click_and_hold(slide).perform()
    ac.move_by_offset(gap - 10, 0.1).perform()  # 平行移动鼠标
    slide.click()
    ac.reset_actions()


if __name__ == '__main__':
    main()
    os.remove('C:/Users/yuaneuro/Downloads/下载.png')
    os.remove('C:/Users/yuaneuro/Downloads/下载 (1).png')

Publicado 10 artículos originales · alabanza ganado 14 · vistas 3710

Supongo que te gusta

Origin blog.csdn.net/yuaneuro/article/details/104672600
Recomendado
Clasificación