Python通用验证码识别OCR库之ddddocr验证码识别
作者:虫师 发布时间:2021-05-16 22:55:00
前言
相信做自动化测试的同学一定不可忽视的问题就是验证码,他几乎是一个网站登录的标配,当然,我一般是不建议在这上面浪费时间去做识别的。
举个例子,现在你的目的是进入自己家的房子,房子为了防止小偷进入于是上了一把锁。我们没必要花费力气去研究开锁技术。去找锁匠配置一把万能钥匙(让开发设置验证码的万能码),或者干脆先去上锁匠把验证码去掉(让开发暂时屏蔽验证码)。严格来说识别验证码不是我们自动化测试的重点。除非你是验证码厂商的员工,破解识别验证码是你的工作。
那么,如果有很简单的方式去识别验证码的话,我们其实就可以不用麻烦开发针对验证码做屏蔽开关了。
ddddocr: 带带弟弟OCR通用验证码识别SDK 就是这样一款强大验证码识别工具。
为什么我会想到:hhhhhhhh 红红火火恍恍惚惚, 哈哈~!
传统验证码
传统验证就是数字、字母、汉字等,把背景搞得模糊一些,这些验证码在他前面就是个弟弟。
以第一个为例,要想识别他非常容易了。
import?ddddocr
ocr?=?ddddocr.DdddOcr(old=True)
#?第一个验证截图保存:verification_code_1.png
with?open("./verification_code_1.png",?'rb')?as?f:
????image?=?f.read()
res?=?ocr.classification(image)
print(res)
运行结果:
iepv
滑动验证码
当然,传统验证码现在已经比较少网站在使用了,几年前开始流行滑动验证码,当时,也有类似的识别方案,主要通过selenium模拟滑动。
首先,需要准备两张图片
有缺口的图片
滑块缝合的图片
import?ddddocr
import?cv2
slide?=?ddddocr.DdddOcr(det=False,?ocr=False)
#?滑块缝合的图片
with?open('./verification_code_2-2.png',?'rb')?as?f:
????target_bytes?=?f.read()
#?有缺口的图片
with?open('./verification_code_2-1.png',?'rb')?as?f:
????background_bytes?=?f.read()
#?滑块缝合的图片
img?=?cv2.imread("./verification_code_2-2.png")
res?=?slide.slide_comparison(target_bytes,?background_bytes)
print(res)
运行结果
{'target': [17, 78]}
从文档中没找到这个坐标是滑块的初始坐标还是滑到正确位置的坐标。
当然,这种方案想要运行到自动化中还是比较难的,首先我们很难得到滑块缝合的图片,除非你将验证码的所有图片和缺口图片都保存下来,当验证码随机生成一张图片后,先截图和本地保存的图片对比,然后,找到对应的滑块缝合的图片。通过ddddocr找到元素坐标。
总之,太麻烦了,我选择放弃~!
文字点选验证码
这种验证码现在也比较常见,我们需要按照顺序点击图片中的文字。
import?ddddocr
import?cv2
det?=?ddddocr.DdddOcr(det=True)
#?验证码图片
with?open("./verification_code_3.png",?'rb')?as?f:
????image?=?f.read()
poses?=?det.detection(image)
print(poses)
#?验证码图片
im?=?cv2.imread("verification_code_3.png")
for?box?in?poses:
????x1,?y1,?x2,?y2?=?box
????im?=?cv2.rectangle(im,?(x1,?y1),?(x2,?y2),?color=(0,?0,?255),?thickness=2)
#?结果图片
cv2.imwrite("result.jpg",?im)
运行结果:
[[17,?28,?82,?92],?[55,?95,?118,?158],?[39,?160,?103,?222]]
这里给出的坐标就是识别的三个文字的图片坐标。
这种方案同样会面临两个问题;
文字的识别顺序不一定是要你点击的顺序。例如识别出来的文字顺序是: 荷叶饭, 验证码可能提示你点击的顺序是:叶饭荷。
生成的坐标只是图片的坐标,不管是web还是app,验证码图片只是屏幕的一部分,除非你截取整个屏幕。那么识别率就无法控制了。
来源:https://mp.weixin.qq.com/s/YUao5je6-7rbos_fA_Y_pA


猜你喜欢
- virtualenv与virtualenvwrapper当涉及到python项目开发时为了不污染全局环境,通常都会使用环境隔离管理工具vir
- 项目场景:最近在部署项目之后,运行出现报错:Expression #1 of SELECT list is not in GROUP BY
- 测试配置文件test.conf内容如下:[first]w = 2v: 3c =11-3[second]sw=4test: hello测试配置
- 1)按笔画排序select * from Table order by nlssort(columnName,'NLS_SORT=S
- Oracle shutdown的时候突然断电,导致使用sql/plus启动时无法连接到数据库,具体描述为:connection can no
- python程序结构python“一切皆对象”,这是接触python听到最多的总结了。在python中最基层的单位应该就是对象了,对象需要靠
- 本文实例讲述了python实现根据月份和日期得到星座的方法。分享给大家供大家参考。具体实现方法如下:#计算星座def Zodiac(mont
- 由于asp中是使用双引号作为字符串的开始和结束标志的,单一个字符串中的双引号出现次数大于两个时,程序就有可能运行错误。asp中是怎么输出引号
- 函数使用def base64_to_image(base64_code): img_data = base64.b
- 在python中,我们定义好一个字符串,如下所示。在python中定义个字符串然后把它赋值给一个变量。我们可以通过下标访问单个的字符,跟所有
- 我想大多数的人在编写ASP程序的时候,都碰到过类似的错误信息: Error Number -> 
- 一、通知方式有哪些?常见的通知方式有:邮件,电话,短信,微信。短信和电话:通常是收费的,较少使用;邮件:适合带文件类型的通知,较正式,存档使
- 由于需要处理xlsx类型的文件,我使用了openpyxl来处理,然而文件比较大,大约有60多MB。读文件的时候虽然慢了一点,但还是能够读出来
- 前言众所周知,jquery在我们日常开发中的使用频率非常高,与js相比,我们省去了冗长的获取元素的代码,不用考虑一些麻烦的兼容问题,更加方便
- 简单的测试用例#!/usr/bin/python# -*- coding: UTF-8 -*-import timefrom pymongo
- 问题:例如我们要选从不同省份选取一个号码,每个省份的权重不一样,直接选随机数肯定是不行的了,就需要一个模型来解决这个问题。简化成下面的问题:
- MySQL是一种开放源代码的关系型数据库管理系统(RDBMS),MySQL数据库系统使用最常用的数据库管理语言--结构化查询语言
- 1.算法概述决策树算法是在已知各种情况发生概率的基础上,通过构成决策树来求取净现值的期望值大于等于零的概率,评价项目风险,判断其可行性的决策
- 自动依赖注入在 AbpBase.Web 的 AbpBaseWebModule 中,添加一个函数:此函
- 一步步教你怎么用Python画雪人,进一步熟悉Python的基础画图操作,废话不多说,上代码。希望您给个关注给个赞,也算对我们的支持了。cl