转 http://blog.csdn.net/stevenkylelee/article/details/8270069
昨天写了《C# 验证码识别实践》一文
地址:
http://blog.csdn.net/stevenkylelee/article/details/8263890
由于昨晚上又改进了下算法和程序,
所以今天继续写。
改进的程序下载地址:
http://download.csdn.net/detail/stevenkylelee/4859013
其实,识别的大体过程上一篇文章基本上讲完了。
如果要说的话,只能在细节上深入。
现在我也不太确定,我用的方法是否具备一定的扩展性和适应性。
所以,先拿2个网站进行试验。
以后这些地址的验证码可能会变,我先截图好现在的图
1.CSDN上传资源页面的验证码。地址:
http://u.download.csdn.net/upload
截图:
2.久游登陆页面的验证码。地址:
https://passport.9you.com/login.php 或 https://login.passport.9you.com/
截图:
先看看CSDN上传资源页面的。
比较简单,改了一下处理过程,就轻松100%识别了。
一般每种验证码都有其特点。
所以,对应一种类型的验证码往往需要一种特定的算法。
尽管CSDN资源的比较简单,但针对它做的识别,
就只能用在它身上,不可套用到其他情况上。
当然,这个也可能和我水平有限有关。
会不会有牛人可以写出一个算法就能通用到所有的验证码的情况,
我就不清楚了。总之,我不能。呵呵
先在界面上填写CSDN资源上传的验证码的地址:
http://u.download.csdn.net/index.php/rest/tools/validcode/uploadvalidcode/10.501964908791706
然后在程序界面上的“验证码类型”选择:“CSDN资源上传”
再然后,点“下载”,再点“识别”,就会出结果了。
截图如下:
然后是久游登陆页面的验证码,这个验证码就比较复杂一些了
62种分类=26个小写字母+26个大写字母+10个数字。
随机背景颜色,随机字符颜色,随机字符位置,
随机字符大小,随机字符扭曲。
虽然随机的情况比较多,但随机的程度都不是很大。
所以,识别还是可以的,但目前不能做到100%。
先填写久游的验证码地址:
https://login.passport.9you.com/identifyingCode.jsp?0.953521374380216
然后,选择“验证码类型”为“提取连通分量”
再点“下载”,“识别”
识别截图如下:
用提取连通分量的方法,一般可以“抓到”字符。
就是说,在字符轮廓分明并且没有断裂的情况下,
不管它出现在什么位置,都可以定位到。
这样就屏蔽了位置随机性。
对久游登陆的识别率大概是80%-90%左右。
那个10%的missing率是怎么回事呢?
原因出在字符的分割上。
久游登陆的验证码会有一定的几率,出现字符粘连。
就是说,提取到的一个连通分量会包含2个或以上字符。
对于这种情况,我的处理是,如果提取到了一个比较宽的连通分量。
那么,按照字符平均宽度进行切分,把那个宽的连通分量,
垂直切成符合字符可能宽度的尺寸的几份,在进行识别。
这个处理,有一定的效果。比如:W和M边缘相连的话,可以切分出来。
但是,对于:M和有点旋转的i或者l相连,就切分错误了。
其实,要做到久游这种验证码的100%识别。
大概也是可以的。就是要花费比较多的精力。
就好比:考试得40分,要考到60分不难。
而考到了95分,要再考到98分或者100分就难了。
昨天和前任公司的技术部主管聊到这个问题,
他认为没有必要做到100%识别,一般有90%以上就足够了。
也有人和我说,有些情况,30%也够了。
因为,大不了就是重发3次请求,作为自动登陆来说,没什么。
最后,久游验证码怎样做到100%识别呢?
呵呵。透露一点,久游有一个比较明显的破绽,
利用好这个破绽,应该可以弥补我的10%-20%错误,
最终达到100%识别。
这个破绽就是:字符的颜色!