Auslesen des Inhalts einer durch Login geschützten Website mit Java

URL dieses Beitrags: http://blog.stefan-macke.com/2008/09/23/auslesen-des-inhalts-einer-durch-login-geschuetzten-website-mit-java/

Wenn eine Website eine POST-Authentifizierung erfordert (bspw. über ein Login-Formular) um Daten herunterzuladen, kann man dies mit den üblichen Java-Klassen lösen (z.B. mit URLConnection, siehe hier: Sending a POST Request Using a URL). Wenn aber ein Session-Konzept mit Cookies mit ins Spiel kommt, wird dies schon schwieriger.

Wie gut, dass es die Apache Commons-Bibliotheken gibt. Damit geht es recht einfach (wie auf Tutorials.de beschrieben). Eine nette Gegenüberstellung der beiden Methoden gibt es hier: A Comparison of java.net.URLConnection and HTTPClient.

  1. package JavaTest;
  2. import org.apache.commons.httpclient.HttpClient;
  3. import org.apache.commons.httpclient.cookie.CookiePolicy;
  4. import org.apache.commons.httpclient.methods.GetMethod;
  5. import org.apache.commons.httpclient.methods.PostMethod;
  6. public class PostTest
  7. {
  8.         public static void main(String[] args)
  9.         {
  10.                 try
  11.                 {
  12.                         HttpClient client = new HttpClient();
  13.                        
  14.                         GetMethod getMethod1 = new GetMethod("http://example.org/geheim.php");
  15.                         client.executeMethod(getMethod1);
  16.                         System.out.println("Aufruf ohne Login —————–");
  17.                         System.out.println(getMethod1.getResponseBodyAsString());
  18.                         System.out.println("———————————–");
  19.                        
  20.                         PostMethod postMethod1 = new PostMethod("http://example.org/login.php");
  21.                         postMethod1.getParams().setCookiePolicy(CookiePolicy.BROWSER_COMPATIBILITY);
  22.                         postMethod1.addParameter("name", "stefan");
  23.                         postMethod1.addParameter("pass", "geheim");
  24.                         client.executeMethod(postMethod1);
  25.                         System.out.println("Login —————————–");
  26.                         System.out.println(postMethod1.getResponseBodyAsString());
  27.                         System.out.println("———————————–");
  28.                        
  29.                         client.executeMethod(getMethod1);
  30.                         System.out.println("Aufruf nach Login —————–");
  31.                         System.out.println(getMethod1.getResponseBodyAsString());
  32.                         System.out.println("———————————–");
  33.                 }
  34.                 catch (Exception e)
  35.                 {
  36.                         e.printStackTrace();
  37.                 }
  38.         }
  39. }

Wichtig wäre vielleicht noch, alle hierfür benötigten Bibliotheken einzubinden, damit man sich die vielen ClassNotFound-Exceptions sparen kann:

