完美实现验证码登录

# login_code.py


# 导包
from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep
from selenium.webdriver.chrome.options import Options
import pytesseract # 导入ocr库
from PIL import Image # 导入图像处理库
import ddddocr
# 定义类
class GetEle:
    def __init__(self,driver):
        self.driver=driver

    def login_name_psw(self,loc_name,loc_psw,loc_submit,login_name,login_psw):
        # 账号和密码输入
        driver.find_element(By.CSS_SELECTOR,loc_name).send_keys(login_name)
        driver.find_element(By.CSS_SELECTOR, loc_psw).send_keys(login_psw)
        driver.find_element(By.CSS_SELECTOR, loc_submit).click()



    def submit_login(self,loc):
        driver.find_element(By.CSS_SELECTOR, loc).click()

class CodePass:
    def __init__(self,driver):
        self.driver=driver
    def get_code(self,loc_code):
        # 获取全屏截图,获取坐标位置 ,截图保存
        # 第一步 ---------获取到验证码的位置,截图,获取坐标
        ele_cap = driver.find_element(By.CSS_SELECTOR, loc_code)
        # 获取元素的位置和大小
        location = ele_cap.location
        size = ele_cap.size
        print(f"获取验证码元素位置location:{location},获取验证码元素大小size:{size}")
        # 获取整个页面截图
        driver.save_screenshot("code.png")
        sleep(2)
        # 打开照片
        captcha_image = Image.open("code.png")
        # 获取验证码的上下左右坐标
        left = int(location['x'])
        top = int(location['y'])
        right = int(location['x'] + size['width'])
        bottom = int(location['y'] + size['height'])
        print(f"坐标展示 left:{left},top:{top},right:{right},bottom:{bottom}")
        # 第二步------------------利用坐标信息对截图图片做裁剪
        # 打开图片
        image = Image.open("code.png")

        # 裁剪图片
        cropped_image = image.crop((left, top, right, bottom))

        # 显示裁剪后的图片 因为show 会保持照片一直打开,直到被关闭, 所以注释掉了这个展示的动作
        # cropped_image.show()
        # 保存裁剪后的图片
        cropped_image.save("code.png")

        # 第三步-----------------------对截图做OCR识别

        # 实例化一个ocr
        ocr = ddddocr.DdddOcr()
        # 以二进制格式打开verf.png图片用于只读
        with open('code.png', 'rb') as f:
            # 用来读取文件
            img_bytes = f.read()
        # 识别图片中的内容
        res = ocr.classification(img_bytes)
        # 输出内容
        print('识别出的验证码为:' + res)
        return res
    def input_code(self,loc,res):
        # 找到元素,输入code,点击 登录
        driver.find_element(By.CSS_SELECTOR,loc).send_keys(res)

# 调用
if __name__ == '__main__':
    '''
    # 创建无头浏览器选项
    options = Options()
    options.add_argument("--headless")
    # 调用driver
    driver=webdriver.Chrome(options=options)
    '''
    driver = webdriver.Chrome()


    # url
    url=r"http://XXXX/forum.php"
    driver.get(url)
    # 实例化类
    web_e=GetEle(driver)

    # 调用登录
    loc_name='#ls_username'
    loc_psw='#ls_password'
    loc_submit='.pn.vm>em'
    login_name='sq123'
    login_psw='111111'
    web_e.login_name_psw(loc_name,loc_psw,loc_submit,login_name,login_psw)

    #  输入验证码
    sleep(3)
    print("进入第二阶段 输入验证码")
    c=CodePass(driver)
    code_loc = 'img[onclick*="updateseccode"]'
    res=c.get_code(code_loc)
    # 调用获取验证码
    input_code_loc = 'input[id*=seccodeverify]'

    c.input_code(input_code_loc,res)

    # 提交登录按钮
    submit_loc = '[name=loginsubmit]'
    web_e.submit_login(submit_loc)
    # 退出
    sleep(3)
    driver.quit()

 

posted @ 2023-09-28 19:07  胖豆芽  阅读(26)  评论(0编辑  收藏  举报