验证码
验证码(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自动区分计算机和人类的图灵测试)的缩写,是一种区分用户是计算机还是人的公共全自动程序。可以防止:恶意破解密码、刷票、论坛灌水,有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试,实际上用验证码是现在很多网站通行的方式,我们利用比较简易的方式实现了这个功能。这个问题可以由计算机生成并评判,但是必须只有人类才能解答。由于计算机无法解答CAPTCHA的问题,所以回答出问题的用户就可以被认为是人类。
验证码通常用于网站的登录,以区分是否是人类的行为还是机器的行为。启用验证码是反爬虫、反黑客的常用手段之一。然而,随着技术的不断进步,特别是machine learning的发展,普通的验证码识别也不是很复杂的事情。
识别验证码的架构
在搭建识别验证码服务之前需要完成两件事情。
1)使用现有的爬虫采集好图片验证码,并标注好这些图片。这里,我使用自己开发的图片爬虫程序PicCrawler。所谓标注,就是用肉眼去正确地识别出图片中的数字和字母,然后用这些数字和字母作为图片的名字。
2)使用tensorflow来训练这些验证码生成模型,每一批的验证码至少几千起。这样,训练好的模型可以通过tensorflow的api来加载。
做完这些事情之后,需要考虑使用怎样的方式整合到现有的框架中。
-
最初的架构
最初考虑使用OpenCV来加载模型,因为OpenCV有Java的API。然后Vert.x跟OpenCV进行交互。在这个架构中有线上的模型和离线的模型,线上的模型是生产环境中使用的模型。每次训练好的离线模型可以替换线上的模型。但是OpenCV加载模型时遇到了问题,于是尝试另一种办法。
-
后来的尝试
用tensorflow java api替换OpenCV来加载模型,这种方式也遇到了问题,不得不使用最后的方式。
-
最终的架构
使用python的web框架flask以及tensorflow python api来加载模型。在这个架构中,需要Vert.x调用flask暴露的接口,最后将识别的结果返回。
最终,接口返回的数据跟图片中验证码的内容一致。算是完成了一次验证码的识别。
思考
目前,只能识别1、2种验证码,未来会将多种验证码进行打标签,然后训练到一个模型中。
验证码的功能打算整合到爬虫框架NetDiscovery中,成为它的一个组件。由于爬虫框架是开源的,所以大家都可以免费使用这个模块。
验证码模块的架构,也争取使用熟悉的Java来替换python。