注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

樱之花

叶散的时候,你明白欢聚;花谢的时候,你明白青春.

 
 
 

日志

 
 
关于我

分类中“我的实验室”是我在日常工作中的一些知识总结,有些写的比较匆忙,可能大家在阅读时会产生困扰,后期有时间我会重新整理编辑,谢谢大家的到访,您们的支持是我前进的动力!

网易考拉推荐

天涯博客验证码识别的思路及方法  

2012-01-12 13:56:22|  分类: 网站安全研究 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
投票软件比较有技术含量的部分就在验证码识别。为防止投票作弊,很多投票网站都会加随机验证码,输入验证码后才能投票。但是加了验证码是否就能万无一失呢,也不尽然。虽然不是所有验证码都能识别(如QQ的变形汉字验证码是不太可能用软件识别的,个人觉得),但还是有很多验证码可以用软件来识别的。

下面以天涯博客里的评论验证码为例,说明验证码识别的基本思路和方法:
天涯博客验证码识别的思路及方法 - yinzhihua2008 - 樱之花 yinzhihua2008
 
                  (网页截图)
第一步、获取验证码图片
C#可以用HttpWebRequest类GET验证码的网址,得到返回的数据流,再将数据流值赋给Bitmap变量。在Winform里放一个PictureBox控件,将它的Image属性指定为Bitmap变量,就可以显示出验证码图片了。
也可以使用Bitmap的Save方法将图片保存成Bmp文件。
    Stream resStream = response.GetResponseStream();//得到验证码数据流
    Bitmap sourcebm = new Bitmap(resStream);//初始化Bitmap图片WWW.OUTDOVOTE.CN免费通用网络自动投票器
在Photoshop中将验证码图片放大1600%,如下:
天涯博客验证码识别的思路及方法 - yinzhihua2008 - 樱之花 yinzhihua2008
 
第二步、将验证码图片去色(将彩色转换为灰度)
去色是为了进一步做成黑白双色图片。
    Color c = sourcebm.GetPixel(x, y);
    int luma = (int)(c.R * 0.3 + c.G * 0.59 + c.B * 0.11);//转换灰度的算法
    sourcebm.SetPixel(x, y, Color.FromArgb(luma, luma, luma));WWW.OUTDOVOTE.CN免费通用网络自动投票器
天涯博客验证码识别的思路及方法 - yinzhihua2008 - 樱之花 yinzhihua2008
 
第三步、去杂色,转换为黑白图片
从灰度图片中可以看出,数字的颜色比较深,而杂色都是比较浅,所以可以设定一个临界颜色值,颜色高于或等于这个值的设置为白色,低于这个值的设置为黑色。
    Color c = sourcebm.GetPixel(x, y);
    if (c.R >= critical_value)WWW.OUTDOVOTE.CN免费通用网络自动投票器
        sourcebm.SetPixel(x, y, Color.FromArgb(255, 255, 255));
    else
        sourcebm.SetPixel(x, y, Color.FromArgb(0, 0, 0));
天涯博客验证码识别的思路及方法 - yinzhihua2008 - 樱之花 yinzhihua2008
 
第四步、动态得到每个数字的边界
天涯博客验证码识别的思路及方法 - yinzhihua2008 - 樱之花 yinzhihua2008
 
for (int x = 0; x < sourcebm.Width; x++)
{
    myColumn = true;
    for (int y = 0; y < sourcebm.Height; y++)
    {
        Color c = sourcebm.GetPixel(x, y);WWW.OUTDOVOTE.CN免费通用网络自动投票器
        if (c.R == 0 && charStart == false)//第一次出现黑点
        {
            widthStartX[charNum] = x;
            charStart = true;
            break;
        }
        if (c.R == 0 && charStart == true)//后续出现黑点
        {
            myColumn = false;
            break;WWW.OUTDOVOTE.CN免费通用网络自动投票器
        }
    }
    if (myColumn == true && charStart == true && widthStartX[charNum] < x)//如果当列没有黑点并且前面出现过黑点还没结束
    {
        widthEndX[charNum] = x - 1;
        charStart = false;
        charNum++;
    }
    if (charStart == true && myColumn == false && x == (bmp.Width - 1))//如果开始出现黑点了,并且最后一列也有黑点
    {
        widthEndX[charNum] = x;
        charStart = false;WWW.OUTDOVOTE.CN免费通用网络自动投票器
        charNum++;
    }
}
五、得到每个字符的特征码
在每个字符的边界内,检测每个象素,如果象素为白色则为“0”,如果象素为黑色则为“1”,将“0”“1”连起来就是该数字或字符的特征码。
    Color c = sourcebm.GetPixel(x, y);
    if (c.R == 0)
        str = str + "1";WWW.OUTDOVOTE.CN免费通用网络自动投票器
    else
        str = str + "0";
六、完成验证码图片的识别
将获取的特征码和对应的数字或字符保存起来,下次再将新获取的特征码跟保存的特征码对比,如果相同则提取对应的数字或字符,完成验证码的识别。
天涯博客验证码识别的思路及方法 - yinzhihua2008 - 樱之花 yinzhihua2008
 
  评论这张
 
阅读(1754)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017