# Hintergrundlogin HTTPs Webform



## Negord (10. Jul 2014)

Guten Tag,

ich bin langsam mit meinem Java am Ende 
Ich versuche für eine Androidapp mich mit den gegebenen Logininformationen anzumelden (userID und userPW). Nach der Anmeldung soll (alles im Hintergrund natürlich) man auf die Webseite mit den Klausurergebnissen weitergeleitet und der Code geladen werden.

An sich funktioniert alles, nur das einloggen/eingeloggt bleiben (weiß nicht, was er nicht schafft) nicht.
Als Vorlage habe ich das hier genommen und quasi 1:1 an meine Bedürfnisse angepasst.

Code ist:

```
/**
 * Created by p.m on 06.07.2014.
 */
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.CookieHandler;
import java.net.CookieManager;
import java.net.URL;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
import javax.net.ssl.HttpsURLConnection;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class HttpUrlConnectionExample {
    private List<String> cookies;
    private HttpsURLConnection conn;

    private final String USER_AGENT = "Mozilla/5.0";

    public static void main(String[] args) throws Exception {

        String url = "https://cis.nordakademie.de/pruefungsamt/pruefungsergebnisse/?no_cache=1";
        String gmail = "https://cis.nordakademie.de/pruefungsamt/pruefungsergebnisse/?no_cache=1";

        HttpUrlConnectionExample http = new HttpUrlConnectionExample();

        // make sure cookies is turn on
        CookieHandler.setDefault(new CookieManager());

        // 1. Send a "GET" request, so that you can extract the form's data.
        String page = http.GetPageContent(url);
        String postParams = http.getFormParams(page, "HIERUSERID", "HIERUSERPW");
        //USERID und USERPW werden später durch Variablen ersetzt.

        // 2. Construct above post's content and then send a POST request for
        // authentication
        http.sendPost(url, postParams);

        // 3. success then go to gmail.
        String result = http.GetPageContent(gmail);
        System.out.println(result);
    }

    private void sendPost(String url, String postParams) throws Exception {

        URL obj = new URL(url);
        conn = (HttpsURLConnection) obj.openConnection();

        // Acts like a browser
        conn.setUseCaches(false);
        conn.setRequestMethod("POST");
        conn.setRequestProperty("Accept",
                "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
        conn.setRequestProperty("Accept-Encoding", "gzip,deflate,sdch");
        conn.setRequestProperty("Accept-Language", "de-DE,de;q=0.8,en-US;q=0.6,en;q=0.4");
        conn.setRequestProperty("Cache-Control", "max-age=0");
        conn.setRequestProperty("Connection", "keep-alive");
        conn.setRequestProperty("Content-Length", Integer.toString(postParams.length()));
        conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
        for (String cookie : this.cookies) {
            conn.addRequestProperty("Cookie", cookie.split(";", 1)[0]);
        }
        conn.setRequestProperty("Host", "cis.nordakademie.de");
        conn.setRequestProperty("Origin", "https://cis.nordakademie.de");
        conn.setRequestProperty("Referer", "https://cis.nordakademie.de/");
        conn.setRequestProperty("User-Agent", USER_AGENT);

        conn.setDoOutput(true);
        conn.setDoInput(true);

        // Send post request
        DataOutputStream wr = new DataOutputStream(conn.getOutputStream());
        wr.writeBytes(postParams);
        wr.flush();
        wr.close();

        int responseCode = conn.getResponseCode();
        System.out.println("\nSending 'POST' request to URL : " + url);
        System.out.println("Post parameters : " + postParams);
        System.out.println("Response Code : " + responseCode);

        BufferedReader in =
                new BufferedReader(new InputStreamReader(conn.getInputStream()));
        String inputLine;
        StringBuffer response = new StringBuffer();

        while ((inputLine = in.readLine()) != null) {
            response.append(inputLine);
        }
        in.close();
        // System.out.println(response.toString());

    }

    private String GetPageContent(String url) throws Exception {

        URL obj = new URL(url);
        conn = (HttpsURLConnection) obj.openConnection();

        // default is GET
        conn.setRequestMethod("GET");

        conn.setUseCaches(false);

        // act like a browser

        conn.setRequestProperty("User-Agent", USER_AGENT);
        conn.setRequestProperty("Accept",
                "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
        conn.setRequestProperty("Accept-Language","de-DE,de;q=0.8,en-US;q=0.6,en;q=0.4");
        if (cookies != null) {
            for (String cookie : this.cookies) {
                conn.addRequestProperty("Cookie", cookie.split(";", 1)[0]);
            }
        }
        int responseCode = conn.getResponseCode();

        System.out.println("\nSending 'GET' request to URL : " + url);
        System.out.println("Response Code : " + responseCode);

        BufferedReader in =
                new BufferedReader(new InputStreamReader(conn.getInputStream()));
        String inputLine;
        StringBuffer response = new StringBuffer();

        while ((inputLine = in.readLine()) != null) {
            response.append(inputLine);
        }
        in.close();

        // Get the response cookies
        setCookies(conn.getHeaderFields().get("Set-Cookie"));

        return response.toString();

    }

    public String getFormParams(String html, String username, String password)
            throws UnsupportedEncodingException {

        System.out.println("Extracting form's data...");

        Document doc = Jsoup.parse(html);

        // LoginDIV form id
        Element loginform = doc.getElementById("c217");

        //NEU
        Elements inputElements = loginform.getElementsByTag("input");
        //
        List<String> paramList = new ArrayList<String>();
        for (Element inputElement : inputElements) {
            String key = inputElement.attr("name");
            String value = inputElement.attr("pass");

            if (key.equals("user"))
                value = username;
            else if (key.equals("pass"))
                value = password;
            //Testweise
            else if(key.equals("submit"))
                value = "Anmelden";
            else if(key.equals("logintype"))
                value = "login";
            else if(key.equals("pid"))
                value = "2";
            else if(key.equals("redirect_url"))
                value = "";

            paramList.add(key + "=" + URLEncoder.encode(value, "UTF-8"));
        }

        // build parameters list
        StringBuilder result = new StringBuilder();
        for (String param : paramList) {
            if (result.length() == 0) {
                result.append(param);
            } else {
                result.append("&" + param);
            }
        }
        return result.toString();
    }

    public List<String> getCookies() {
        return cookies;
    }

    public void setCookies(List<String> cookies) {
        this.cookies = cookies;
    }


}
```
(Natürlich werden noch Variablen geändert/entfernt/einiges Umgebaut, ich will es erstmal am laufen haben)
Die beiden links oben (url & gmail) sind die gleichen, da man bei der immer auf die Startseite kommt, außer man ist angemeldet.
Im Anhang ein Bild des Anmeldeverkehrs (jedoch fehlt bei Cookies ein PHPSessionID-kram).
Beim Debuggen fehlt mir aber der auf dem Bild abgebildete lmdata ... Cookie.

