Hi,大家好。
我有一个模拟登录方面问题,三天了都没解决,请教下各位牛牛。问题是这样:登录http://www.howardforums.com,然后
我想访问http://www.howardforums.com/private.php?do=newpm&u=101,抓取u=101的用户名,但是报告我未登录。记住身份信息啥的我都做了的,而且前面另一个论坛也成功了,后来发现问题可能是该论坛有隐藏域<input type="hidden" name="securitytoken" value="guest" />这个该怎么办呢?
登录以及对一个用户发信息我都成功了的,因为抓包后可以按格式填写隐藏域信息。
谢谢了~
//
CookieContainer myCookieContainer = new CookieContainer(); 
string postData = "vb_login_username=0107&vb_login_password=&vb_login_password_hint=890107&s=&securitytoken=guest&do=login&vb_login_md5password=a348a7b37a88e369faa6573b29fd01bb&vb_login_md5password_utf=a348a7b37a88e369faa6573b29fd01bb";
sting postUrl = "http://www.howardforums.com/forum.php";
string usrUrl = "http://www.howardforums.com/private.php?do=newpm&u=101";        //登录
        LoginResult PostLoginInfo()
        {
            LoginResult result = LoginResult.LoginError;
            try
            {
                // Create a HttpRequest
                byte[] data = encoding.GetBytes(postData);
                HttpWebRequest request = WebRequest.Create(postUrl) as HttpWebRequest;
                request.Method = "POST";
                request.AllowAutoRedirect = true;
                request.ServicePoint.Expect100Continue = false;
                request.Timeout = 300000;
                request.Accept = "*/*";
                request.Referer = referer;
                request.Headers.Add("Accept-Language", "zh-cn,en-US;q=0.5");
                request.ContentType = "application/x-www-form-urlencoded";
                request.Headers.Add("UA-CPU", "x86");
                request.Headers.Add("Accept-Encoding", "gzip, deflate");
                request.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; QQDownload 1.7; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)";
                request.KeepAlive = true;
                request.ContentLength = data.Length;  // 要Post的数据的长度                
                request.Headers.Add("Pragma", "no-cache");
                request.CookieContainer = myCookieContainer;                // 把要Post的Data写入(追加)到outStream对象中,使其具有post data 
                Stream outStream = request.GetRequestStream();
                outStream.Write(data, 0, data.Length);
                outStream.Close();                // Get Http Response
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                response.Cookies = myCookieContainer.GetCookies(request.RequestUri); 
                //cookie 1                if (response.StatusCode == HttpStatusCode.OK)
                {
                    Stream respStream = response.GetResponseStream();
                    if (response.ContentEncoding.ToLower().Contains("gzip"))
                    {
                        respStream = new GZipStream(respStream, CompressionMode.Decompress);
                    }
                    else if (response.ContentEncoding.ToLower().Contains("deflate"))
                    {
                        respStream = new DeflateStream(respStream, CompressionMode.Decompress);
                    }                    StreamReader reader = new StreamReader(respStream, encoding);
                    string htmlText = reader.ReadToEnd();
                    reader.Close();
                    respStream.Close();                    result = CheckLogin(htmlText);
                }
            }
            catch (Exception exc)
            {
                SetMessage(exc.Message + "\r\n");
            }            return result;
        }        //访问另一个页面
        public string GetUserPage(string usrUrl)
        {
            string htmlText = "";
            try
            {
                // Create a HttpRequest
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(usrUrl);
                request.Timeout = 300000;
                request.AllowAutoRedirect = true;
                //
                request.Method = "POST";
                request.Accept = "*/*";
                request.Referer = referer;
                request.Headers.Add(HttpRequestHeader.AcceptLanguage, "zh-cn,en-US;q=0.5");
                request.ContentType = "application/x-www-form-urlencoded";
                request.Headers.Add("UA-CPU", "x86");
                request.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip, deflate");
                //request.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; QQDownload 1.7; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)";
                request.UserAgent = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; InfoPath.3; .NET4.0E; .NET4.0C; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)";
                request.KeepAlive = true;
                request.Headers.Add(HttpRequestHeader.Pragma, "no-cache");
                request.CookieContainer = myCookieContainer;                // Get Http Response
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                response.Cookies = myCookieContainer.GetCookies(request.RequestUri);                if (response.StatusCode == HttpStatusCode.OK)
                {
                    Stream respStream = response.GetResponseStream();                    if (response.ContentEncoding.ToLower().Contains("gzip"))
                    {
                        respStream = new GZipStream(respStream, CompressionMode.Decompress);
                    }
                    else if (response.ContentEncoding.ToLower().Contains("deflate"))
                    {
                        respStream = new DeflateStream(respStream, CompressionMode.Decompress);
                    }                    StreamReader reader = new StreamReader(respStream, encoding);
                    htmlText = reader.ReadToEnd();
                    reader.Close();
                }
                else
                {
                    htmlText = "";
                }
            }
            catch (Exception exc)
            {
                string error = exc.Message;
                htmlText = "";
            }            return htmlText;
        }

解决方案 »

  1.   

    虾米问题?登录成功但接下来访问页面失败?cookie是否有丢失?(通过抓包比较),你用的是.net 4.0以下?
      

  2.   

    找个http协议分析软件,仔细对比一下来来往往的Cookie应该就知道什么问题了,是个体力活
      

  3.   


    是的,登录成功后访问其他界面失败。
    但是,同样的,在登录成功,发送消息都成功了的。用fiddler看了下,从登录以后的cookie都是
    Cookie: bb_sessionhash=88bfd6e68924a85e49c092b0305b70ea; bb_lastvisit=1312717883; bb_lastactivity=0我用的是.net 4.0
    不是因为那个隐藏域的问题么?
      

  4.   

    分析了,从登陆以后都没有改变。
    不过我用浏览器登录了下cookie如下Cookie: __qca=P0-987913275-1311653984851; __utma=1.248926489.1311653992.1311653992.1311653992.1; __utmz=1.1311653992.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __csref=http%3A%2F%2Fwww.howardforums.com%2F; __csh=1; bb_sessionhash=5568e5ce9320b29b2ba6016eb4cf538e; bb_lastvisit=1311743600; bb_lastactivity=0; __utma=143360556.1759626742.1311653992.1311685248.1311741073.3; __utmb=143360556.30.10.1311741073; __utmc=143360556; __utmz=143360556.1311653992.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __cst=46b6958d32c0aab4; __csv=acb9fbd72a4f494f|0; __csnv=f79075664e38fc3b; __ctl=acb9fbd72a4f494f1
    但是我模拟产生的cookie是:Cookie: bb_sessionhash=88bfd6e68924a85e49c092b0305b70ea; bb_lastvisit=1312717883; bb_lastactivity=0