Java Login Bot: Webseiten auslesen mit HttpClient & jsoup

In diesem Beitrag werden wir uns anschauen, wie man sich mit Java automatisch in Webseiten einloggen und Daten auslesen kann. Unser Programm läuft im Hintergrund und ist unabhängig von Betriebssystem und Browser. Wir verwenden die freien Bibliotheken HttpClient 4.3.3 und jsoup 1.7.3.

Empfohlene Vorkenntnisse

  • allgemeine Java Kenntnisse

Inhaltsverzeichnis

  1. Ausgangssituation
  2. HTTP Header auswerten
  3. Einbinden von HttpClient und jsoup
  4. Einloggen und HTML auslesen mit HttpClient
  5. HTML parsen und Zahl auslesen mit jsoup

1. Ausgangssituation

Wir möchten uns auf dieser Demo Seite mit unseren Login Daten admin:1234 einloggen. Nach erfolgtem Login erscheint eine zufällige Zahl, an der wir interessiert sind und die wir automatisch auslesen möchten.

Einen fehlgeschlagenen Login erkennen wir an folgender Ausgabe.

2. HTTP Header auswerten

Die einfachste Möglichkeit herauszufinden, welche Daten wir für einen Login an den Server senden müssen, ist bei einem manuellen Login den HTTP Header mitzuschneiden. Beispielsweise mit dem Firefox Addon Live HTTP Headers.

Die für uns interessanten Zeilen habe ich markiert, als da wären

  • das Ziel des POST Requests in Zeile 3
  • der User-Agent in Zeile 5
  • der Referer in Zeile 10 und
  • die Daten des POST Requests (Login Daten) in Zeile 14.

User-Agent und Referer sind hierbei nicht in jedem Fall nötig, lassen unsere Anfrage aber organischer wirken und schaden keinesfalls.

3. Einbinden von HttpClient und jsoup

Java Build Path
Java Build Path

Als aller erstes müssen wir die beiden Bibliotheken in unsere Java Applikation einbinden. In eclipse machen wir hierzu beispielsweise einen Rechtsklick auf unser Java Projekt: Build Path -> Configure Build Path -> Libraries -> Add External JARs.

Folgende Imports benötigen wir für unsere Applikation.

4. Einloggen und HTML auslesen mit HttpClient

Zum Einloggen erzeugen wir einen CloseableHttpClient, welcher für uns den httpPost ausführt, dem wir die aus dem Header extrahierten Daten übergeben. Die entsprechenden Zeilen sind wieder markiert. In Zeile 22 – 24 prüfen wir, ob der Login fehlgeschlagen ist.

Die Methode gibt uns folgenden HTML Code zurück.

Wie wir sehen, hat der Login tadellos funktioniert, wir müssen nur noch die Zahl extrahieren.

5. HTML parsen und Zahl auslesen mit jsoup

Wir parsen das HTML mit jsoup zu einem Document und lesen die Zahl mit Hilfe der span id aus.

Grundsätzlich haben wir natürlich nicht immer das Glück, dass sich der Wert unserer Begierde in einem container mit id befindet. jsoup ermöglich uns aber in die entlegensten Winkel des DOM vorzudringen. 😀 Es lohnt sich an dieser Stelle mal wieder einen Blick in die jsoup Dokumentation zu werfen. Wie immer könnt ihr bei Problemen auch in die Kommentare schreiben.

Unsere main Methode könnte dann beispielsweise folgendermaßen aussehen.

Die kompletteJava Login Bot Klasse hab ich euch hier auch nochmal zum Download bereit gestellt.

Die Lösung der Aufgabe mit Captcha habe ich euch hier bereitgestellt.

Java Login Bot: Webseiten auslesen mit HttpClient & jsoup
Markiert in:            