Als Ausgabe bekomme ich übrigens:


> Sending 'GET' request to URL : https://cis.nordakademie.de/pruefungsamt/pruefungsergebnisse/?no_cache=1
> Response Code : 200
> Extracting form's data...
> 
> ...



Wenn ich nicht korrekte Daten bei UserID und UserPW eingebe, bekomme ich beim ausführen einen 401 Fehler (er muss also im Loginprozess drinne sein).

Über Vorschläge wäre ich dankbar 

Grüße,

Negord


----------



## Anti-Banane (10. Jul 2014)

setze dich bitte mit dem zuständigen adminstrator in verbindung


----------



## Negord (3. Aug 2014)

Okay, ein Kollege konnte mir helfen.
Sieht so aus:

```
import java.io.IOException;
import java.util.Map;

import org.jsoup.Connection;
import org.jsoup.Connection.Method;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;


public class GetData {

	public String getData(String login, String pw) throws Exception {
		
		String username = login;
        String password = pw;
		String loginUrl = "https://cis.nordakademie.de/index.php";
		String pruefungsergebnisseUrl = "https://cis.nordakademie.de/pruefungsamt/pruefungsergebnisse/";
		
		Connection.Response htmlCisMainPageAfterLogin = Jsoup.connect(loginUrl)
			    .data("user", username, "pass", password, "logintype", "login", "pid", "2", "redirect_url", "", "submit", "Anmelden")
			    .method(Method.POST)
			    .execute();
		
			//debug
			//Document doc = htmlCisMainPageAfterLogin.parse();
			
			Map<String, String> cisCookies = htmlCisMainPageAfterLogin.cookies();

			//Warte 3 Sekunden, damit der Webserver nicht bemerkt, dass der Prozess automatisiert ist ;)
			//Thread.sleep(3000);
			
			Document htmlPruefungsergebnisse = Jsoup.connect(pruefungsergebnisseUrl)
				    .cookies(cisCookies)
				    .get();
			
			return htmlPruefungsergebnisse.html();
	}

}
```
(für alle die etwas in der Art suchen).

Mein jetziges Problem: (ich hab die 3 Sekunden schon rausgenommen)
Wenn man das gekapselt ausführt dauert es ca. 3 Sekunden bis man den Webseitenquelltext hat.
Wenn ich das in Android ausführe als einzelnen Thread, dauert es ca. 27 Sekunden lt. Onlinestoppuhr.

Zum Aufrufen sieht es aktuell so aus:

```
private String data = "";
    private void networkMethod()
    {
        Thread thread = new Thread(new Runnable(){
            @Override
            public void run() {
                try {
                    GetData gd = new GetData();
                    data = gd.getData(loginTxt,pwTxt);
                } catch (Exception e){
                    System.out.println(e);
                }
            }
        });

        thread.start();

        System.out.println(data);
    }
```

Jemand eine Idee?

Grüße,

Negord


----------



## Anti-Banane2 (3. Aug 2014)

ich würde behaupten das entweder der server so lange braucht oder was mit der verbindung nicht hinhaut

wie bereits erwähnt : setze dich bitte mit dem zuständigen admin in verbindung ... wir KÖNNEN dir hier einfach nicht helfen weil wir keine login-daten haben um entsprechend selbst was zu testen bzw deinen code nachvollziehen zu können

oder einfacher : wir können dein problem auf grund nicht vorhandener login-daten nicht nachvollziehen


----------



## Negord (3. Aug 2014)

Mir ist klar das man die Funktion ohne Logindaten nicht testen kann, aber man kann doch wenigstens sagen ob der Grundaufbau stimmt, bspw. eben mit dem Thread.

Und ich schrieb ja schon: Wenn man die Loginmethode gekapselt, also einzeln ohne App&Co laufen lässt,
dann dauert das ganze 3 Sekunden. Anders 30 Sekunden, obwohl ich da nicht viel anders mach außer es eben im Thread laufen zu lassen.

Aber okay, trotzdem danke


----------



## Anti-Banane2 (3. Aug 2014)

gib mir login-daten und ich kanns tracen ob halt die antwort vom server so lange dauert oder ob dein code schrott ist ... aber wenn ich nur n standard-response bekomme kann ichs nich prüfen
außerdem sollte man mal beim admin nachfragen was da im backend läuft


----------

