验证码识别(傻爪型,不是哪种智能的) 知道多少谈多少

lovebanyi 2005-06-20 07:14:20
第一个问题:验证码不是单个数字,一般是4个数字。(你登陆进来的时候不是看到了)哪么就要进行拆分,拆成四部分,或者N部分(高宽适中)
第二个问题:对每个部分进行比较(每个部分是可以生成新的图片的)或者你用其它方式进行比较。得到是哪个数字。
第三个问题:自己的验证码特征库的建立。各个部分的特征
第四个问题:把第一个问题拆成哪四个部分,去掉多余的部分,好刚特征库的比较
第五个问题:验证码过小,放大。过大缩小,

有没有人还可以补充的。(或者其它的解决方案)
每个部分的函数实现也有分

加油吧 路过的朋友.....不懂得,不要顶啊 重复不要,QQ验证码的识别哪个也不要,已经知道了,

用C# 或 vb.net + GDI+

...全文
573 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
ghchen 2005-06-29
  • 打赏
  • 举报
回复
我顶
lovebanyi 2005-06-29
  • 打赏
  • 举报
回复
'====================================
Ic = 0
A = New ArrayList
A.Add(New Point(1, 1))
A.Add(New Point(1, 10))
A.Add(New Point(2, 0))
A.Add(New Point(2, 11))
A.Add(New Point(3, 0))
A.Add(New Point(3, 5))
A.Add(New Point(3, 11))
A.Add(New Point(4, 0))
A.Add(New Point(4, 5))
A.Add(New Point(4, 11))
A.Add(New Point(5, 0))
A.Add(New Point(5, 5))
A.Add(New Point(5, 11))
A.Add(New Point(6, 1))
A.Add(New Point(6, 4))
A.Add(New Point(6, 6))
A.Add(New Point(6, 10))
A.Add(New Point(7, 2))
A.Add(New Point(7, 3))
A.Add(New Point(7, 7))
A.Add(New Point(7, 8))
A.Add(New Point(7, 9))

For Each p As Point In A
If Img.GetPixel(p.X, p.Y).ToArgb = Color.Blue.ToArgb Then
Ic += 1
End If
Next
If Ic = A.Count Then
Return "3"
End If
'====================================

Ic = 0
A = New ArrayList
A.Add(New Point(0, 6))
A.Add(New Point(0, 7))
A.Add(New Point(1, 5))
A.Add(New Point(1, 7))
A.Add(New Point(2, 4))
A.Add(New Point(2, 7))
A.Add(New Point(3, 3))
A.Add(New Point(3, 7))
A.Add(New Point(4, 2))
A.Add(New Point(4, 7))
A.Add(New Point(5, 1))
A.Add(New Point(5, 7))
A.Add(New Point(6, 0))
A.Add(New Point(6, 1))
A.Add(New Point(6, 2))
A.Add(New Point(6, 3))
A.Add(New Point(6, 4))
A.Add(New Point(6, 5))
A.Add(New Point(6, 6))
A.Add(New Point(6, 7))
A.Add(New Point(6, 8))
A.Add(New Point(6, 9))
A.Add(New Point(6, 10))
A.Add(New Point(6, 11))
A.Add(New Point(7, 7))
For Each p As Point In A
If Img.GetPixel(p.X, p.Y).ToArgb = Color.Blue.ToArgb Then
Ic += 1
End If
Next
If Ic = A.Count Then
Return "4"
End If
'====================================

Ic = 0
A = New ArrayList
A.Add(New Point(1, 0))
A.Add(New Point(1, 1))
A.Add(New Point(1, 2))
A.Add(New Point(1, 3))
A.Add(New Point(1, 4))
A.Add(New Point(1, 10))
A.Add(New Point(2, 0))
A.Add(New Point(2, 4))
A.Add(New Point(2, 11))
A.Add(New Point(3, 0))
A.Add(New Point(3, 4))
A.Add(New Point(3, 11))
A.Add(New Point(4, 0))
A.Add(New Point(4, 4))
A.Add(New Point(4, 11))
A.Add(New Point(5, 0))
A.Add(New Point(5, 4))
A.Add(New Point(5, 11))
A.Add(New Point(6, 0))
A.Add(New Point(6, 5))
A.Add(New Point(6, 10))
A.Add(New Point(7, 0))
A.Add(New Point(7, 6))
A.Add(New Point(7, 7))
A.Add(New Point(7, 8))
A.Add(New Point(7, 9))

