关于图片验证码的文章,我想大家都应该看过类似的文章了。加我VX:atstudy-js 回复“测试”,进入 自动化测试学习交流群~~
OCR
OCR是一种图像文字识别的技术,例如图中的验证码,我们用肉眼识别就是c5s3,但机器可不比咱们肉眼。所以我们要利用ocr技术,让我们的Python脚本自动通过图片识别出对应的文字。
常见的识别类库
在Python中其实有许多识别类库,这里只介绍博主自己实践过的成功率还不错的: 百度ocr。
简单的说,就是百度提供了一个SDK,让我们传入图片数据,从而拿到识别的结果。ocr的细节我们不需要关心。
申请开通OCR
首先我们得有一个百度账号,这个相信大家都有,没有的可以申请一个。
登录百度控制台,进入https://login.bce.baidu.com/并登录。
选择文字识别:
·appid
·apikey
·secret key
熟悉OCR文档
官方文档地址: https://cloud.baidu.com/doc/OCR/s/wkibizyjk
文档会写的比较清楚,简单的说就是通过你的appid,api key和secret key获取一个client,接着你就可以调用client的api去获取图片中的文字了。官方的SDK还是比较贴心的。
·安装 SDK
pip install baidu-aip
讲完了文字怎么识别,接着就来说说标题中的动态图片验证码。
动态图片验证码
这个概念是我自己命名的,一般来说,我们的一张图片都是对应唯一一个 url 的,比如:
https://yuque.com?image=dshqadiau
(这个地址是我编的)一般来说 image 字段的值不同,图片也就不同,都是一串随机的或者规律的不重复数据,确保图片不会重复。
但是博主最近遇到了这样一种情况:
输入一个 url,每次输入,拿到的图片都不一样。
这样就会带来一个很严重的问题,页面上你虽然读取了图片的信息。我们把图片的url 传递给百度 sdk 的时候,url 由于再次调用,导致图片发生了变化。
比如网站上显示的是: c5s3,调用百度 sdk 的时候,百度会通过 url 读取图片,但再次读取,图片可能变成了 lfew。
不信大家可以看看这个图片地址:
好在百度 sdk,他不仅仅支持 url,还支持图片文件和 base64 的图片数据。我们看看官方文档:
思考一下:
1.读取 img 标签的 src,然后下载图片,保存图片文件再转为 base64,很显然这个方法行不通,为什么呢?
因为 img 的 src 属性就是刚才这个 url,你去获取一遍 url,它同样会变化。
2.截图,裁剪出验证码部分,扔给百度去识别可行是可行,但是会不会太复杂了?
如果我只对验证码的 img 元素进行截图,生成 base64 的数据是不是更方便?
其实呢,selenium 作为一款老牌的自动化测试工具,很多方法供大于求了。所以它是有这样的功能的!
添加微信:atstudy-js 或者扫描下方二维码,备注“博客”邀请你进入Python自动化测试学习交流群~