返回> 网站首页
C#模拟post登录失败 - 采集器兼发帖机的开发
yoours2011-08-14 18:03:15
简介一边听听音乐,一边写写文章。
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条评论