admin 发布时间:2015-03-16 分类:.NET 阅读:7096次 添加评论
今天看到12306更换验证码了,完全就是活脱脱的大家来找茬啊。
之前自己也研究过OCR验证码识别,特别留意过12306的验证码,我记得之前就更换过了一次。前两次的验证码确实不难,我用Google的开源OCR项目tesseract-ocr就可以识别出12306的验证码,调试过的识别率也挺高。
下面是识别的主要代码:
public static string Login(string UserName, string Password, string ValidateCode)
{
string Html = GetHtml("http://songker.com/");
Dictionary<string, string> parameters = new Dictionary<string, string>();
parameters.Add("__EVENTTARGET", "");
parameters.Add("__EVENTARGUMENT", "");
Match mVIEWSTATE = Regex.Match(Html, @"id=""__VIEWSTATE""[\s\S]*?value=""([\s\S]*?)""");
if (mVIEWSTATE.Success)
{
//parameters.Add("__VIEWSTATE", “aspx页面上的__VIEWSTATE”));
parameters.Add("__VIEWSTATE", "aspx页面上的__VIEWSTATE");
}
Match mEVENTVALIDATION = Regex.Match(Html, @"id=""__EVENTVALIDATION""[\s\S]*?value=""([\s\S]*?)""");
if (mEVENTVALIDATION.Success)
{
//parameters.Add("__EVENTVALIDATION", "__EVENTVALIDATION");
parameters.Add("__EVENTVALIDATION", "__EVENTVALIDATION");
}
parameters.Add("Account", UserName);
parameters.Add("PWD", UserName);
parameters.Add("CheckCode", ValidateCode);
..........
string url = "http://songker.com/login.aspx";
HttpWebResponse response = Http.CreatePostHttpResponse(url, parameters, null, null, Encoding.UTF8, cookie.GetCookie());
if (response == null)
{
return "网络问题";
}
string result = string.Empty;
using (StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.Default))
{
try
{
cookie.SetCookie(response.Headers["Set-Cookie"]);
result = reader.ReadToEnd();
reader.Close();
}
catch (Exception e)
{
}
}
if (string.IsNullOrEmpty(result))
{
return "网络问题";
}
else if (result.Contains("用户名或密码错误"))
{
return "用户名或密码错误";
}
else if (result.Contains("验证码不正确,请重新输入"))
{
return "验证码不正确,请重新输入";
}
else
{
//Match user = Regex.Match(result, "<span id=\"result\">(?<Text>[^>]*?)</span>");
if (user.Success)
{
return "成功";
}
else
{
return "异常";
}
}
}
发表评论:
◎欢迎您的参与讨论。