程序界面及流程
全局变量:public CookieContainer myCookie = new CookieContainer();
步骤1: 点击获取验证码,返回验证码图片和图片的cookie(sessionid),并保存
private void button3_Click(object sender, EventArgs e)
{
#region 获取验证码
Uri uri = new Uri("http://ucenter.maidongxi.com/ValidateImage.aspx?id=432");
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(uri);
request.CookieContainer = myCookie;
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream resStream = response.GetResponseStream();//得到验证码数据流
Bitmap sourcebm = new Bitmap(resStream);//初始化Bitmap图片
this.pictureBox1.Image = sourcebm;
MessageBox.Show(myCookie.Count.ToString());
}
步骤2: 点击登录。
1)然后访问 login.aspx页面,分析html 并获取等会要提交的一些参数(比如view_state等)
2)带上 上面分析html 所得到的 要提交的post 数据
/// <summary>
/// 模拟登录
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button4_Click(object sender, EventArgs e)
{
Uri uri2 = new Uri("http://ucenter.maidongxi.com/login.aspx");
HttpWebRequest request2 = WebRequest.Create(uri2) as HttpWebRequest;
HttpWebResponse response2 = request2.GetResponse() as HttpWebResponse;
StreamReader reader2 = new StreamReader(response2.GetResponseStream(), Encoding.UTF8, true);
string html = reader2.ReadToEnd(); //获取html内容
reader2.Close();
response2.Close();
//MessageBox.Show(html);
//开始写正则
string __EVENTARGUMENT =null;
string __EVENTTARGET = "loginnner";
string __VIEWSTATE = null;
string txusername = uname.Text.Trim();
string txuserpwd = pwd.Text.Trim();
string checkcod = chkcode.Text.Trim();
Regex reg = new Regex(@"(?is)<input[^>]*?value=""([^""]*)""[^>]*>");
Match m = reg.Match(html);
if (m.Success)
{
__VIEWSTATE = m.Groups[1].Value;
}
//要提交的数据
string postdata = "__EVENTARGUMENT=" + __EVENTARGUMENT;
postdata += "&";
postdata += "__EVENTTARGET =" + __EVENTTARGET;
postdata += "&";
postdata += "__VIEWSTATE=" + __VIEWSTATE;
postdata += "&";
postdata += "txusername=" + txusername;
postdata += "&";
postdata += "txuserpwd=" + txuserpwd;
postdata += "&";
postdata += "checkcod=" + checkcod;
postdata += "&" + "head$txtSearch=请输入搜索关键字&" + "textbox23=43";
//end
HttpWebRequest requestLogin = WebRequest.Create("http://ucenter.maidongxi.com/login.aspx") as HttpWebRequest;
requestLogin.CookieContainer = myCookie;
requestLogin.Method = "POST";
//requestLogin.ContentType = "application/x-www-form-urlencoded";
requestLogin.UserAgent = "Mozilla/5.0 (Windows NT 5.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1";
requestLogin.Accept = "";
requestLogin.Headers.Add("Accept-Language", "zh-cn,zh;q=0.5");
requestLogin.Headers.Add("Accept-Encoding", "gzip, deflate");
requestLogin.Headers.Add("Accept-Charset", "");
Byte[] postD = Encoding.ASCII.GetBytes(postdata);
using(Stream getStream=requestLogin.GetRequestStream())
{
getStream.Write(postD, 0, postD.Length);
}
MessageBox.Show(requestLogin.Headers.ToString());
try
{
using (HttpWebResponse responseLogin = (HttpWebResponse)requestLogin.GetResponse())
{
System.IO.Compression.GZipStream responseStream = new System.IO.Compression.GZipStream(responseLogin.GetResponseStream(), System.IO.Compression.CompressionMode.Decompress);
StreamReader reader = new StreamReader(responseStream, Encoding.UTF8, true);
//StreamReader reader = new StreamReader(responseLogin.GetResponseStream(), Encoding.UTF8, true);
string a = reader.ReadToEnd();
MessageBox.Show(a.IndexOf("登录").ToString()); //验证是否登录
}
}
catch (Exception ee)
{
MessageBox.Show(ee.Message);
}
}
11 个解决方案
#1
string __EVENTARGUMENT =null;
string __VIEWSTATE = null;
这两个不应该是空的。。。
string __VIEWSTATE = null;
这两个不应该是空的。。。
#2
提交的数据为空
#3
#region 获取验证码
Uri uri = new Uri("http://ucenter.maidongxi.com/ValidateImage.aspx?id=432");
这个id你怎么确定的?
Uri uri = new Uri("http://ucenter.maidongxi.com/ValidateImage.aspx?id=432");
这个id你怎么确定的?
#4
这个 id 我是随机的。
因为那个页面 就是 当点击的验证码的话,会 用js随机请求一个 验证码
#5
Byte[] postD = Encoding.ASCII.GetBytes(postdata);
这一句有问题,你在给参数值编码的时候会把参数名和&符号都给编码的,从代码上看参数名没有问题,但&符号会被编码为%26。
这一句有问题,你在给参数值编码的时候会把参数名和&符号都给编码的,从代码上看参数名没有问题,但&符号会被编码为%26。
#6
改过了也没用。
我单独 把 参数值 GetBytes 然后 & 起来也不行
#7
顶啊顶顶啊顶顶啊顶顶啊顶
#8
这个应该不是很难,你可以用vsniffer之类的工具,在ie登录的时候,拦截一下看看都有什么参数。
然后对比你的代码,看看是否有什么属性没有附上。
比如需要sessionid之类的话,每次都需要用程序获取一个sessionid,
然后对比你的代码,看看是否有什么属性没有附上。
比如需要sessionid之类的话,每次都需要用程序获取一个sessionid,
#9
通过抓包工具,获取的参数。我都通过程序提交了,可是仍然登录不了
#10
还是没解决!!!!!!!!!!!抓狂!!!
到底哪儿出错了。。
到底哪儿出错了。。
#11
有是网站是在前面弹出一个对话框,这种怎么做啊?
错误信息:
System.Net.WebException: 服务器提交了协议冲突. Section=ResponseHeader Detail=CR 后面必须是 LF
在 System.Net.HttpWebRequest.GetResponse()
错误信息:
System.Net.WebException: 服务器提交了协议冲突. Section=ResponseHeader Detail=CR 后面必须是 LF
在 System.Net.HttpWebRequest.GetResponse()
#1
string __EVENTARGUMENT =null;
string __VIEWSTATE = null;
这两个不应该是空的。。。
string __VIEWSTATE = null;
这两个不应该是空的。。。
#2
提交的数据为空
#3
#region 获取验证码
Uri uri = new Uri("http://ucenter.maidongxi.com/ValidateImage.aspx?id=432");
这个id你怎么确定的?
Uri uri = new Uri("http://ucenter.maidongxi.com/ValidateImage.aspx?id=432");
这个id你怎么确定的?
#4
这个 id 我是随机的。
因为那个页面 就是 当点击的验证码的话,会 用js随机请求一个 验证码
#5
Byte[] postD = Encoding.ASCII.GetBytes(postdata);
这一句有问题,你在给参数值编码的时候会把参数名和&符号都给编码的,从代码上看参数名没有问题,但&符号会被编码为%26。
这一句有问题,你在给参数值编码的时候会把参数名和&符号都给编码的,从代码上看参数名没有问题,但&符号会被编码为%26。
#6
改过了也没用。
我单独 把 参数值 GetBytes 然后 & 起来也不行
#7
顶啊顶顶啊顶顶啊顶顶啊顶
#8
这个应该不是很难,你可以用vsniffer之类的工具,在ie登录的时候,拦截一下看看都有什么参数。
然后对比你的代码,看看是否有什么属性没有附上。
比如需要sessionid之类的话,每次都需要用程序获取一个sessionid,
然后对比你的代码,看看是否有什么属性没有附上。
比如需要sessionid之类的话,每次都需要用程序获取一个sessionid,
#9
通过抓包工具,获取的参数。我都通过程序提交了,可是仍然登录不了
#10
还是没解决!!!!!!!!!!!抓狂!!!
到底哪儿出错了。。
到底哪儿出错了。。
#11
有是网站是在前面弹出一个对话框,这种怎么做啊?
错误信息:
System.Net.WebException: 服务器提交了协议冲突. Section=ResponseHeader Detail=CR 后面必须是 LF
在 System.Net.HttpWebRequest.GetResponse()
错误信息:
System.Net.WebException: 服务器提交了协议冲突. Section=ResponseHeader Detail=CR 后面必须是 LF
在 System.Net.HttpWebRequest.GetResponse()