某网站的最后提交数据时,给出一张图片验证码,要求用户填写图片中算数题的结果,输入正确后才能顺利提交数据。
这一下就把人难住了。
在此之前,都是程序自动填写数据,自动提交数据,以最快的速度模拟人来完成网站选号过程。
但到这一步,如果还是人来填写图片中的结果,最理想状态,花费的时间可能也是好几秒。
这几秒的时间,可能就会被同行或别人选走,要想第一个完成选号,必须要用程序完成对图片的识别。
这是一个棘手的问题,我也从来没有写过类似的功能,从程序要实现的功能上来看,图片识别同一般的程序也差别很大,
所以我预计可能要花很长的时间才能解决,不过该图片比较简单,可以预见网站的开发者是一个什么程度。
难度高的技术活,我首先找到了老五,当我还在吃力的看VC书时,他已经在看编译原理的书了,
从前在合作外挂时教过我内存数据识别功能关键技术,我想他可能有些办法。
果然,按他的思路,要用人工智能算法来做这件事情,解决看来是没有问题的,
但是最终完成的时间遥遥无期,而我当时缺的就是时间。
当时感觉必须在很快的时间搞定这关,才能击败竞争对手。
于是我又找到了淘宝,已经有不少提供这个技术的卖家,我准备花点钱来完成这件事情,
但卖家发过来的DLL都超大,居然很多还不是VC搞的,这样势必会影响我的程序的速度,
而在我看来VC代码中调用其它高级语言的功能简直是一种倒退。
在没有最好的解决办法之后,我开始尝试自己编码来识别搞定这个图片。
这里有一个前提,就是这种自动产生的图片里的元素非常简单,简单到我都可以搞定它。
如果图片太复杂,或里面的内容比较多,估计我就不可能在一周内彻底设别了,所谓击破纸盾,其实只需要一把木刀就可以了。
网站制作者第一个白痴设置的地方:图片中的干扰线和数字符号不是一种颜色,而是纯黑色,而更简单的是居然是先画干扰线,
再画的数字和符号。数字符号和干扰线重叠的地方,只会保留数字符号。那么这种干扰线还有什么用呢,完全是一个摆设。
程序把图片中的像素按点阵读取后,简单的拿掉全部黑色的点,干扰线就完全去除了。
网站制作者第二个白痴的地方是:图片中的元素少,仔细观察图片,会发现图片中的元素只有0123456789加减乘除等号,而变化只有大和小2种,那么,图片中出现的图形就是大数字10个,小数字10个,大符号5个,小符号5个,一共才30个! 不用半天时间,我就按30个元素,建立了点阵库。所谓点阵库,就是按一个数字的大小,白色点转成0,黑色点转成1的一堆数组。为了后面对比的快速,我使用了一维数组,从上到下19个点,从左到右14个点,依次放在一个一维数组里。
在算法操作中,首先把数据元素按白色的间隔区分开,比如?X1=8,被区分成 ? , X , 1 , = , 8 五块14*19大小的图片,然后一块一块的读出点阵数据去同30个模版数组比较。比如第一块?,它有14*19共266个点,同30个模版数组里每一个点比较,统计同30个模版比较后的相似度。 相似度最高的,往往就是我们要的正确结果。
最后的一关也解决了,使用自己的图形识别模块,几乎在几个MS之内,就可以完成对验证码图片的识别,
一次成功率大概在90%以上,就算识别错了,程序可以接着再重复处理一次搞定,已经大大超过了人类。
至此我的程序非常的高效,从填数据到最后的提交,全部由电脑处理。
所谓天下武功唯快不破,第一个提交数据,几乎击败了竞争对手。这在当时来看,非常好的事情,其实后来想想也不尽然。。。