返回> 网站首页 

C#模拟post登录失败 - 采集器兼发帖机的开发

yoours2011-08-14 18:03:15 阅读 1400

简介一边听听音乐,一边写写文章。

POST代码:
                HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
                req.Method = "POST";
                req.Referer = url;
                req.ContentType = "application/x-www-form-urlencoded";
                req.KeepAlive = true;
                req.AllowAutoRedirect = true;

                CookieContainer cookieCon = new CookieContainer();
                req.CookieContainer = cookieCon;

                // 加入cookies,必须是这么写,一次性添加是不正确的。
                string[] Cookies = strCookies.Split(";".ToCharArray());
                foreach (string cookie in Cookies)
                {
                        req.CookieContainer.SetCookies(new Uri(url), cookie);
                }

                req.ContentLength = 0;
                HttpWebResponse res = (HttpWebResponse)req.GetResponse();
                Stream ReceiveStream = res.GetResponseStream();
                Encoding encode = System.Text.Encoding.GetEncoding("gbk");
                StreamReader sr = new StreamReader(ReceiveStream, encode);
                Char[] read = new Char[256];
                int count = sr.Read(read, 0, 256);

                while (count > 0)
                {
                    String str = new String(read, 0, count);
                    strResult += str;
                    count = sr.Read(read, 0, 256);
                }

                 // 这是通常获取登录后的cookies方法
                 strCookies = req.CookieContainer.GetCookieHeader(new Uri(url));

         通常上面的代码都能登录成功,获得正确的cookies。
         但是对于某些论坛的模拟登录,上面的代码就不可行了。获取的cookies不能使用,不是登录后的cookies。后来经过无数次的测试发现,如果使用AllowAutoRedirect支持自动跳转,那么获取dcookies就不正确。应该使用req.CookieContainer.GetCookieHeader(res.ResponseUri)来获取cookies,使用调整后的响应url就成功了。
         在登录discuz论坛后,不能发帖,总提示非法来源。在查看http监控协议后没有发现丢失的参数,所有的参数都进行了提交。解决办法:每次提交的数据最好是在提交之前的页面去获取,而不是一直使用第一次获得的参数。这次就是因为一直使用第一次获得的formhash参数,导致总是提示非法来源。在每次提交之前重新获得该参数,解决问题。


微信小程序扫码登陆

文章评论

1400人参与,0条评论