For Each p As Point In A
If Img.GetPixel(p.X, p.Y).ToArgb = Color.Blue.ToArgb Then
Ic += 1
End If
Next
If Ic = A.Count Then
Return "5"
End If
'====================================

Ic = 0
A = New ArrayList
A.Add(New Point(0, 3))
A.Add(New Point(0, 4))
A.Add(New Point(0, 5))
A.Add(New Point(0, 6))
A.Add(New Point(0, 7))
A.Add(New Point(0, 8))
A.Add(New Point(0, 9))
A.Add(New Point(1, 2))
A.Add(New Point(1, 5))
A.Add(New Point(1, 10))
A.Add(New Point(2, 1))
A.Add(New Point(2, 4))
A.Add(New Point(2, 11))
A.Add(New Point(3, 0))
A.Add(New Point(3, 4))
A.Add(New Point(3, 11))
A.Add(New Point(4, 0))
A.Add(New Point(4, 4))
A.Add(New Point(4, 11))
A.Add(New Point(5, 0))
A.Add(New Point(5, 4))
A.Add(New Point(5, 11))
A.Add(New Point(6, 0))
A.Add(New Point(6, 5))
A.Add(New Point(6, 10))
A.Add(New Point(7, 6))
A.Add(New Point(7, 7))
A.Add(New Point(7, 8))
A.Add(New Point(7, 9))

For Each p As Point In A
If Img.GetPixel(p.X, p.Y).ToArgb = Color.Blue.ToArgb Then
Ic += 1
End If
Next
If Ic = A.Count Then
Return "6"
End If
'====================================

Ic = 0
A = New ArrayList
A.Add(New Point(1, 0))
A.Add(New Point(2, 0))
A.Add(New Point(2, 10))
A.Add(New Point(2, 11))
A.Add(New Point(3, 0))
A.Add(New Point(3, 8))
A.Add(New Point(3, 9))
A.Add(New Point(4, 0))
A.Add(New Point(4, 6))
A.Add(New Point(4, 7))
A.Add(New Point(5, 0))
A.Add(New Point(5, 4))
A.Add(New Point(5, 5))
A.Add(New Point(6, 0))
A.Add(New Point(6, 2))
A.Add(New Point(6, 3))
A.Add(New Point(7, 0))
A.Add(New Point(7, 1))

For Each p As Point In A
If Img.GetPixel(p.X, p.Y).ToArgb = Color.Blue.ToArgb Then
Ic += 1
End If
Next
If Ic = A.Count Then
Return "7"
End If
'====================================

Ic = 0
A = New ArrayList
A.Add(New Point(0, 2))
A.Add(New Point(0, 3))
A.Add(New Point(0, 4))
A.Add(New Point(0, 5))
A.Add(New Point(1, 1))
A.Add(New Point(1, 6))
A.Add(New Point(1, 11))
A.Add(New Point(2, 0))
A.Add(New Point(2, 7))
A.Add(New Point(2, 11))
A.Add(New Point(3, 0))
A.Add(New Point(3, 7))
A.Add(New Point(3, 11))
A.Add(New Point(4, 0))
A.Add(New Point(4, 7))
A.Add(New Point(4, 11))
A.Add(New Point(5, 0))
A.Add(New Point(5, 7))
A.Add(New Point(5, 10))
A.Add(New Point(6, 1))
A.Add(New Point(6, 6))
A.Add(New Point(6, 9))
A.Add(New Point(7, 2))
A.Add(New Point(7, 3))
A.Add(New Point(7, 4))
A.Add(New Point(7, 5))
A.Add(New Point(7, 6))
A.Add(New Point(7, 7))
A.Add(New Point(7, 8))


For Each p As Point In A
If Img.GetPixel(p.X, p.Y).ToArgb = Color.Blue.ToArgb Then
Ic += 1
End If
Next
If Ic = A.Count Then
Return "9"
End If
'====================================

Return " "
End Function
lovebanyi 2005-06-29
  • 打赏
  • 举报
回复
'这个是VB的代码。谁要呢。现在要的是智能点的分析。谢谢

Function DownImg(ByVal StrUrl As String) As String
Console.WriteLine(System.Threading.Thread.CurrentThread.Name & ":下载验证码。。")
Dim Rqq As HttpWebRequest = HttpWebRequest.Create(StrUrl)
Rqq.CookieContainer = New CookieContainer
'Me.l_res.Text = "获取并识别验证码。。。"
'Me.l_res.Refresh()
Dim RPP As HttpWebResponse = Rqq.GetResponse

Dim Img As New System.Drawing.Bitmap(RPP.GetResponseStream)

