OGame Projekt in Java

01/19/2016 14:03 JavaNoob#1
Hallo Zusammen,

Zur Zeit baue ich an einem OGame Automatisierungs Programm.

Meine erste Hürde war es den Login Prozess nach zu vollziehen.

Habe eine Java Klasse namens "Cookie" gebaut. Soweit tut Sie was ich wollte, die Login Cookies in eine Map<String, String> schreiben.

Klassenvariable ist Map<String, String> Cookies
Konstruktor ist Cookie(String uni, String login, String pass)
Die Funktion getSession(...) liefert dann das Cookie.


Ich tue mir noch was schwer mit der Objekt Orientierung, wie Ihr wahrscheinlich seht. Wenn jemand einen Tipp hat bzw. sagen kann was ich falsch mache wäre ich super dankbar!!! Es ist sowieso ein Wunder das diese Klasse funktioniert.

Code:
package Login;

import java.util.Map;

public class start {
	  public static void main(String[] args) throws Exception {
		  OGameLogin OGameLogin = new OGameLogin("s131-de.ogame.gameforge.com","Schlafsong", "computer#2");

		  for (Map.Entry<String, String> entry : OGameLogin.getCookies().entrySet())
          {
              System.out.println(entry.getKey() + "=" + entry.getValue());
          }
	  }
}
Code:
package Login;

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

/* 
 * http://jsoup.org/
 * */
import org.jsoup.Connection;
import org.jsoup.Jsoup;
import org.jsoup.Connection.Method;

public class OGameLogin {
	static Map<String, String> Cookies = null;
	
	public OGameLogin(String uni, String login, String pass)
	{
		Cookies = getSession(uni, login, pass);
	}
	
	static Map<String,String> getCookies()
	{
		return Cookies;		
	}
	
	  private static Map<String, String> getSession(String uni, String login, String pass)
	  {
		  Connection.Response res = null;
		  Map<String, String> Cookies = null;
		  
	        try
			  {
	        		// First Visit to get SID
	        		Connection.Response loginForm = Jsoup.connect("http://www.ogame.de")
	                .method(Connection.Method.GET)
	                .execute();
	        		
	        		Cookies = loginForm.cookies();
	        		
	              try {
	                  res = Jsoup.connect("http://de.ogame.gameforge.com/main/login")
	          		        .cookies(Cookies)
	        		        .userAgent("Mozilla/5.0")
	        		        .data("uni", uni)
	        		        .data("login", login)
	        		        .data("pass", pass)
	        		        .data("kid","")
	        		        .method(Method.POST)
	                          .execute();
	
	              } catch (IOException e) {
	
	                  e.printStackTrace();
	              }
	              
	              if (res != null) {
	
	                  Cookies = res.cookies();
	              }
	        		
			  } catch (IOException e) {
	
	            e.printStackTrace();
	        }
		  	
		  return Cookies;
	  }	
}
01/19/2016 18:04 algernong#2
Was funktioniert denn nicht, oder willst du nur allgemeine Tipps zu deinem Code?

Allgemein:
1. Richtig Einrücken! Wenn du mit Netbeans / Eclipse / IntelliJ arbeitest, geht das sogar auf Knopfdruck.
2. Das Schlüsselwort "static" brauchst du nur sehr selten. Vielleicht musst du nochmal nachlesen, was das macht. Denn aktuell ist dein Code eigentlich gar nicht objektorientiert: Du hast zwar eine Klasse, und legst davon ein Objekt an, aber das Objekt selber speichert nichts und kann nichts: Alles in OGameLogin ist static, d.h. an kein Objekt sondern an die Klasse selber gebunden.
3. Attribute immer mit einem kleinen Buchstaben anfangen, also "cookies" statt "Cookies". Mit einem Großbuchstaben fangen nur Klassennamen an. Das ist wichtig, weil sonst jeder erst einmal denkt, "Cookies" wäre eine Klasse.
01/21/2016 09:49 JavaNoob#3
Vielen Dank für Deine Antwort.

Ich habe mir in der zwischen Zeit ein paar Java OOP Tutorials angeschaut. Hier habe ich Deine Erfahrung mit dem groß/klein Schreiben von Klassen und Variablen wiedergefunden. Vielen Dank dafür!

Static hab ich auch recherchiert. Ich hab nun auch Deinen Satz mit der an die Klasse gebundene Variable verstanden. Die Variable mit Static wird nur einmal erzeugt und dann in keiner weiteren Instanz des Objekts mehr neu erzeugt.
Somit haben alle Instanzen zugriff auf die Selbe Klassen-Variable. Hab ich das richtig verstanden?

Das mit dem richtig einrücken hab ich in Eclipse nun gefunden, danke für den Tipp. Ich werde mich dann die Tage noch mal dran setzen und die Login Klasse neu bauen.

ich bin für jeden guten Ratschlag dankbar!
01/21/2016 15:07 algernong#4
Hey,

genau. Ein Attribut, das static ist, existiert sogar dann, wenn es gar kein Objekt der Klasse gibt (und static Methoden auch). Folgender Code etwa funktioniert:

Code:
public class Main {
    public static void main(String[] args) {
        Foo.a = 42;
        Foo.printHelloWorld();
    }
}
Code:
public class Foo {
    public static int a;
    
    public static void printHelloWorld() {
        System.out.println("Hello World");
    }
}
01/21/2016 15:46 ComputerBaer#5
Spätestens wenn du planst mehrere Spieler gleichzeitig mit deinem Programm zu bedienen, macht es keinen Sinn mehr die Cookies in einem statischen Attribut zu speichern, immerhin hat jeder Spieler seine eigenen Cookies. Hier sollte also jeder Spieler sein eigenes OGameLogin-Objekt haben, das dann die Cookies dieses einen Spielers beinhaltet.

Edit:
Bei deinem aktuellen Code würdest du immer nur die Cookies des letzten Spielers haben, weil du das statische Attribut bei jedem Login überschreibst. Mit der Lösung würdest du also nur die Cookies von einem Spieler speichern können, außer du speicherst die Cookies nach jedem Login noch in einem anderen Objekt, von dem jeder Spieler eins hat.
01/25/2016 07:51 JavaNoob#6
@algernong: Vielen herzlichen Dank. Es ist schon sehr interessant, welche Groben fehler man so machen kann.

@ComputerBear: Auch Dir danke ich für Deine recht anschauliche Erklärung an Hand des Spieler Cookie Beispiels. Sowas hilft denke ich auch anderen, die diese Thread lesen.

Am Wochenende musste ich zu viel Hausaufgaben machen. Daher bin ich noch nicht dazu gekommen, die Klasse neu zu schreiben. Aber ich hole dies Nach. Eure Hilfe ist großartig. Ich bin über den Tipp von meinem bekannten froh, hier mal zu fragen.