如果你会这一招!全球百分之八十的验证码都可以忽略!Python真叼

验证码(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与注册功能集成

  • 发表于:
  • 原文链接:http://kuaibao.qq.com/s/20180306A1IE0I00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券