Использование Python + Selenium для реализации входа в симуляцию сканера (1)

Python

Введение

Буквально несколько дней назад друг постоянно жаловался, что ему нужно скачивать файлы через разные учетные записи, когда он работает.Он постоянно спрашивал меня, могу ли я помочь написать простой инструмент автоматизации для его реализации.Как раз, когда наступил праздник Праздника лодок-драконов, Я просто изучал Python + Selenium. Вот о чем этот блог.

детали реализации

  • Создать проект

Это использованиеPycharm CE Выполняется инструмент разработки, и для создания проекта выбирается соответствующая версия Python.image.pngновыйPackageи создатьlogin.py файл, который__init___.pyЭто самогенерируемый файл, и его не нужно беспокоить.image.png

image.png

  • библиотека импорта

ОткрытымFileВходитьNew Projects Settings Preferences | Python Interpreter image.pngНажмите знак +, чтобы загрузить библиотеки, которые вам нужно использовать на этот раз:selenium,PIL,pytesseract,cv2 image.png

  • Напишите бизнес-код

существуетlogin.pyВ файле скачанная выше библиотека импортируется в шапку файла

from selenium import webdriver 
from selenium.webdriver.support.ui import WebDriverWait
from PIL import Image
import pytesseract
import cv2 as cv

при созданииmianфункцию и определить параметры, которые будут использоваться далее, на основеSeleniumДолжен быть указан соответствующий драйвер браузера.Нажмите на меня, чтобы загрузить драйвер=


if __name__ == "__main__":
    chromedriver_path = "/Users/mac/Source code/py/pythonProject/venv/lib/python3.8/site-packages/selenium/webdriver/chromedriver" #改成你的chromedriver的完整路径地址
    # 定义你的账号/密码
    username = "改成你的用户名" #用户名
    password = "改成你的密码" #密码

Создатьinvestorservice_infoкласс и инициализироватьwebdriverи параметры

class investorservice_info:
    def __init__(self):
        # 提前定义url 进行以便在login 函数中进行使用
        url = 'https://investorservice.cfmmc.com/'
        self.url = url
        options = webdriver.ChromeOptions()
        # options.add_experimental_option("prefs", {"profile.managed_default_content_settings.images": 2}) # 不加载图片,加快访问速度
        options.add_experimental_option('excludeSwitches', ['enable-automation']) # 此步骤很重要,设置为开发者模式,防止被各大网站识别出来使用了Selenium
        self.browser = webdriver.Chrome(executable_path=chromedriver_path, options=options)
        self.browser.set_window_size(1024, 768)  # 分辨率 1024*768
        self.wait = WebDriverWait(self.browser, 10) #超时时长为10s

СоздаватьloginФункция, укажите URL-адрес, который нужно открыть, тот, который необходимо просканироватьhtmlУзел передает пользователя, пароль и т. д., которые нам нужно заполнить

    # 登录
    def login(self):
        # 打开网页
        self.browser.get(self.url)
        # 清空输入框并填入账号密码
        self.browser.find_element_by_name('userID').clear()
        self.browser.find_element_by_name('userID').send_keys(username)
        self.browser.find_element_by_name('password').clear()
        self.browser.find_element_by_name('password').send_keys(password)

Тогда указанные вышеelementКак мы его сканируем? , на самом деле поchromeОткройте кнопку «Дополнительно» в правом верхнем углу -> дополнительные инструменты -> инструменты разработки.

image.pngНайдите узел, например, в приведенном выше коде.userIDизвестно, чтоnameпройти черезfind_element_by_nameВы можете найти узел, и вам нужно установить учетную запись и пароль.image.pngПосле установки пароля учетной записи следующим шагом будет код подтверждения. Поскольку код подтверждения является изображением, необходимо использовать технологию распознавания изображений. Вот простое использованиеcv2а такжеpytesseractидентифицировать. Сначала определитеrecognize_textфункция для установки различных параметров, таких как оттенки серого распознанного изображения

     # 图像识别
    def recognize_text(self,image):
        # 边缘保留滤波  去噪
        blur = cv.pyrMeanShiftFiltering(image, sp=8, sr=60)
        cv.imshow('dst', blur)
        # 灰度图像
        gray = cv.cvtColor(blur, cv.COLOR_RGB2GRAY)
        # 二值化  设置阈值  自适应阈值的话 黄色的4会提取不出来
        ret, binary = cv.threshold(gray, 185, 255, cv.THRESH_BINARY_INV)
        print(f'二值化设置的阈值:{ret}')
        cv.imshow('binary', binary)
        # 逻辑运算  让背景为白色  字体为黑  便于识别
        cv.bitwise_not(binary, binary)
        cv.imshow('bg_image', binary)
        # 识别
        test_message = Image.fromarray(binary)
        test_message.save('new.png')
        text = pytesseract.image_to_string(test_message)
        print(f'识别结果:{text}')
        return text

Сделайте отдельный скриншот текущего узла и сохраните его в корневой каталог проекта.cvСделать звонок для чтения скриншотаrecognize_textфункция для разбора.

PS:CV指的是OpenCV

        code =  self.browser.find_element_by_id("imgVeriCode")
        code.screenshot('imgVeriCode.png') # 针对当前节点进行单独截图
        src = cv.imread('/Users/mac/Source code/py/pythonProject/imgVeriCode.png')
        cv.imshow('input image', src)
        vericode = self.recognize_text(src) #获取验证码文字    
        # 清空输入框并填入验证码
        self.browser.find_element_by_name('vericode').clear()
        self.browser.find_element_by_name('vericode').send_keys(vericode) 

С помощью описанных выше шагов были введены имя пользователя, пароль и проверочный код. Следующим шагом является определение местоположения узла и имитация щелчка для входа в систему.

        # 找到点击按钮节点,并点击按钮。
        self.browser.find_element_by_class_name('buttonLogin').click() 
  • Подтвердить и протестировать

屏幕录制2021-06-14 上午12.13.24.2021-06-14 00_26_44.gif

Эпилог

  • Точность проверочного кода, идентифицированного OpenCv, на этот раз очень низкая.
  • Используемый на этот раз Selenium представляет собой автоматизированную среду тестирования, и к API можно обращаться отдельно.
  • На этот раз это просто логин и особых технических сложностей нет.Жду в следующий раз полный разбор проверочного кода и загрузку файла.
  • Последний веб-сайт, использованный на этот раз, является просто демонстрацией и не имеет никакого значения.