iniciar sesión en el sitio web utilizando HTMLAgilityPack

c# html-agility-pack login login-script

Pregunta

En el siguiente código, puedo establecer el valor del nombre de usuario y la contraseña con el HTMLAgilitypack pero no puedo invocar el evento de clic del botón de inicio de sesión (la identificación en el código fuente del botón es "s1").

¿Hay alguna forma de hacer esto? La razón por la que no uso el WebBrowser es porque necesitaré el HTMLAgilityPack para recuperar datos de la página sin ID en el código fuente.

var doc = new HtmlWeb().Load("http://MYURL.com");
doc.DocumentNode.SelectSingleNode("name").SetAttributeValue("value", "MyUsername");
doc.DocumentNode.SelectSingleNode("password").SetAttributeValue("value", "MyPassword");

Respuesta aceptada

¿Hay alguna forma de hacer esto?

No con lo que proporciona la biblioteca HTML Agility Pack (HAP), no directamente.

El HAP es excelente para obtener una sola página y analizarla, pero no está diseñado para interacciones continuas. Las cosas que faltan son la administración de cookies, la interacción de JavaScript y más.

Para iniciar sesión, probablemente deba enviar un HTTP POST al servidor, incluidos los datos que desea; el HAP no puede ayudarlo.

Necesitará usar una clase como WebRequest para hacer la publicación. Sugiero mirar a Fiddler y usarlo para ver qué aspecto debería tener la solicitud y construirla en consecuencia, aunque ese puede ser el primer paso.

Es posible que desee investigar el uso de herramientas de automatización web como, por ejemplo, selenio o WatiN .


Respuesta popular

Debe observar la solicitud POST a través de fiddler y ver cómo está estructurada. por ejemplo :

    {"userName":"you","password":"pwd"}

Por lo general, un sitio reconocería que ha iniciado sesión al recibir su cookie en sus solicitudes.

HttpClient envía de forma predeterminada las cookies recibidas de un dominio específico con cada solicitud secuencial a ese dominio (hasta que deseche esa instancia de HttpClient)

1) Crear un contenedor de cookies y asignarlo a su instancia de HttpClient.

2) Utilice HttpClient para realizar la solicitud POST de inicio de sesión.

3) Utilice HttpClient para realizar la solicitud GET de datos.

4) Lea la cadena html de la respuesta.

5) Use HtmlAgilityPack HtmlDocument para cargar el documento desde la cadena html y no desde la web (como muestran la mayoría de los ejemplos).

 string baseUrl = "https://www.yourwebsite.com";
 string loginUrl = "/Account/LogOn"; 
 string sessionUrl = "/Data";

 var uri = new Uri(baseUrl);

 CookieContainer cookies = new CookieContainer();
 HttpClientHandler handler = new HttpClientHandler();
 handler.CookieContainer = cookies;

 using (var client = new HttpClient(handler))
 {
       client.BaseAddress = uri;

       var request = new { userName = "you", password = "pwd" };
       var resLogin = client.PostAsJsonAsync(loginUrl,request).Result;
       if (resLogin.StatusCode != HttpStatusCode.OK)
            Console.WriteLine("Could not login -> StatusCode = " + resLogin.StatusCode);

       // see what cookies are returned   
      IEnumerable<Cookie> responseCookies = cookies.GetCookies(uri).Cast<Cookie>();
      foreach (Cookie cookie in responseCookies)
            Console.WriteLine(cookie.Name + ": " + cookie.Value);

      var resData = client.GetAsync(dataUrl).Result;
      if(resSession.StatusCode != HttpStatusCode.OK)
            Console.WriteLine("Could not get data html -> StatusCode = " + resSession.StatusCode);

       var html = resSession.Content.ReadAsStringAsync().Result;

       var doc = new HtmlDocument();
       doc.LoadHtml(html);
 }


Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué