Melden Sie sich mit HTMLAgilityPack auf der Website an

c# html-agility-pack login login-script

Frage

Im folgenden Code kann ich den Wert des Benutzernamens und des Kennworts mithilfe von HTMLAgilitypack festlegen, aber ich kann das Klickereignis der Anmeldeschaltfläche nicht aufrufen (die ID im Quellcode der Schaltfläche ist "s1").

Gibt es dafür überhaupt etwas zu tun? Der Grund , warum ich nicht die Verwendung von WebBrowser - WebBrowser ist , weil ich die HTMLAgilityPack benötigt Daten von der Seite ohne IDs im Quellcode abzurufen.

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

Akzeptierte Antwort

Gibt es dafür überhaupt etwas zu tun?

Nicht mit dem, was die HTML Agility Pack (HAP) -Bibliothek bietet - nicht direkt.

Die HAP eignet sich hervorragend, um eine einzelne Seite zu erhalten und zu analysieren, aber sie ist nicht für fortgesetzte Interaktionen gedacht. Dinge, die fehlen, sind Cookie-Management, JavaScript-Interaktion und mehr.

Um sich anzumelden, müssen Sie wahrscheinlich einen HTTP-POST an den Server senden, einschließlich der Daten, die Sie wollen - die HAP kann damit nicht helfen.

Sie müssen eine Klasse verwenden , wie WebRequest die Post machen - ich vorschlagen , Blick Fiedler und deren Verwendung zu sehen , was die Anforderung wie und entsprechend der Konstruktion aussehen soll, obwohl das nur der erste Schritt sein kann.

Möglicherweise möchten Sie stattdessen die Verwendung von Webautomatisierungswerkzeugen wie Selenium oder WatiN untersuchen .


Beliebte Antwort

Sie müssen die POST-Anfrage über Fiddler beobachten und sehen, wie es strukturiert ist. zum Beispiel :

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

Normalerweise erkennt eine Website, dass Sie angemeldet sind, indem Sie in Ihren Anfragen den Cookie erhalten.

HttpClient sendet standardmäßig die Cookies, die von einer bestimmten Domäne mit jeder sequentiellen Anforderung an diese Domäne empfangen werden (bis Sie diese HttpClient-Instanz entsorgen).

1) Erstellen Sie einen Cookie-Container und weisen Sie ihn Ihrer HttpClient-Instanz zu.

2) Verwenden Sie HttpClient, um die Anmelde-POST-Anfrage zu stellen.

3) Verwenden Sie HttpClient, um die Daten-GET-Anfrage zu stellen.

4) Lesen Sie die HTML-Zeichenfolge aus der Antwort.

5) Verwenden Sie HtmlAgilityPack HtmlDocument, um das Dokument aus der HTML-Zeichenfolge und nicht aus dem Web zu laden (wie die meisten Beispiele zeigen).

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



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