_APSNET_SessionValue = RPP.Cookies("ASP.NET_SessionId").Value

Dim B As Bitmap
Dim B1 As Bitmap
Dim B2 As Bitmap
Dim B3 As Bitmap
Dim B4 As Bitmap

Dim Rc1 As New Rectangle(3, 4, 8, 12)
Dim Rc2 As New Rectangle(12, 4, 8, 12)
Dim Rc3 As New Rectangle(21, 4, 8, 12)
Dim Rc4 As New Rectangle(30, 4, 8, 12)


B = Img

B1 = B.Clone(Rc1, B.PixelFormat)
'Me.l_res.Text = "获取并识别验证码:1。。。"
'Me.l_res.Refresh()
B2 = B.Clone(Rc2, B.PixelFormat)
'Me.l_res.Text = "获取并识别验证码:2。。。"
'Me.l_res.Refresh()
B3 = B.Clone(Rc3, B.PixelFormat)
'Me.l_res.Text = "获取并识别验证码:3。。。"
'Me.l_res.Refresh()
B4 = B.Clone(Rc4, B.PixelFormat)
'Me.l_res.Text = "获取并识别验证码:4。。。"
'Me.l_res.Refresh()

Dim StrCode As String
Try
StrCode = getNo(B1) + getNo(B2) + getNo(B3) + getNo(B4)
'Me.Text = (StrCode)
Catch ex As Exception
Console.WriteLine(ex.Message)
Finally
B.Dispose()
B1.Dispose()
B2.Dispose()
B3.Dispose()
B4.Dispose()

End Try
'释放资源

Return StrCode
End Function


Function getNo(ByVal Img As Bitmap) As String
Dim Ic As Int32 = 0
Dim A As ArrayList

Ic = 0
A = New ArrayList
A.Add(New Point(0, 2))
A.Add(New Point(0, 3))
A.Add(New Point(0, 4))
A.Add(New Point(0, 5))
A.Add(New Point(0, 6))
A.Add(New Point(0, 7))
A.Add(New Point(0, 8))
A.Add(New Point(0, 9))
A.Add(New Point(1, 1))
A.Add(New Point(1, 10))
A.Add(New Point(2, 0))
A.Add(New Point(2, 11))
A.Add(New Point(3, 0))
A.Add(New Point(3, 11))
A.Add(New Point(4, 0))
A.Add(New Point(4, 11))
A.Add(New Point(5, 0))
A.Add(New Point(5, 11))
A.Add(New Point(6, 1))
A.Add(New Point(6, 10))
A.Add(New Point(7, 2))
A.Add(New Point(7, 3))
A.Add(New Point(7, 4))
A.Add(New Point(7, 5))
A.Add(New Point(7, 6))
A.Add(New Point(7, 7))
A.Add(New Point(7, 8))
A.Add(New Point(7, 9))

For Each p As Point In A
If Img.GetPixel(p.X, p.Y).ToArgb = Color.Blue.ToArgb Then
Ic += 1
End If
Next
If Ic = A.Count Then
Return "0"
End If
'====================================

Ic = 0
A = New ArrayList
A.Add(New Point(2, 2))
A.Add(New Point(2, 11))
A.Add(New Point(3, 2))
A.Add(New Point(3, 11))
A.Add(New Point(4, 0))
A.Add(New Point(4, 1))
A.Add(New Point(4, 2))
A.Add(New Point(4, 3))
A.Add(New Point(4, 4))
A.Add(New Point(4, 5))
A.Add(New Point(4, 6))
A.Add(New Point(4, 7))
A.Add(New Point(4, 8))
A.Add(New Point(4, 9))
A.Add(New Point(4, 10))
A.Add(New Point(4, 11))
A.Add(New Point(5, 11))
A.Add(New Point(6, 11))

For Each p As Point In A
If Img.GetPixel(p.X, p.Y).ToArgb = Color.Blue.ToArgb Then
Ic += 1
End If
Next
If Ic = A.Count Then
Return "1"
End If
'====================================

Ic = 0
A = New ArrayList
A.Add(New Point(1, 1))
A.Add(New Point(1, 10))
A.Add(New Point(1, 11))
A.Add(New Point(2, 0))
A.Add(New Point(2, 9))
A.Add(New Point(2, 11))
A.Add(New Point(3, 0))
A.Add(New Point(3, 8))
A.Add(New Point(3, 11))
A.Add(New Point(4, 0))
A.Add(New Point(4, 7))
A.Add(New Point(4, 11))
A.Add(New Point(5, 0))
A.Add(New Point(5, 6))
A.Add(New Point(5, 11))
A.Add(New Point(6, 1))
A.Add(New Point(6, 5))
A.Add(New Point(6, 11))
A.Add(New Point(7, 2))
A.Add(New Point(7, 3))
A.Add(New Point(7, 4))
A.Add(New Point(7, 11))

