HtmlAgilityPack Post Login

c# html-agility-pack login

Pregunta

Estoy intentando iniciar sesión en un sitio usando HtmlAgilityPack (sitio: http://html-agility-pack.net ).

Ahora, no puedo averiguar exactamente cómo hacerlo.

He intentado establecer los valores del formulario HTML a través de

m_HtmlDoc.DocumentNode.SelectSingleNode("//input[@name='EMAIL']").SetAttributeValue("value", "myemail.com");

Luego presento el formulario con

m_HtmlWeb.Load("http://example.com/", "POST");

Esto no está funcionando sin embargo. No se está conectando ni nada. ¿Alguien más tiene alguna otra idea?

Gracias

Respuesta aceptada

El paquete de agilidad HTML se utiliza para analizar HTML , no puede usarlo para enviar formularios. Su primera línea de código cambia los nodos analizados en la memoria. La segunda línea no publica la página en el servidor; vuelve a cargar el DOM, pero utiliza el método POST en lugar del GET predeterminado.

No parece que necesites analizar la página en este momento, ya que ya sabes el nombre del control. Use la clase HttpWebRequest para enviar una solicitud de publicación al servidor, con la cadena email=acb#example.com en la solicitud.

Aquí hay una muestra que escribí cuando necesitaba algo similar:

/// <summary>
/// Append a url parameter to a string builder, url-encodes the value
/// </summary>
/// <param name="sb"></param>
/// <param name="name"></param>
/// <param name="value"></param>
protected void AppendParameter(StringBuilder sb, string name, string value)
{
    string encodedValue = HttpUtility.UrlEncode(value);
    sb.AppendFormat("{0}={1}&", name, encodedValue);
}

private void SendDataToService()
{
    StringBuilder sb = new StringBuilder();
    AppendParameter(sb, "email", "hello@example.com");

    byte[] byteArray = Encoding.UTF8.GetBytes(sb.ToString());

    string url = "http://example.com/"; //or: check where the form goes

    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
    request.Method = "POST";
    request.ContentType = "application/x-www-form-urlencoded";
    //request.Credentials = CredentialCache.DefaultNetworkCredentials; // ??

    using (Stream requestStream = request.GetRequestStream())
    {
        requestStream.Write(byteArray, 0, byteArray.Length);
    }

    HttpWebResponse response = (HttpWebResponse)request.GetResponse();

    // do something with response
}

Respuesta popular

Si quieres hacer esto con Html Agility Pack. Aquí está el código.

CookieCollection Cookies = new CookieCollection();
            var web = new HtmlWeb();
            web.OverrideEncoding = Encoding.Default;
            web.UseCookies = true;
            web.PreRequest += (request) =>
            {
                if (request.Method == "POST")
                {
                    string payload = request.Address.Query;
                    byte[] buff = Encoding.UTF8.GetBytes(payload.ToCharArray());
                    request.ContentLength = buff.Length;
                    request.ContentType = "application/x-www-form-urlencoded";
                    System.IO.Stream reqStream = request.GetRequestStream();
                    reqStream.Write(buff, 0, buff.Length);
                }

                request.CookieContainer.Add(Cookies);

                return true;
            };

            web.PostResponse += (request, response) =>
            {
                if (request.CookieContainer.Count > 0 || response.Cookies.Count > 0)
                {
                    Cookies.Add(response.Cookies);
                }
            };

            string baseUrl = "Your Website URL";
            string urlToHit = baseUrl + "?QueryString with Login Credentials";
            HtmlDocument doc = web.Load(urlToHit, "POST");


Related

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é