保持登录论坛

时间:2011-12-28 00:15:47

标签: c# session cookies phpbb

我创建了一个连接到我的phpBB论坛并登录的C#应用​​程序。我现在正在尝试使用webclient转到页面并将该页面作为字符串抓取。但是我一直在退出。如何在webclient中使用用于登录论坛的代码创建的cookie?

用于登录论坛并获取页面的代码:

       public static CookieContainer login(string url, string username, string password, Form1 form)
       {
           if (url.Length == 0 || username.Length == 0 || password.Length == 0)
           {
               Console.WriteLine("Information missing");
               return null;
           }

           CookieContainer myContainer = new CookieContainer();

           HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
           request.CookieContainer = myContainer;

           // Set type to POST
           request.Method = "POST";
           request.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)";
           request.ContentType = "application/x-www-form-urlencoded";

           // Build the new header, this isn't a multipart/form, so it's very simple
           StringBuilder data = new StringBuilder();
           data.Append("username=" + Uri.EscapeDataString(username));
           data.Append("&password=" + Uri.EscapeDataString(password));
           data.Append("&login=Login");

           // Create a byte array of the data we want to send
           byte[] byteData = UTF8Encoding.UTF8.GetBytes(data.ToString());

           // Set the content length in the request headers
           request.ContentLength = byteData.Length;

           Stream postStream;
           try
           {
               postStream = request.GetRequestStream();
           }
           catch (Exception e)
           {
               Console.WriteLine("Login - " + e.Message.ToString() + " (GRS)");
               return null;
           }

           // Write data
           postStream.Write(byteData, 0, byteData.Length);

           HttpWebResponse response;
           try
           {
               response = (HttpWebResponse)request.GetResponse();
           }
           catch (Exception e)
           {
               Console.WriteLine("Login - " + e.Message.ToString() + " (GR)");
               return null;
           }

           bool isLoggedIn = false;

           // Store the cookies
           foreach (Cookie c in response.Cookies)
           {
               if (c.Name.Contains("_u"))
               {
                   if (Convert.ToInt32(c.Value) > 1)
                   {
                       isLoggedIn = true;

                   }
               }
               myContainer.Add(c);
           }

           if (isLoggedIn)
           {

               string _url = "http://www.dandrews.net/forum/custom.php";
               string strResult = "";

               HttpWebRequest _request = (HttpWebRequest)HttpWebRequest.Create(_url);
               _request.CookieContainer = myContainer;
               HttpWebResponse _response = (HttpWebResponse)_request.GetResponse();



               using (StreamReader sr = new StreamReader(_response.GetResponseStream()))
               {
                   strResult = sr.ReadToEnd();
                   // Close and clean up the StreamReader
                   sr.Close();
               }
               form.userbox.Text = strResult;

               return myContainer;

           }
           else
           {
               return null;
           }
       }

1 个答案:

答案 0 :(得分:1)

您使用的CookieContainer与设计的不同。

CookieContainer myContainer = new CookieContainer();

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.CookieContainer = new CookieContainer();

应该是:

CookieContainer myContainer = new CookieContainer();

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.CookieContainer = myContainer;

然后,您可以完全删除逻辑以自行填充容器,因为框架将为您执行此操作。然后确保在第二个请求中使用myContainer实例,它应该可以工作。

<强>更新

如果您必须使用WebClient课程来处理第二个请求,则可能需要查看this question以帮助您使用CookieContainer WebClient次请求。

<强>更新

根据您更新的代码:

     public static CookieContainer login(string url, string username, string password)
    {
        if (url.Length == 0 || username.Length == 0 || password.Length == 0)
        {
            Console.WriteLine("Information missing");
            return null;
        }

        CookieContainer myContainer = new CookieContainer();

        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
        request.CookieContainer = myContainer;

        // Set type to POST
        request.Method = "POST";
        request.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)";
        request.ContentType = "application/x-www-form-urlencoded";

        // Build the new header, this isn't a multipart/form, so it's very simple
        StringBuilder data = new StringBuilder();
        data.Append("username=" + Uri.EscapeDataString(username));
        data.Append("&password=" + Uri.EscapeDataString(password));
        data.Append("&login=Login");

        // Create a byte array of the data we want to send
        byte[] byteData = UTF8Encoding.UTF8.GetBytes(data.ToString());

        // Set the content length in the request headers
        request.ContentLength = byteData.Length;

        Stream postStream;
        try
        {
            postStream = request.GetRequestStream();
        }
        catch (Exception e)
        {
            Console.WriteLine("Login - " + e.Message.ToString() + " (GRS)");
            return null;
        }

        // Write data
        postStream.Write(byteData, 0, byteData.Length);

        HttpWebResponse response;
        try
        {
            response = (HttpWebResponse)request.GetResponse();
        }
        catch (Exception e)
        {
            Console.WriteLine("Login - " + e.Message.ToString() + " (GR)");
            return null;
        }
        string _url = "http://www.dandrews.net/forum/custom.php";

        // Store the cookies
        if (myContainer.GetCookies(new Uri(url)).Cast<Cookie>().Any(c => c.Name.Contains("_u")))
        {
            string strResult = "";

            HttpWebRequest _request = (HttpWebRequest)HttpWebRequest.Create(_url);
            _request.CookieContainer = myContainer;
            HttpWebResponse _response = (HttpWebResponse)_request.GetResponse();

            using (StreamReader sr = new StreamReader(_response.GetResponseStream()))
            {
                strResult = sr.ReadToEnd();
                // Close and clean up the StreamReader
                sr.Close();
            }
            Console.WriteLine(strResult);

            return myContainer;
        }
        else
        {
            return null;
        }
    }
相关问题