16 Gedanken zu „Java Login Bot: Webseiten auslesen mit HttpClient & jsoup

  • 28. Dezember 2014 um 18:41
    Permalink

    Das mit dem Login klappt noch „ganz gut“

    der check ob der Login fehlgeschlagen ist, endet aber in:

    java.lang.NullPointerException
    at gui.Login.parseHTML(Login.java:57)
    at gui.Login.main(Login.java:64)

    er erkennt also nicht das dort „Falsche Nutzerdaten“ auf der Seite steht.

    Dann klappt der Login auch nur so halb, wenn ich direkt nach einem Login ein neuen probiere ( andere seite ) scheint er aus dem Cache die erste seite zu holen.

    ( Vom Download getestet )

    Antworten
    • 2. Januar 2015 um 16:22
      Permalink

      Hi Patrik,

      wenn du meinen Code unverändert übernommen hast, dürfte eigentlich keine NullPointerException auftreten.

      Die Exception deutet darauf hin, dass getElementById() das entsprechende HTML-Element nicht findet.

      In deinem letzen Abschnitt kann ich dir leider nicht folgen. Wenn du mir genauer schreibst, was du vorhast, kann ich dir vielleicht ein paar Tipps geben. 🙂

      Viele Grüße,
      Johannes

      Antworten
  • 9. Januar 2015 um 23:50
    Permalink

    Habe versucht das ganze für https://www.hood.de/ zu übernehmen, leider erhalte ich nur einen leeren html string zurück, vl weil da js mit im spiel ist, hast du da eine idee oder sogar ein sample code?

    Antworten
  • 23. März 2015 um 13:10
    Permalink

    Hallo Johannes,

    Ich habe eine frage.
    Ich will ein Autologin Programmieren, mit deinem Code geht das zb. für Bananenkönig. Nun will ich das für ein anderes Browser game auch machen. Jedoch durch LiveHTTP zeigt es mir keine POST sondern nur eine GET Methode an. Gibt es eine möglichkeit trotzdem ein Autologin zu erstellen?

    Gruß,

    Sebastian

    Antworten
    • 28. Mai 2015 um 18:39
      Permalink

      Hi Sebastian,

      Ein Login via GET ist möglich, aber unüblich. Es kann aber auch sein, dass LiveHTTP nicht alle Requests anzeigt. Versuch mal die Anfragen bspw. mit Wireshark [1] mitzuschneiden.

      Viele Grüße,
      Johannes

      [1] https://www.wireshark.org/

      Antworten
  • 13. Mai 2015 um 19:27
    Permalink

    Hallo Johannes,

    ich hab da mal eine Frage.
    Ist es auch möglich Javascript-Variablen einer Website auszulesen?
    Und wenn ja, wie?

    Mit freundlichen Grüßen

    Gustav

    Antworten
    • 28. Mai 2015 um 18:35
      Permalink

      Hi Gustav,

      wenn es um das ausführen / simulieren / auslesen von JavaScript geht, könnten folgende 2 Projekte für dich interessant sein:
      http://htmlunit.sourceforge.net/
      http://docs.seleniumhq.org/

      Wenn du dein Szenario etwas genauer beschreibst, könnte ich mir vorstellen, dazu eine Anleitung in einem eigenen Beitrag zu veröffentlichen.

      Viele Grüße,
      Johannes

      Antworten
  • 16. Juni 2015 um 12:17
    Permalink

    Hi Johannes,
    erstmal danke für das Bereitstellen des Codes.
    Leider zeigt es bei mir immer den Fehler an:
    „The method consume(HttpEntity) is undefined for the type EntityUtils“
    Kann mir da jemand bitte weiterhelfen!

    Danke und beste Grüße,

    Uli

    Antworten
  • 12. Oktober 2015 um 23:59
    Permalink

    Ich kann die Importierungen nicht ausführen, da ich die JAR-Files nicht habe ich habe über all gesucht. Es gibt zu jedem Paket 100 Versionen :(( Wo kann ich exakt die selbe JAR-Files herbekommen, die SIe verwendet haben. Über eine schnelle Antwort würde ich mich sehr freuen! Es ist wirklich sehr dringend!!!

    Mit freundlichen Grüßen
    Farzin Ranjbar 🙁

    Antworten
  • 25. Oktober 2015 um 12:20
    Permalink

    Guten Tag
    Gibt es mit dem Java Loggin Bot auch eine Möglichkeit den Submitbutton auszulösen und die Adresse der folge-Seite zurück zu bekommen?
    Sowas wie execute(„javascript: login_submitt.doClick();“) und „return window.location.href;“?

    Ich bin auf Linux umgestiegen, und da funktioniert das „browser.jar“ nicht.
    Vielen Dank für Hilfe.
    Richard Rüegg

    Antworten
    • 25. Oktober 2015 um 13:00
      Permalink

      Ich muss vielleicht noch anmerken, dass ich kein Englisch kann.
      Webseiten auf englisch helfen mir nur dann weiter, wenn sie nachvollziehbaren Code enthalten.

      Antworten
  • 9. Mai 2016 um 21:41
    Permalink

    Hey,

    super Erklärung!
    Funktioniert bei meinem Problem allerdings nur halb.
    Ich bekomme zwar html zurück allerdings immer die Info das der Nutzer sich zu oft eingelggt hat und deshalb gesperrt ist. Manuell kann ich mich allerdings noch anmelden.
    Kann es sein das ich noch irgendwie cookies setzen muss?

    Antworten
    • 6. Juni 2016 um 15:50
      Permalink

      Hi Holger,

      das kann unterschiedliche Ursachen haben.
      Wenn du willst, kannst du mir genauere Infos über das Kontaktformular zukommen lassen.

      Antworten
  • 15. August 2016 um 16:47
    Permalink

    hallo, ich habe versucht mich mit dem beispiel bei pastebin einzuloggen. jedoch hat es leider nicht geklappt. weiß evtl jemand woran es liegen könnte? vielen dank

    Antworten

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.