找回密码
 会员注册
查看: 30|回复: 0

教你python自动识别图文验证码的解决方案!

[复制链接]

2万

主题

0

回帖

6万

积分

超级版主

积分
64454
发表于 2024-9-12 11:52:57 | 显示全部楼层 |阅读模式
验证码识别解决方案对于web应用程序来讲,处于安全性考虑,在登录的时候,都会设置验证码,验证码的类型种类繁多,有图片中辨别数字字母的,有点击图片中指定的文字的,也有算术计算结果的,再复杂一点就是滑动验证的。诸如此类的验证码,对我们的系统增加了安全性的保障,但是对于我们测试人员来讲,在自动化测试的过程中,无疑是一个棘手的问题。如果对软件测试、接口、自动化、性能测试、测试开发、面试经验交流。感兴趣可以加裙485187702,群内会有不定期的发放免费的资料链接,这些资料都是从各个技术网站搜集、整理出来的,如果你有好的学习资料可以私聊发我,我会注明出处之后分享给大家。1、web自动化验证码解决方案一般在我们测试过程中,登录遇到上述的验证码的时候,有以下种解决方案:第一种、让开发去掉验证码第二种、设置一个万能的验证码第三种、通过cookie绕过登录第四种、自动识别技术识别验证码2、自动识别技术识别验证码前三种解决方案,想必大家都比较了解,本文重点阐述第四种解决方案,也就是验证码的自动识别,关于验证码识别这一块,可以通过两个方案来解决,第一种是:OCR自动识别技术,第二种是:通过第三方打码平台的接口来识别。OCR识别技术OCR中文名称光学识别,tesseract是一个有名的开源OCR识别框架,它与Leptonica图片处理库结合,可以读取各种格式的图像并将它们转化成超过60种语言的文本,可以不断训练自己的识别库,使图像转换文本的能力不断增强。如果团队深度需要,还可以以它为模板,开发出符合自身需求的OCR引擎。那么接下来给大家介绍一下如何使用tessract来识别我们的验证码。关于OCR自动识别这一块,需要大家安装Tesseract,并配置好环境,步骤如下1)、安装tesseract适用于Tesseract3.05-02和Tesseract4.00-beta的Windows安装程序下载地址:github.com/UB-Mannheim…2)、加入培训数据tesseract默认只能识别英文,如果您想要识别其他语言,则需要下载相应的培训数据下载地址:github.com/tesseract-o…下图为中文数据包我们只做中文,暂时下载一个中文的文字训练数据就可以,然后将.traineddata文件复制到安装之后的'tessdata'目录中。C:\OCR\Tesseract-OCR\tessdata3)、配置环境变量要从任何位置访问tesseract-OCR,您可能必须将tesseract-OCR二进制文件所在的目录添加到Path变量中C:\OCR\Tesseract-OCR。安装后tesseract之后,并不能直接在python中使用,我们要想在python中使用,需要安装pytesseract模块我们可以通过pip安装pipinstallpytesseractpython中识别验证码图片内容安装好后。找一张验证码图片,如下图(命名为test.jpg),放在当前python文件同级目录下面,使用PIL中的Image中的open方法打开验证码图片,调用pytesseract.image_to_string方法,可以识别图片中的文字,并且转换成字符串,如下面代码所示。importpytesseractfromPILimportImagepic=Image.open('test.jpg')pic为打开的图片,lang指定识别转换的语言库text=pytesseract.image_to_string(pic,lang='chi_sim')print(text)通过上述方法能识别简单的验证码,但是存在一定的问题,识别的精度不高,对于一些复杂一点,有干扰线的验证码无法正确识别出结果。接下来给大家介绍一下第二种识别的方案,第三方的打码平台识别打码平台识别验证码第三方的打码平台相对于OCR来讲,优势在于识别的精准度高,网络上的第三方打码平台很多,百度随便一搜就有几十个,这个给大家列举几个,如下所示:网络上的第三方打码平台众多,这里小编选择超级鹰这个第三方的平台来给大家做演示。首先登录我们需要注册登录超级鹰这个网站 www.chaojiying.com,进入之后我们找到python对应的开发文档并下载, 下载开发文档下载之后解压缩,得到如下文件第三方打码平台的接口分析我们打开chaojiying.py这个文件后,会发现这个文件中给出了的接口非常简单,如下所示首先第一步创建一个用户对象:三个参数(账号,密码,软件ID),账号密码就是该网站的账号密码,那么软件ID呢?软件ID我们可以在用户中心找到软件ID,然后进去点击生成一个软件ID(如下图),第二行代码就是打开一个要识别的验证码图片,并读取内容,第三行,调用PostPic方法识别验证码,两个参数(验证码图片内容,验证码类型),关于验证码类型,请参考该网站的价格体系(如下图),根据验证码类型选择对应的数值传入。结果提取:PostPic返回的是一个字典类型的数据,识别的验证码在该字典中的pic_str这个键中res=cjy.PostPic(im,1902)#1902验证码类型官方网站>>价格体系3.4+版print后要加()data=res['pic_str']print(data)第三方接口给大家介绍到这里,接下来我们实际应用到登录中去。提示:打码平台一般都是收费的(差不多是一分钱,识别一次)3、自动识别验证码登录案例登录案例接下来以超级鹰这个网站为列,使用web自动化测试框架selenium来实现验证码识别自动登录,需要用到的库有selenium、pillow、time,和我们上面下载的超级鹰的接口文件环境安装1、selenium安装pipinstallselenium2、chromedriver安装下载地址chromedriver.storage.googleapis.com/index.html 下载和自己chrome浏览器对应的chromedriver版本,配置环境变量3、pillow模块安装(处理图像的库)pipinstallpillow实现步骤分析1、获取账号密码输入框:输入账号密码2、获取验证码图片将当前页面截图选择图片元素,获取上下左右位置使用PIL模块对页面图片进行再次截图(获取验证码图片)将验证码图片保存3、调用第三方接口识别验证码4、输入验证码结果5、点击登录1具体代码实现1、selenium打开登录页面importtimefromseleniumimportwebdriverfromPILimportImagefromchaojiyingimportChaojiying_Client​创建一个浏览器browser=webdriver.Chrome()访问登录页面url='www.chaojiying.com/user/mysoft…'browser.get(url)time.sleep(1)#暂停一秒钟2、获取账号密码输入框:输入账号密码选择账号、密码输入栏,输入对应的账号密码input_user=browser.find_element_by_xpath('/html/body/div[3]/div/div[3]/div[1]/form/p[1]/input')输入账号input_user.send_keys('账号')input_pwd=browser.find_element_by_xpath('/html/body/div[3]/div/div[3]/div[1]/form/p[2]/input')输入密码input_pwd.send_keys('密码')2、获取验证码图片将当前页面截图对当前页面进行截图browser.save_screenshot('login.png')选择图片元素,获取上下左右位置选择验证码图片的元素yzm_btn=browser.find_element_by_xpath('/html/body/div[3]/div/div[3]/div[1]/form/div/img')获取图片元素的位置loc=yzm_btn.location获取图片的宽高size=yzm_btn.size获取验证码上下左右的位置,此处要注意查看电脑显示的缩放比列(如下图),根据比列乘以相应的系数,我这边的显示比列是125,那么对于的系数就是1.25(如果你的是150,那么就乘以1.5)left=loc['x']*1.25#计算左边界top=loc['y']*1.25#计算上边界right=(loc['x']+size['width'])*1.25#计算右边界botom=(loc['y']+size['height'])*1.25#计算下边界将上下左右边界值放到元祖中(注意顺序:左上右下)local=(left,top,right,botom)使用PIL模块对页面图片进行再次截图(获取验证码图片),将验证码图片保存pic=PIL.Image.open('file')pic.crop(local)pic.sava('zym,png')3、调用第三方接口识别验证码识别验证码cjy=Chaojiying_Client('账号','密码','软件ID')#用户中心>>软件ID生成一个im=open('yzm.png','rb').read()#本地图片文件路径来替换a.jpg有时WIN系统须要//res=cjy.PostPic(im,1902)#1902验证码类型data=res['pic_str']print(data)4、输入验证码结果在输入框输入验证码yzm_input=browser.find_element_by_xpath('/html/body/div[3]/div/div[3]/div[1]/form/p[3]/input')yzm_input.send_keys(data)5、点击登录点击登录submit=browser.find_element_by_xpath('/html/body/div[3]/div/div[3]/div[1]/form/p[4]/input')submit.click(importtimefromseleniumimportwebdriverfromPILimportImagefromchaojiyingimportChaojiying_Client​创建一个浏览器browser=webdriver.Chrome()访问登录页面url='www.chaojiying.com/user/mysoft…'browser.get(url)time.sleep(1)#暂停一秒钟选择账号、密码输入栏,输入对应的账号密码input_user=browser.find_element_by_xpath('/html/body/div[3]/div/div[3]/div[1]/form/p[1]/input')input_user.send_keys('qq121292679')input_pwd=browser.find_element_by_xpath('/html/body/div[3]/div/div[3]/div[1]/form/p[2]/input')input_pwd.send_keys('546245426')获取验证码的图片,并进行识别,将识别的结果,输入到验证码输入框中对当前页面进行截图browser.save_screenshot('login.png')选择验证码图片的元素yzm_btn=browser.find_element_by_xpath('/html/body/div[3]/div/div[3]/div[1]/form/div/img')获取图片元素的位置loc=yzm_btn.location获取图片的宽高size=yzm_btn.size获取验证码上下左右的位置left=loc['x']*1.25top=loc['y']*1.25right=(loc['x']+size['width'])*1.25botom=(loc['y']+size['height'])*1.25val=(left,top,right,botom)打开网页截图login_pic=Image.open('login.png')通过上下左右的值,去截取验证码yzm_pic=login_pic.crop(val)yzm_pic.save('yzm.png')​识别验证码cjy=Chaojiying_Client('qq121292679','546245426','96001')#用户中心>>软件ID生成一个替换96001im=open('yzm.png','rb').read()#本地图片文件路径来替换a.jpg有时WIN系统须要//res=cjy.PostPic(im,1902)#1902验证码类型官方网站>>价格体系3.4+版print后要加()data=res['pic_str']print(data)​在输入框输入验证码yzm_input=browser.find_element_by_xpath('/html/body/div[3]/div/div[3]/div[1]/form/p[3]/input')yzm_input.send_keys(data)​​点击登录submit=browser.find_element_by_xpath('/html/body/div[3]/div/div[3]/div[1]/form/p[4]/input')submit.click()​最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:​这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2024-12-28 06:36 , Processed in 1.306653 second(s), 26 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表