PythonRPA自动识别登录验证码

用于自动识别类似这样的登录页验证码

一、准备工作

更新pip

python -m pip install --upgrade pip -i https://pypi.douban.com/simple

下载“带带弟弟OCR” Github地址:https://github.com/sml2h3/ddddocr

该库需要安装几个依赖库:

import onnxruntime
import PIL
import cv2

安装onnxruntime库

当时安装这个库搞了老半天,python这些不常见的库对小白是真的不友好,真麻烦。

我这里本地环境是python3.10,但是这个库好像没有能兼容python3.10的版本

搞了半天都没能安装上,于是只好安装个python3.9

安装好python3.9后,在pycharm内和pip都没能安装上…

只好找国内源手动下载安装:

https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple/onnxruntime/

我这里下载的是最后一个onnxruntime-1.9.0-cp39-cp39-win_amd64.whl

说明一下这个文件名中的cp39代表支持python3.9win代表windows系统,amd64代表64位操作系统

下载后放在项目目录内,打开cmd切换到当前目录

pip install .\onnxruntime-1.11.0-cp39-cp39-win_amd64.whl

输入命令,安装

这个安装完可能会安装在python3.9根目录下的Python39\Lib\site-packages目录内

这里我也懒得查怎么配置了,直接复制到项目目录内的,后面涉及到安装库的时候我都是复制进项目目录的。

安装PIL库

安装这个库的时候也遇到了不少问题…总之就是正常pip install PIL安装不上

搜到了个能安装的命令

pip install pillow

输入命令,安装低版本PIL

安装cv2库

这个库也是在pycharm里搜了半天,pip半天也没安装上,一搜这个库的全名叫opencv-python

我这里是国内源的安装命令

 pip install opencv-python -i http://pypi.douban.com/simple --trusted-host pypi.douban.com

安装不上的可以下载库文件手动安装:
https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple/opencv-python/

至此,准备工作完毕。

二、代码示例

import warnings
import time
import ddddocr
import onnxruntime
import cv2

from PIL import Image
from selenium import webdriver
from selenium.webdriver.chrome.service import Service

# RPA自动识别图片验证码demo

# 屏蔽warning警告输出
warnings.filterwarnings('ignore')

s = Service(r"C:\Program Files\Google\Chrome\Application\chromedriver.exe")
driver = webdriver.Chrome(service=s)
driver.set_window_size(1200, 1000)
driver.implicitly_wait(10)
driver.get('你要访问的登录地址')
driver.find_element_by_id('username').send_keys('admin')
driver.find_element_by_id('password').send_keys('123456')
driver.find_element_by_id('login-btn').click()

time.sleep(2)

# 获取验证码图片对象
img_ele = driver.find_element_by_xpath('/html/body/div[3]/div/div[2]/div/div[1]/div[2]/div[1]/img')

# 登录页面截图
driver.save_screenshot("pic.png")#可以修改保存地址

# 获取网页验证码坐标
left = img_ele.location['x']    # x点(左下角)坐标
top = img_ele.location['y']     # y点(左上角)坐标
right = img_ele.size['width'] + left    # 右上角点坐标
down = img_ele.size['height'] + top     # 右下角点坐标

# 打开截图
image = Image.open('pic.png')

# 将验证码根据坐标截取出来
code_img = image.crop((left, top, right, down))
code_img.save('codeimg.png')

# OCR识别图片验证码
ocr = ddddocr.DdddOcr()
with open('codeimg.png', 'rb') as f:
    image = f.read()

# 获取识别结果
res = ocr.classification(image)
print(res)
# 输出>>> mvn0

但这个库的识别成功率还是挺低的, 这里写了一个递归函数, 可以循环识别, 直到识别成功

import warnings
import time
import ddddocr
import onnxruntime
import cv2

from PIL import Image
from selenium import webdriver
from selenium.webdriver.chrome.service import Service

# 识别成功标识
is_success = 0

def ddocr():
    # 登录页面截图
    driver.save_screenshot("pic_window.png")  # 可以修改保存地址

    # 打开截图
    image = Image.open('pic_window.png')

    # 将验证码根据坐标截取出来
    code_img = image.crop((left, top, right, down))
    code_img.save('pic_code.png')

    # OCR识别图片验证码
    ocr = ddddocr.DdddOcr()

    # 打开截取的验证码图片
    with open('pic_code.png', 'rb') as f:
        image = f.read()

    # 获取识别结果
    code = ocr.classification(image)
    print('识别结果:', code)

    time.sleep(1)
    # 填入验证码
    driver.find_element_by_xpath('/html/body/div[3]/div/div[2]/div/div[1]/div[2]/input').send_keys(code)
    # 点击确认按钮
    driver.find_element_by_xpath('/html/body/div[3]/div/div[2]/div/div[3]/div/button[2]').click()

    time.sleep(1)

    # 判断弹窗提示元素是否存在
    # element: 弹窗对象
    def isElementExistence(element):
        try:
            element = driver.find_element_by_class_name(element)
        except NoSuchElementException as E:
            # print("弹窗不存在")
            return False
        else:
            # print("弹窗存在")
            return True

    # 判断弹窗提示元素是否存在
    isset_alert = isElementExistence('message')
    
    # 如果有验证码输入错误的弹窗出现,判断弹出信息来选择对应操作
    if isset_alert is True:
        alert = driver.find_element_by_class_name('message').text
        print(alert)
        if alert == '验证码输入错误':
            time.sleep(3)
            # 点击登录
            driver.find_element_by_xpath('//*[@id="app"]/div/div[1]/span').click()
            ddocr()
        elif alert == '请输入验证码':
            time.sleep(3)
            # 点击看不清换一张
            driver.find_element_by_xpath('/html/body/div[3]/div/div[2]/div/div[1]/div[2]/div[2]/span').click()
            ddocr()
        else:
            print('未知错误')
    else:
        print('图片验证码识别成功')
        global is_success
        is_success = 1


# 执行递归函数,识别验证码
ddocr()
# 识别成功打印成功标识
print(is_success)

# 开始写登录后的代码
if is_success == 1:
    print('已识别验证码, 登录成功')
else:
    print('识别失败')

风影OvO

风影OvO, 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA 4.0协议进行授权 | 转载请注明原文链接

留下你的评论

*评论支持代码高亮<pre class="prettyprint linenums">代码</pre>

相关推荐