2011-02-07 6 views
5

y mientras he encontrado muchos artículos y otra información acerca de cómo GET y POST usando HttpWebRequest y Response , Me cuesta mucho hacer que las cosas funcionen como esperaría que funcionen.Cómo inicio de sesión, navego y devuelvo datos de un sitio web protegido, hasta ahora todo lo que estoy haciendo no está funcionando

He estado jugando con varias ideas que he encontrado, pero hasta ahora, nada está funcionando ... Voy a publicar mi código:

private void start_post() 
    { 
     string username = txtUser.Text; 
     string password = txtPassword.Text; 
     string strResponce; 
     byte[] buffer = Encoding.ASCII.GetBytes("username="+username+"&password="+password); 
     HttpWebRequest WebReq = (HttpWebRequest)WebRequest.Create(txtLink.Text); 
     WebReq.Method = "POST"; 
     //WebReq.Headers.Add("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)"); 
     WebReq.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)"; 
     WebReq.Headers.Add("Translate", "F"); 
     WebReq.AllowAutoRedirect = true; 
     WebReq.CookieContainer = cookieJar; 
     WebReq.KeepAlive = true; 
     WebReq.ContentType = "application/x-www-form-urlencoded"; 
     WebReq.ContentLength = buffer.Length; 
     Stream PostData = WebReq.GetRequestStream(); 
     PostData.Write(buffer, 0, buffer.Length); 
     PostData.Close(); 

     HttpWebResponse WebResp = (HttpWebResponse)WebReq.GetResponse(); 
     //txtResult.Text = WebResp.StatusCode.ToString() + WebResp.Server.ToString(); 

     Stream answer = WebResp.GetResponseStream(); 
     StreamReader _answer = new StreamReader(answer); 
     strResponce = _answer.ReadToEnd(); 
     //txtResult.Text = txtResult.Text + _answer.ReadToEnd(); 

     answer.Close(); 
     _answer.Close(); 

     foreach (Cookie cookie in WebResp.Cookies) 
     { 
      cookieJar.Add(new Cookie(cookie.Name.Trim(), cookie.Value.Trim(), cookie.Path, cookie.Domain)); 
      txtResult.Text += cookie.Name.ToString() + Environment.NewLine + cookie.Value.ToString() + Environment.NewLine + cookie.Path.ToString() + Environment.NewLine + cookie.Domain.ToString(); 
     } 

     if (strResponce.Contains("Log On Successful") || strResponce.Contains("already has a webseal session")) 
     { 
      MessageBox.Show("Login success"); 
      foreach (Control cont in this.Controls) 
      { 
       cont.Visible = true; 
      } 
     } 
     else 
     { 
      MessageBox.Show("Login Failed."); 
     } 


    } 

Aquí en el código, que soy capaz de conseguir hasta el final, y todavía obtener un inicio de sesión fallido cuando navego a http://www.comicearth.com (mi propio sitio, php y apache) Creé un formulario y de esa forma, tecleo la contraseña y el nombre de usuario. Cuando hace esto, dice que falló, lo cual está bien. También estoy usando Fidder para ver qué está pasando.

Así que de esto, sé que estoy haciendo algo mal en el siguiente código.

Sin embargo, cuando acceda a otra aplicación web, me sale el error de seguimiento en la línea:

HttpWebResponse WebResp = (HttpWebResponse)WebReq.GetResponse(); 

"Content-Length o codificación fragmentada no se pueden establecer para una operación que no escribe datos."

Estoy tratando de encontrar lo que está mal, y todo lo que he dicho que es a causa de una redirección 302 ...

Así, mirando en Fiddler puedo ver una gran diferencia entre el momento en que intento publicar los datos y cuando inicio sesión a través de una página web. Entonces sé que no estoy haciendo lo suficiente, pero no sé dónde mirar.

Mi objetivo es crear una aplicación que pueda iniciar sesión en el sitio web y luego, a través de su opción de búsqueda, extraer los datos necesarios que actualmente tenemos nuestros usuarios manualmente, si puedo automatizar parte del trabajo tedioso, realmente ayudaría a todos. Sin embargo, actualmente estoy atascado al iniciar sesión, entendiendo las cookies, etc. También, el sitio web usa marcos, no sé si eso será un problema, pero pensé que publicaría esa información, por si acaso es otro obstáculo con el que aún no me he encontrado.

Avíseme si necesita ver más código, actualmente estoy usando httpwebrequest y httpwebresponse y he leído otra información sobre el cliente web.

He descargado y he jugado con htmlagilitypack, pero en este momento no estoy seguro de que esté 100% satisfecho de cómo funciona todo eso.

Si conoce algún artículo bueno, u otra información que cubra este tema con más profundidad o tenga algo que pueda probar, hágamelo saber.

Muchas gracias por su tiempo.