For Each p As Point In A
If Img.GetPixel(p.X, p.Y).ToArgb = Color.Blue.ToArgb Then
Ic += 1
End If
Next
If Ic = A.Count Then
Return "2"
End If
'====================================
Ic = 0
A = New ArrayList
A.Add(New Point(0, 2))
A.Add(New Point(0, 3))
A.Add(New Point(0, 7))
A.Add(New Point(0, 8))
A.Add(New Point(0, 9))
A.Add(New Point(1, 1))
A.Add(New Point(1, 4))
A.Add(New Point(1, 6))
A.Add(New Point(1, 10))
A.Add(New Point(2, 0))
A.Add(New Point(2, 5))
A.Add(New Point(2, 11))
A.Add(New Point(3, 0))
A.Add(New Point(3, 5))
A.Add(New Point(3, 11))
A.Add(New Point(4, 0))
A.Add(New Point(4, 5))
A.Add(New Point(4, 11))
A.Add(New Point(5, 0))
A.Add(New Point(5, 5))
A.Add(New Point(5, 11))
A.Add(New Point(6, 1))
A.Add(New Point(6, 4))
A.Add(New Point(6, 6))
A.Add(New Point(6, 10))
A.Add(New Point(7, 2))
A.Add(New Point(7, 3))
A.Add(New Point(7, 7))
A.Add(New Point(7, 8))
A.Add(New Point(7, 9))

For Each p As Point In A
If Img.GetPixel(p.X, p.Y).ToArgb = Color.Blue.ToArgb Then
Ic += 1
End If
Next
If Ic = A.Count Then
Return "8"
End If
ChengKing 2005-06-27
  • 打赏
  • 举报
回复
验证码自动生成N位随机数的一个例子:
public string CutStr(string str,int n)//可能是让返回的字符串占N个字节
{
string ss="";//返回值
if (str.Length<=n/2)
{
ss=str;
}
else
{
int t=0;
char[] tmp=str.ToCharArray();
for (int i=0;i<str.Length;i++)
{
int c;
//c=Convert.ToInt32(str.Substring(i,1));
c=(int)tmp[i];
if (c<0)
c=c+65536;
if (c>255)
t=t+2;
else
t=t+1;
if (t>n)
break;
ss=ss+str.Substring(i,1);
}
}
return ss;

}

public string CutStrWithD(string str,int n)
{
string ss="";//返回值
if (str.Length<=n/2)
{
ss=str;
}
else
{
int t=0;
char[] tmp=str.ToCharArray();
for (int i=0;i<str.Length;i++)
{
int c;
//c=Convert.ToInt32(str.Substring(i,1));
c=(int)tmp[i];
if (c<0)
c=c+65536;
if (c>255)
t=t+2;
else
t=t+1;
if (t>n)
break;
ss=ss+str.Substring(i,1);
}
ss=ss+"...";
}
return ss;
}
zeusvenus 2005-06-27
  • 打赏
  • 举报
回复
关注此贴的进展.
DanielQQ 2005-06-27
  • 打赏
  • 举报
回复
关注一下!
sanduVB 2005-06-27
  • 打赏
  • 举报
回复
mark
smile9961 2005-06-27
  • 打赏
  • 举报
回复
下班了,回家了再看。
teacher1998 2005-06-27
  • 打赏
  • 举报
回复
记下来
lovebanyi 2005-06-27
  • 打赏
  • 举报
回复
为什么到现在只有一个人看了标题没有理解错误码的。其它的全部理解错误了。不是生成验证码啊。是识别啊。
lovebanyi 2005-06-23
  • 打赏
  • 举报
回复
re:LoveCherry
是啊所以现在考虑得智能方面的了
sunnystar365 2005-06-23
  • 打赏
  • 举报
回复
mark
realwar 2005-06-23
  • 打赏
  • 举报
回复
关注,我曾写了一个,
zeusvenus 2005-06-23
  • 打赏
  • 举报
回复
有一些现成的可以参考参考,.TEXT的源代码可以看看,另外GMAIL的那个注册页面看过吗?就是你要的效果,具体怎么做的不清楚.
goody9807 2005-06-23
  • 打赏
  • 举报
