12
votes

Connectez-vous au site Web à l'aide de HTMLagILityPack

Dans le code ci-dessous, je peux définir la valeur du nom d'utilisateur et du mot de passe à l'aide du fichier HTMLagityPack, mais je ne peux pas appeler l'événement de clic du bouton de connexion (l'ID dans le code source du bouton est "S1").

Y a-t-il de toute façon pour que cela soit fait? La raison pour laquelle je n'utilise pas le code> webbrowser code> est parce que j'aurai besoin du HTMLagILityPack pour récupérer des données de la page sans ID dans le code source. P>

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


0 commentaires

3 Réponses :


7
votes

Y a-t-il de toute façon pour que cela soit fait?

pas avec ce que la bibliothèque HTML Agility Pack (HAP) fournit - pas directement.

Le HAP est idéal pour obtenir une seule page et l'analyser, mais il n'est pas conçu pour les interactions continues. Les choses qui manquent sont la gestion des cookies, l'interaction JavaScript et plus encore.

Pour vous connecter, vous devez probablement envoyer un message HTTP sur le serveur, y compris les données souhaitées - le HAP ne peut pas vous aider avec cela.

Vous devrez utiliser une classe comme WebRequest pour faire le message - je suggère de regarder Fiddler et l'utiliser pour voir quelle est la demande à ressembler et à la construire en conséquence, cependant que cela peut être la première étape.

Vous voudrez peut-être enquêter sur l'utilisation d'outils d'automatisation Web tels que selenium ou watin à la place.


2 commentaires

Merci de votre aide. J'avais un look, mais j'ai certainement besoin d'utiliser HTMLagILityPack en raison du codage étrange de la source du site Web de Teh, je connecte. J'ai fait quelque chose de Dobut, je suis un peu coincé après: je me connecte via Teh WebBrowser1 Controla ND puis récupérez le cookie pour cette session. Puis-je appliquer ce cookie et ouvrir une page en utilisant ce cookie à l'aide de HTMLagilityPack?


@ user1842134 - Non, le HAP ne peut pas traiter des cookies.



0
votes

Je ne sais pas si vous utilisez le contrôle webbrowser WPF, mais si vous êtes, vous pouvez utiliser quelque chose dans le sens de

doc.GetElementById("submit_signin").Click();


0 commentaires

4
votes

Vous devez observer la demande de poste via Fiddler et voir comment elle est structurée. Par exemple: XXX PRE>

Habituellement, un site reconnaîtrait que vous êtes connecté en recevant leur cookie dans vos demandes. p>

HttpClient par défaut envoie les cookies reçus à partir d'un domaine spécifique avec chaque demande séquentielle à ce domaine (jusqu'à ce que vous disposiez de l'instance httpclient) p>

1) Créez un conteneur de cookie et attribué à votre Instance httpClient. P>

2) Utilisez httpClient pour effectuer la demande de connexion de connexion. P>

3) Utilisez httpClient pour que les données reçoivent la demande d'obtenir. p>

4) Lisez la chaîne HTML de la réponse. P>

5) Utilisez HTMLagilityPack HTMLDOCUMUMUMUME pour charger le document à partir de la chaîne HTML et non de la bande (comme la plupart des exemples montrent). P>

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


0 commentaires