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