HtmlAgilityPack Post Login

c# html-agility-pack login

Question

J'essaye de me connecter à un site en utilisant HtmlAgilityPack (site: http://html-agility-pack.net ).

Maintenant, je ne sais pas exactement comment s'y prendre.

J'ai essayé de définir les valeurs de formulaire HTML via

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

Je soumets ensuite le formulaire avec

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

Cela ne fonctionne pas bien. Ce n'est pas se connecter ou quoi que ce soit. Quelqu'un d'autre a-t-il une autre idée?

Je vous remercie

Réponse acceptée

Le HTML Agility Pack est utilisé pour analyser le code HTML . Vous ne pouvez pas l'utiliser pour soumettre des formulaires. Votre première ligne de code modifie les nœuds analysés en mémoire. La deuxième ligne ne poste pas la page sur le serveur - elle charge le DOM à nouveau, mais en utilisant la méthode POST au lieu du GET par défaut.

Il ne semble pas que vous ayez besoin d'analyser la page, car vous connaissez déjà le nom du contrôle. Utilisez la classe HttpWebRequest pour envoyer une demande de publication au serveur, avec la chaîne email=acb#example.com dans la demande.

Voici un exemple que j'ai écrit lorsque j'avais besoin de quelque chose de similaire:

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

Réponse populaire

Si vous voulez faire cela avec Html Agility Pack. Voici le 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");



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi