此文已由作者杨杰授权网易云社区发布。
欢迎访问网易云社区,了解更多网易技术产品运营经验。
全自动区分计算机和人类的图灵测试(Completely Automated Public Turing test to tell Computers and Humans Apart,简称CAPTCHA),俗称验证码,是一种区分用户是计算机和人的公共全自动程序。验证码的主要目的是强制人机交互来抵御机器自动化攻击,为了确保服务器系统的稳定和用户信息的安全,越来越多的网站采用了验证码技术。图片验证码是目前最常用的一种,本文也主要讨论这种验证码的识别。
最近在一个爬虫项目中遇到了验证码,需要机器自动识别绕过。这些验证码大都分辨率都较低,本身信息量不大。通常被加入一种或多种干扰因素:各种背景干扰,噪声点像素,字体形变和累叠,字符位置随机及个数不定,反色等情况。在网上调研了资料和文献后,分别采用OCR识别和模板库匹配方法对不同类型验证码进行了识别。主要过程可以分解为三个步骤:1.图片清理,2.字符切分,3.字符识别。以下结合工作经验和调研内容讲解一些常用的验证码识别方法和过程。
1.图片清理
图片清理是为接下来的机器学习或模板匹配阶段做准备的,指通过灰度化、二值化、干扰点清理等过程,得到比较干净的图片数据,具体样例见下表。
以(图A),和(图B)为例,对应直方图分别为直方图A和直方图B,图A对应的动态阈值取127,而图B的动态阈值则取241比较合适。
3. OCR软件识别
我们使用的是开源的OCR识别引擎Tesseract,初期由HP实验室研发,后来贡献给了开源软件业,后经由Google进行优化并重新发布。调用代码以及识别效果如下:
api = tesseract.TessBaseAPI()
api.Init(".","eng",tesseract.OEM_TESSERACT_ONLY) #初始化
api.SetPageSegMode(tesseract.PSM_SINGLE_LINE) #设置为单行字符串模式
api.SetVariable("tessedit_char_whitelist", whitelist) #设置白名单
stringOCR = tesseract.ProcessPagesBuffer(mBuffer, len(mBuffer), api)
4.模板库匹配
4.1 建立字符模板库
首先需要针对目标网站收集大量的验证码;然后根据上一章节的方法,进行图片清理;最后按照固定的长宽值切分出字符模板图,保存文件名带上对应字符的标记。
labels = []
samples = []
for ch in captchaTemplate.keys():
for table in captchaTemplate[ch]:
labels.append(ord(ch))
samples.append(map(lambda e:e/255., table))
problem = svm_problem(labels, samples)
model = svm_train(problem, '-t 2 -c 500')
print len(samples)
data = map(lambda e:e/255., list(Image.open(TESTFILE).getdata(TESTFILE)))
y = ord('z')
prediction = svm_predict([y,], [data,], model)
print prediction
网易云安全(易盾)行为式验证码超10亿次完美验证,坚固守卫网站安全第一道防线。网易云易盾提供新一代网站验证码,包括智能验证码、滑动验证码等形式,验证码接口稳定性 99.9%,感知威胁可智能切换验证难度,告别繁琐验证,保护业务安全,点击可免费试用。
参考资料:
[1] 《高效的验证码识别技术与验证码分类思想》
[2] 《验证码的识别与改进》
[3] Tesseract项目:http://code.google.com/p/tesseract-ocr
[4] 常见验证码的弱点与验证码识别:http://drops.wooyun.org/tips/141
[5] http://blog.csdn.net/v_july_v/article/details/7624837
[6] http://www.codeproject.com/Articles/106583/Handwriting-Recognition-Revisited-Kernel-Support-V
网易云免费体验馆,0成本体验20+款云产品!
更多网易技术、产品、运营经验分享请点击。