急急(在线等):httpwebrequest 模拟登录 带上cookie和要提交的数据,但是 就是登录不了呢!!!!

时间:2022-12-29 13:59:35
模拟请求登录的网站为:   http://ucenter.maidongxi.com/,带上cookie和要post的数据,就是登录不了。


程序界面及流程 急急(在线等):httpwebrequest 模拟登录 带上cookie和要提交的数据,但是 就是登录不了呢!!!!

全局变量: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;


这两个不应该是空的。。。



#2


引用 1 楼 andyqq8 的回复:
string __EVENTARGUMENT =null;
            string __VIEWSTATE = null;


这两个不应该是空的。。。



提交的数据为空

#3


#region 获取验证码
            Uri uri = new Uri("http://ucenter.maidongxi.com/ValidateImage.aspx?id=432");
这个id你怎么确定的?

#4


引用 3 楼 danjiewu 的回复:
#region 获取验证码
            Uri uri = new Uri("http://ucenter.maidongxi.com/ValidateImage.aspx?id=432");
这个id你怎么确定的?



这个 id  我是随机的。

因为那个页面 就是  当点击的验证码的话,会  用js随机请求一个 验证码

#5


Byte[] postD = Encoding.ASCII.GetBytes(postdata);
这一句有问题,你在给参数值编码的时候会把参数名和&符号都给编码的,从代码上看参数名没有问题,但&符号会被编码为%26。

#6


引用 5 楼 xingchen_22 的回复:
Byte[] postD = Encoding.ASCII.GetBytes(postdata);
这一句有问题,你在给参数值编码的时候会把参数名和&amp;符号都给编码的,从代码上看参数名没有问题,但&amp;符号会被编码为%26。



改过了也没用。

我单独 把 参数值 GetBytes  然后 & 起来也不行

#7


顶啊顶顶啊顶顶啊顶顶啊顶

#8


这个应该不是很难,你可以用vsniffer之类的工具,在ie登录的时候,拦截一下看看都有什么参数。
然后对比你的代码,看看是否有什么属性没有附上。
比如需要sessionid之类的话,每次都需要用程序获取一个sessionid,

#9


引用 8 楼 wangxiao2008 的回复:
这个应该不是很难,你可以用vsniffer之类的工具,在ie登录的时候,拦截一下看看都有什么参数。
然后对比你的代码,看看是否有什么属性没有附上。
比如需要sessionid之类的话,每次都需要用程序获取一个sessionid,



通过抓包工具,获取的参数。我都通过程序提交了,可是仍然登录不了

#10


还是没解决!!!!!!!!!!!抓狂!!!


到底哪儿出错了。。

#11


有是网站是在前面弹出一个对话框,这种怎么做啊?
错误信息:
System.Net.WebException: 服务器提交了协议冲突. Section=ResponseHeader Detail=CR 后面必须是 LF
   在 System.Net.HttpWebRequest.GetResponse()
 

#1


string __EVENTARGUMENT =null;
            string __VIEWSTATE = null;


这两个不应该是空的。。。



#2


引用 1 楼 andyqq8 的回复:
string __EVENTARGUMENT =null;
            string __VIEWSTATE = null;


这两个不应该是空的。。。



提交的数据为空

#3


#region 获取验证码
            Uri uri = new Uri("http://ucenter.maidongxi.com/ValidateImage.aspx?id=432");
这个id你怎么确定的?

#4


引用 3 楼 danjiewu 的回复:
#region 获取验证码
            Uri uri = new Uri("http://ucenter.maidongxi.com/ValidateImage.aspx?id=432");
这个id你怎么确定的?



这个 id  我是随机的。

因为那个页面 就是  当点击的验证码的话,会  用js随机请求一个 验证码

#5


Byte[] postD = Encoding.ASCII.GetBytes(postdata);
这一句有问题,你在给参数值编码的时候会把参数名和&符号都给编码的,从代码上看参数名没有问题,但&符号会被编码为%26。

#6


引用 5 楼 xingchen_22 的回复:
Byte[] postD = Encoding.ASCII.GetBytes(postdata);
这一句有问题,你在给参数值编码的时候会把参数名和&amp;符号都给编码的,从代码上看参数名没有问题,但&amp;符号会被编码为%26。



改过了也没用。

我单独 把 参数值 GetBytes  然后 & 起来也不行

#7


顶啊顶顶啊顶顶啊顶顶啊顶

#8


这个应该不是很难,你可以用vsniffer之类的工具,在ie登录的时候,拦截一下看看都有什么参数。
然后对比你的代码,看看是否有什么属性没有附上。
比如需要sessionid之类的话,每次都需要用程序获取一个sessionid,

#9


引用 8 楼 wangxiao2008 的回复:
这个应该不是很难,你可以用vsniffer之类的工具,在ie登录的时候,拦截一下看看都有什么参数。
然后对比你的代码,看看是否有什么属性没有附上。
比如需要sessionid之类的话,每次都需要用程序获取一个sessionid,



通过抓包工具,获取的参数。我都通过程序提交了,可是仍然登录不了

#10


还是没解决!!!!!!!!!!!抓狂!!!


到底哪儿出错了。。

#11


有是网站是在前面弹出一个对话框,这种怎么做啊?
错误信息:
System.Net.WebException: 服务器提交了协议冲突. Section=ResponseHeader Detail=CR 后面必须是 LF
   在 System.Net.HttpWebRequest.GetResponse()