HtmlAgilityPack Post-Anmeldung

c# html-agility-pack login

Frage

Ich versuche mich mit HtmlAgilityPack (Website: http://html-agility-pack.net ) bei einer Site anzumelden.

Jetzt kann ich nicht genau herausfinden, wie ich das anstellen soll.

Ich habe versucht, die HTML-Formularwerte über zu setzen

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

Ich reiche dann das Formular mit ein

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

Dies funktioniert jedoch nicht. Es meldet sich nicht an oder irgendetwas. Hat noch jemand eine andere Einsicht?

Vielen Dank

Akzeptierte Antwort

Das HTML Agility Pack wird zum Analysieren von HTML verwendet - Sie können es nicht zum Senden von Formularen verwenden. Ihre erste Codezeile ändert die analysierten Knoten im Speicher. Die zweite Zeile gibt die Seite nicht an den Server weiter - sie lädt das DOM erneut, verwendet aber die POST-Methode anstelle des Standard-GET.

Es sieht nicht so aus, als müssten Sie die Seite an dieser Stelle überhaupt analysieren, da Sie den Namen des Steuerelements bereits kennen. Verwenden Sie die HttpWebRequest Klasse, um eine HttpWebRequest an den Server mit der Zeichenfolge email=acb#example.com in der Anforderung zu senden.

Hier ist ein Beispiel, das ich schrieb, als ich etwas ähnliches brauchte:

/// <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
}

Beliebte Antwort

Wenn Sie dies mit Html Agility Pack tun möchten. Hier ist der Code.

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");



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum