验证码(CAPTCHA)全称为全自动区分计算机和人类的公开图灵测试(Completely Automated Public Turing test to tell Computersand Humans Apart)。从其全称可以看出,验证码用于测试用户是真实的人类还是计算机机器人。
1.获得验证码图片
每次加载注册网页都会显示不同的验证验图像,为了了解表单需要哪些参数,我们可以复用上一章编写的parse_form()函数。
在本例中,这是一张进行了Base64编码的PNG图像,这种格式会使用ASCII编码表示二进制数据。我们可以通过在第一个逗号处分割的方法移除该前缀。然后,使用Base64解码图像数据,回到最初的二进制格式。要想加载图像,PIL需要一个类似文件的接口,所以在传给Image类之前,我们以使用了BytesIO对这个二进制数据进行了封装。
完整代码:
2.光学字符识别验证码
光学字符识别(Optical Character Recognition, OCR)用于图像中抽取文本。本节中,我们将使用开源的Tesseract OCR引擎,该引擎最初由惠普公司开发的,目前由Google主导。Tesseract的安装说明可以从http://code.google.com/p/tesseract-ocr/wiki/ReadMe获取。然后可以使用pip安装其Python封装版本pytesseractpip install pytesseract。
下面我们用光学字符识别图像验证码:
如果直接把验证码原始图像传给pytesseract,一般不能解析出来。这是因为Tesseract是抽取更加典型的文本,比如背景统一的书页。下面我们进行去除背景噪音,只保留文本部分。验证码文本一般都是黑色的,背景则会更加明亮,所以我们可以通过检查是否为黑色将文本分离出来,该处理过程又被称为阈值化。
这里只有阈值小于1的像素(全黑)都会保留下来,分别得到三张图像:原始验证码图像、转换后的灰度图和阈值化处理后的黑白图像。最后我们将阈值化处理后黑白图像再进行Tesseract处理,验证码中的文字已经被成功抽取出来了。
我们通过示例样本测试,100张验证码能正确识别出90张。
下面是注册账号完整代码:
我们可以进一步改善OCR性能:
- 实验不同阈值
- 腐蚀阈值文本,突出字符形状
- 调整图像大小
- 根据验证码字体训练ORC工具
- 限制结果为字典单词
3.用API处理复杂验证码
为了处理更加复杂的图像,我们将使用验证处理服务,也叫打码平台。
3.1 9kw打码平台
先到9kw打码平台注册一个个人账号https://www.9kw.eu/register.html
登录后,定位到https://www.9kw.eu/usercaptcha.html 手工处理其他用户验证码获得积分
创建API key https://www.9kw.eu/index.cgi?action=userapinew&source=api
3.1.1 提交验证码
提交验证码参数:
- URL: https://www.9kw.eu/index.cgi(POST)
- action:POST必须设为:’usercaptchaupload’
- apikey:个人的API key
- file-upload-01:需要处理的图像(文件、url 或字符串)
- base64:如果输入的是Base64编码,则设为“1”
- maxtimeout:等待处理的最长时间(60~3999)
- selfsolve:如果自己处理该验证码,则设为“1”
返回值:
- 该验证码的ID
3.1.2 请求已提交验证码结果
请求结果的参数:
- URL: https://www.9kw.eu/index.cgi(GET)
- action:GET必须设为:’usercaptchacorrectdata’
- apikey:个人的API key
- id:要检查的验证码ID
- info:若设为“1”,没有得到结果时返回“NO DATA”(默认返回空)
返回值:
- 要处理的验证码文本或错误码
错误码:
- 0001:API key不存在
- 0002:没有找到API key
- 0003:没有找到激活的API key
……
- 0031:账号被系统禁用24小时
- 0032:账号没有足够的权限
- 0033:需要升级插件
3.1.2与注册功能集成
领取专属 10元无门槛券
私享最新 技术干货