理解验证码什么是验证码?所谓验证码就是用一串随机生成的数字或符号生成一张图片,在图片中加入一些干扰像素(防止OCR),让用户用肉眼识别验证码信息,输入表单提交到网站进行验证,验证成功后一定时间后才能使用某项功能。一般来说,它是一种区分用户是计算机还是人的公共自动程序验证码。可防止恶意破解密码、刷票、论坛泛滥,有效防止黑客利用特定注册用户。采用特定程序暴力破解方法,不断尝试登录,所采用的验证码技术是目前很多网站(如招行网上个人银行、百度社区)的方法。如果您不使用验证码登录,黑客将更容易破解您的帐户。您可以使用组合代码闪烁等黑客技术来破解您的密码。有了验证码就相当于加了一道厚厚的屏障,安全系数很高。普通验证码是四位随机数字的组合。这是最原始的验证码随机数图片验证码。图片上的字符中规中矩,验证效果比之前的随机数+随机大小写英文字母图片验证码要好。每次刷新,每个角色都会改变自己的位置。随机数字+随机大小写英文字母+随机干扰像素+随机位置图片验证码,比之前的验证功能更好,不易识别。如何识别验证码的内容?所需工具:Tesseract识别工具,目前由Google维护,支持中文,默认识别率很低,尤其是中文,但可以自己提供样本,训练提高识别率。安装:brewinstalltesseract--all-languages//MAC安装npminstallnode-tesseract////Windows在DOS窗口下安装,输入:tesseract,如图,证明安装成功.命令行用法:tesseractimagenameoutputbase[-llang][-psmpagesegmode][configfile...]imagename为目标图片文件名,需要加上格式后缀;outputbase为转换结果文件名;lang为语言名称(在Tesseract-OCR中可以看到tessdata文件夹中以eng开头的语言文件eng.traineddata),如果不标-leng,则默认为eng;pagesegmode是生成结果显示的相关配置。例如:tesseract1.jpgresult-psm7tesseractcode.jpgresult-lchi_sim-psm7//-lchi_sim表示使用简体中文字体库,-psm7表示告诉tesseractcode.jpg图片是一个文本行,该参数可以降低识别错误率,默认为3node用法(官方示例):vartesseract=require('node-tesseract');//识别任意格式任意语言的文本tesseract.process(__dirname+'/path/to/image.jpg',function(err,text){if(err){console.error(err);}else{console.log(text);}});//识别德语文本一个统一的文本块并设置二进制pathvaroptions={l:'deu',psm:6,binary:'/usr/local/bin/tesseract'};tesseract.process(__dirname+'/path/to/image.jpg',options,function(err,text){if(err){console.error(err);}else{console.log(text);}});运行结果:尝试调用该方法后,会在本地文件中生成对应的txt文件,内容为标识内容。可以看到简单清晰的验证码识别还是比较准确的,但是有噪声或者其他影响识别效果很差,根本无法识别,所以我们需要对图片做一些处理,比如增加图片的阈值,比如设置为55%,可以通过ps等软件实现,但是node中已经有对应的包graphicsmagick,可以对图片进行这种处理,即更方便。graphicsmagick是一款非常实用的图像处理工具。一般如果想在后台处理图片,需要下载graphicsmagick,可以方便的实现制作缩略图、裁剪头像等功能。验证码的识别成功率与图片质量密切相关。一般对得到的验证码都要进行灰度化、二值化、去噪处理,使用graphicsmagick可以轻松完成。安装:brewinstallimagemagickbrewinstallgraphicsmagick//Mac安装npminstallgm//Windows安装命令行用法:gmconvert1.jpg-thumbnail"100x100!"output_1.jpg//非比例缩略图,生成图片的大小为:100x100gmconvert1.jpg1.pdf//格式转换节点的使用方法(官方示例):varfs=require('fs'),gm=require('gm');//调整大小并移除EXIF配置文件datagm('/path/to/my/img.jpg').resize(240,240).noProfile().write('/path/to/resize.png',function(err){if(!err)console.log('done');});//一些文件不会适当调整大小//http://stackoverflow.com/questions/5870466/imagemagick-incorrect-dimensions//你有两个选择://使用'!'忽略宽高比的标志gm('/path/to/my/img.jpg').resize(240,240,'!').write('/path/to/resize.png',function(err){如果(!err)console.log('done');});运行结果:可以看到gm成功裁剪或将图片转为pdf格式,使用起来非常方便。使用节点识别验证代码示例新建项目目录在合适的磁盘目录下创建项目目录node-orc初始化项目1.进入node-orc文件夹2.执行npminit初始化package.json文件安装依赖packages1.npminstallgm2.npminstallnode-tesseract新建index.js,编写代码如下:varfs=require('fs');vartesseract=require('node-tesseract');vargm=require('gm');/***图像阈值(默认55)*/functiondisposeImg(imgPath,newPath,thresholdValue){returnnewPromise((resolve,reject)=>{gm(imgPath).threshold(thresholdValue||55).write(newPath,(err)=>{if(err)returnreject(err);resolve(newPath);});});}/***识别阈值化后的图像内容*/functionrecognImg(imgPath,options){options=Object.assign({psm:8},options);//options=Object.assign({l:'chi_sim'},options);//识别中文returnnewPromise((resolve,reject)=>{tesseract.process(imgPath,options,(err,text)=>{if(err)returnreject(err);resolve(text.replace(/[\r\n\s]/gm,''));//去除识别结果中的换行回车空格});});}异步函数onrecognize(imgPath,newPath,thresholdValue){try{constnewImgPath=awaitdisposeImg(imgPath,newPath,thresholdValue)constresult=awaitrecognizeImg(newImgPath)console.log(`识别结果:${result}`)}catch(err){console.error(`识别失败:${err}`);}}recognize('1.jpg','test_1.jpg')运行代码进入当前目录,运行nodeindex直接打印出当前识别的结果,可以看出识别结果比之前的识别率,但是细节还是不够方便识别,不够完善。有兴趣的可以看看tesseracttraining,训练自己的识别库,准确率会提高很多注意:windows直接运行代码会提示CouldnotexecuteGraphicsMagick/ImageMagick:gm"convert",这个是因为windows系统在gm中找不到convert命令,所以我们需要安装一个客户端工具GraphicsMagick(下载的时候下载Q8版本),然后,因为convert命令的执行需要特定的环境,所以需要添加目录gm.exe位于计算机的环境变量中。关于中文识别目前这个库只能识别英文,中文直接乱码。如何认识中国人?我们可以下载一个中文库,下载地址如下:https://pan.baidu.com/s/13DCN...,并下载Tesseract-OCR安装包,tesseract安装目录下的tessdata文件存放了语言库,可以把解压后的文件放到这个文件夹里。字体文件扩展名为.raineddata。简体中文字体文件名为chi_sim.traineddata。使用时,带上语言类型即可,例如:tesseract7.jpgresult-lchi_sim中文识别效果:最后,对于简单的验证码,直接使用Tesseract识别即可。对于一些带有噪声或其他影响的验证码,可以使用graphicsmagick进行图像处理,然后使用Tesseract进行识别。对于中文或其他语言的识别,需要单独下载相关的语言库放在tessData文件夹下,在Tesseract识别代码中进行配置。整个识别效果还是不够完美。如果想要识别结果更准确,可以使用TesseracttrainingCode,因为这个有点复杂,后面会继续了解,希望大家交流指正!相关代码本文相关代码和图片github地址:https://github.com/fighting12...