回复
http://dev.csdn.net/develop/article/22/22618.shtm

http://www.cnblogs.com/hover/articles/1283.aspx
renyu732 2005-06-23
  • 打赏
  • 举报
回复
做个记号,把我收藏的给大家看看,可惜现在没带啊...
LoveCherry 2005-06-22
  • 打赏
  • 举报
回复
其实也就是特征库的建立比较麻烦,之所谓外面的验证码每次看到的数字的样式倾斜度都不同是想不让你轻易建立特征库,就算建立了所有的特征库也容易识别错误,这种情况人眼是不太会出错的
大可山人 2005-06-22
  • 打赏
  • 举报
回复
自動識別的技術是比較麻煩的
lovebanyi 2005-06-21
  • 打赏
  • 举报
回复
现在可以谈谈,智能型的。哪些扭曲等等....ocr有这方面的资料吗
codeangel 2005-06-20
  • 打赏
  • 举报
回复
/* Copyright all(c) 2005 ZhongFeng, http://blog.csdn.net/SW515 */
public class ValidateCode : System.Web.UI.Page
{
private void Page_Load(object sender, System.EventArgs e)
{
this.CreateCheckCodeImage(GenerateCheckCode());
}

#region Web 窗体设计器生成的代码
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
//
InitializeComponent();
base.OnInit(e);
}

/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion

private string GenerateCheckCode()
{
int number;
char code;
string checkCode = String.Empty;

System.Random random = new Random();

for(int i=0; i<5; i++)
{
number = random.Next();

if(number % 2 == 0)
code = (char)('0' + (char)(number % 10));
else
code = (char)('A' + (char)(number % 26));

checkCode += code.ToString();
}

Response.Cookies.Add(new HttpCookie("CheckCode", checkCode));

return checkCode;
}

private void CreateCheckCodeImage(string checkCode)
{
if(checkCode == null || checkCode.Trim() == String.Empty)
return;

System.Drawing.Bitmap image = new System.Drawing.Bitmap((int)Math.Ceiling((checkCode.Length * 12.5)), 22);
Graphics g = Graphics.FromImage(image);

try
{
//生成随机生成器
Random random = new Random();

//清空图片背景色
g.Clear(Color.White);

//画图片的背景噪音线
for(int i=0; i<25; i++)
{
int x1 = random.Next(image.Width);
int x2 = random.Next(image.Width);
int y1 = random.Next(image.Height);
int y2 = random.Next(image.Height);

g.DrawLine(new Pen(Color.Silver), x1, y1, x2, y2);
}

Font font = new System.Drawing.Font("Arial", 12, (System.Drawing.FontStyle.Bold | System.Drawing.FontStyle.Italic));
System.Drawing.Drawing2D.LinearGradientBrush brush = new System.Drawing.Drawing2D.LinearGradientBrush(new Rectangle(0, 0, image.Width, image.Height), Color.Blue, Color.DarkRed, 1.2f, true);
g.DrawString(checkCode, font, brush, 2, 2);

//画图片的前景噪音点
for(int i=0; i<100; i++)
{
int x = random.Next(image.Width);
int y = random.Next(image.Height);

image.SetPixel(x, y, Color.FromArgb(random.Next()));
}

//画图片的边框线
g.DrawRectangle(new Pen(Color.Silver), 0, 0, image.Width - 1, image.Height - 1);

System.IO.MemoryStream ms = new System.IO.MemoryStream();
image.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);
Response.ClearContent();
Response.ContentType = "image/Gif";
Response.BinaryWrite(ms.ToArray());
}
finally
{
g.Dispose();
image.Dispose();
}
}
}




  假如以上验证码生成器页面名为:CheckCode.aspx,那么在登录页面中使用“<IMG>” 这个 HTML 元素来显示生成的验证码图片:<IMG src="CheckCode.aspx">
  在登录页面的登录按钮的处理事件中使用以下代码判断验证码:


private void btnLogin_Click(object sender, System.Web.UI.ImageClickEventArgs e)
{
if(Request.Cookies["CheckCode"] == null)
{
lblMessage.Text = "您的浏览器设置已被禁用 Cookies,您必须设置浏览器允许使用 Cookies 选项后才能使用本系统。";
lblMessage.Visible = true;
return;
}

if(String.Compare(Request.Cookies["CheckCode"].Value, txtCheckCode.Text, true) != 0)
{
lblMessage.Text = "验证码错误,请输入正确的验证码。";
lblMessage.Visible = true;
return;
}

/***** 其他代码 *****/

}

加载更多回复(8)

62,041

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