Actualice con el nuevo código, vea también mi comentario a continuación: - Ok, descubrí que debido a la redirección obtenía ese mensaje de error: "Content-Length o Chunked Encoding etc ..." y entonces convertí el allowAutoRedirect = falso y ahora busco la etiqueta de "ubicación", y me redirijo a mí mismo, etc., lo cual eliminó este mensaje, sin embargo, todavía no me estoy conectando al sitio, lo cual es decepcionante y no me puedo imaginar por qué en este momento.: S

private void start_post2() 
    { 
     string username = txtUser.Text; 
     string password = txtPassword.Text; 
     Uri link = new Uri(txtLink.Text); 
     string postArgs = string.Format(@"userId={0}&password={1}", username, password); 
     byte[] buffer = Encoding.ASCII.GetBytes(postArgs); 
     HttpWebRequest WebReq = (HttpWebRequest)WebRequest.Create(txtLink.Text); 
     WebReq.Method = "POST"; 
     //WebReq.Headers.Add("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)"); 
     WebReq.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)"; 
     //WebReq.ClientCertificates.Add("Accept: application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5"); 
     WebReq.AllowAutoRedirect = false; 
     WebReq.Accept = "application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5"; 
     WebReq.Accept = "*/*"; 
     //WebReq.Headers.Add(HttpRequestHeader.Cookie, cookieJar); 
     WebReq.CookieContainer = cookieJar; 
     WebReq.KeepAlive = true; 
     WebReq.ContentType = "application/x-www-form-urlencoded"; 
     WebReq.ContentLength = buffer.Length; 
     Stream PostData = WebReq.GetRequestStream(); 
     PostData.Write(buffer, 0, buffer.Length); 
     PostData.Close(); 

     HttpWebResponse WebResp = (HttpWebResponse)WebReq.GetResponse(); 
     if (WebResp == null) throw new Exception("Response is null"); 

     foreach (Cookie cookie in WebResp.Cookies) 
     { 
      cookieJar.Add(new Cookie(cookie.Name.Trim(), cookie.Value.Trim(), cookie.Path, cookie.Domain)); 
      //txtResult.Text += cookie.Name.ToString() + Environment.NewLine + cookie.Value.ToString() + Environment.NewLine + cookie.Path.ToString() + Environment.NewLine + cookie.Domain.ToString(); 
     } 

     if (!string.IsNullOrEmpty(WebResp.Headers["Location"])) 
     { 
      string newLocation = WebResp.Headers["Location"]; 

      //Request the new location 
      WebReq = (HttpWebRequest)WebRequest.Create(newLocation); 
      WebReq.Method = "GET"; 
      WebReq.ContentType = "application/x-www-form-unlencoded"; 
      WebReq.AllowAutoRedirect = false; 
      WebReq.CookieContainer = cookieJar; 
      WebReq.CookieContainer.Add(WebResp.Cookies); 

      buffer = Encoding.ASCII.GetBytes("userId=" + username + "&password=" + password); 

      WebReq.ContentLength = buffer.Length; 
      PostData = WebReq.GetRequestStream(); 
      PostData.Write(buffer, 0, buffer.Length); 
      PostData.Close(); 

      WebResp = (HttpWebResponse)WebReq.GetResponse(); 

      foreach (Cookie cookie in WebResp.Cookies) 
      { 
       cookieJar.Add(new Cookie(cookie.Name.Trim(), cookie.Value.Trim(), cookie.Path, cookie.Domain)); 
       //txtResult.Text += cookie.Name.ToString() + Environment.NewLine + cookie.Value.ToString() + Environment.NewLine + cookie.Path.ToString() + Environment.NewLine + cookie.Domain.ToString(); 
      } 
     } 
     else if (!string.IsNullOrEmpty(WebResp.Headers["Set-Cookie"])) 
     { 
      // thinking... 
     } 

     foreach (Cookie cookie in cookieJar.GetCookies(link)) 
     { 
      MessageBox.Show(cookie.Name.ToString() + Environment.NewLine + cookie.Value.ToString() + Environment.NewLine + cookie.Path.ToString() + Environment.NewLine + cookie.Domain.ToString()); 
     } 

     StreamReader sr = new StreamReader(WebResp.GetResponseStream()); 
     string responseHtml = sr.ReadToEnd().Trim(); 

     SearchPatient(WebReq, username, password); 

    } 
+1

ACTUALIZACIÓN: Ok, me enteré de que debido a la redirección estaba recibiendo ese mensaje de error: "Content-Length o Chunked Encoding etc ..." y entonces giré el allowAutoRedirect = false y ahora busco la "ubicación" etiqueta, y redirigir a mí mismo, etc., que se deshizo de este mensaje, sin embargo, todavía no estoy logueado en el sitio, que es disa señalando y no puedo entender por qué en este momento. : S –

Respuesta

4

Si es una aplicación WinForm y la aplicación es sólo una pantalla-raspador y no muy grande de aplicaciones, U puede utilizar Watin para hacer el desguace

aquí es link para empezar

+0

¡Gracias! Esto es lo que estaba necesitando. :) –

Cuestiones relacionadas