Kommentare zu diesem Beitrag

  1. Gravatar Blogiade
    Am 22. Oktober 2008 um 20:07 Uhr

    Also mit dem Titel hast Du mich ganz schön in die Irre geführt. Bin über deinen Blog-Beitrag eher zufällig gestolpert … was du eigentlich meinst, ist es POST-Daten mittels eines http-Client zu übertragen um dann in Folge in derselben Session weitere Seiten abrufen , das es sich dabei um eine Login-Form handelt ist dabei doch eher nebensächlich , oder?!?

  2. Gravatar Stefan
    Am 22. Oktober 2008 um 21:32 Uhr

    Da hast du natürlich Recht (das schreibe ich aber ja auch so). Mein Anliegen bei dem beschriebenen Progrämmchen war halt, eine passwortgeschützte Seite aufzurufen und dort eine Datei herunterzuladen. Deswegen die Überschrift :-)

  3. Gravatar Beck
    Am 4. November 2008 um 22:53 Uhr

    Danke für den Post. Das ist echt interessant, auch die Links, die du mit an den Start gebracht hast. Da kann man sich gleich mal ein wenig weiter bilden, was ich jetzt auch tun werde! Obwohl es schon erschreckend ist, dass man die Daten so leicht finden kann.

  4. Gravatar robert
    Am 26. Januar 2009 um 19:27 Uhr

    hallo stefan,
    ich versuche schon seit ein paar tagen ein solches script zu erstellen, welches sich auf einer webseite einloggt und dann im geschützten bereich informationen zu “holen”.
    aber irgendeinen fehler mache ich, aber weder mit dem sourcecode noch der von anderen webseiten funktioniert…
    ich versuch mich bei geocaching.com einzuloggen. was muss ich beachten?
    mein source ist wie folgt:

    //package JavaTest;

    import org.apache.commons.httpclient.HttpClient;

    import org.apache.commons.httpclient.cookie.CookiePolicy;

    import org.apache.commons.httpclient.methods.GetMethod;

    import org.apache.commons.httpclient.methods.PostMethod;

    public class PostTest

    {
    public static void main(String[] args)

    {
    try

    {

    HttpClient client = new HttpClient();

    GetMethod getMethod1 = new GetMethod(”http://www.geocaching.com/login/Default.aspx”);

    client.executeMethod(getMethod1);

    System.out.println(”Aufruf ohne Login —————–”);

    System.out.println(getMethod1.getResponseBodyAsString());

    System.out.println(”———————————–”);

    PostMethod postMethod1 = new PostMethod(”http://www.geocaching.com/login/Default.aspx”);
    postMethod1.getParams().setCookiePolicy(CookiePolicy.BROWSER_COMPATIBILITY);

    postMethod1.addParameter(”myUsername”, “meinbenutzer”);

    postMethod1.addParameter(”myPassword”, “xxxxxx”);

    client.executeMethod(postMethod1);

    System.out.println(”Login —————————–”);

    System.out.println(postMethod1.getResponseBodyAsString());

    System.out.println(”———————————–”);

    client.executeMethod(getMethod1);

    System.out.println(”Aufruf nach Login —————–”);

    System.out.println(getMethod1.getResponseBodyAsString());

    System.out.println(”———————————–”);

    }

    catch (Exception e)

    {

    e.printStackTrace();

    }

    }

    }

    kannst du mir evtl einen tipp geben?
    das wäre seeeehr nett.
    vielen dank & grüße
    robert

  5. Gravatar Stefan
    Am 26. Januar 2009 um 20:05 Uhr

    Ähem… also eine Fehlermeldung wäre durchaus sinnvoll. Was funktioniert denn nicht? Bis wohin läuft der Code?

  6. Gravatar Markus
    Am 17. Februar 2009 um 20:33 Uhr

    Das Problem liegt am login. Um sich bei Geocaching.com einzuloggen, musst du verschiedene ASP.NET Kriterien erfüllen, z.B musst du den erhaltenen Viewstate zurücksenden. Ob du den vorher anpassen musst oder nicht, weiß ich selber noch nicht, da ich da noch expirementiere.
    Wenn jemand hier eine Lösung weiß, wäre ich auch dankbar.
    Du kannst aber auf die Schnelle die Get-Methode zum Laufen bringen, indem du du deine userId als Cookie mitsendest. (Die kannst du aus dem Cookie auslesen, das dein Browser speichert.)

    PGNvZGU+DQpHZXRNZXRob2QgZ2V0TSA9IG5ldyBHZXRNZXRob2QodXJsKTsNCgkJCWdldE0uZ2V0UGFyYW1zKCkuc2V0Q29va2llUG9saWN5KENvb2tpZVBvbGljeS5CUk9XU0VSX0NPTVBBVElCSUxJVFkpOw0KCQkJZ2V0TS5zZXRSZXF1ZXN0SGVhZGVyKCJDb29raWUiLCAidXNlcmlkPWFiNTRmMTIzNC1kNjdlLWFmYjUtYmI3NS02OWIzZjIwZTQ1MyIpOw0KDQppbnQgcmVzdWx0ID0gdGhpcy5jbGllbnQuZXhlY3V0ZU1ldGhvZChnZXRNKTsNCjwvY29kZT4=
  7. Gravatar Markus
    Am 17. Februar 2009 um 20:36 Uhr

    Irgendwie wollte der Code nicht abgebildet werden. Also nochmal:

    GetMethod getM = new GetMethod(url); getM.getParams().setCookiePolicy(CookiePolicy.BROWSER_COMPATIBILITY);
    getM.setRequestHeader(”Cookie”, “userid=12345678-4fb3-bb45-b367-169b3f20e123″);
    int result = this.client.executeMethod(getM);

Einen Kommentar schreiben

XHTML: Diese Tags sind erlaubt: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>