[Java] epvp login and data extraction

02/16/2015 17:08 w1nst0ne#1
Hallo alle zusammen

In diesem Tutorial möchte ich euch zeigen, wie ihr mithilfe von Java und relativ wenig arbeitsaufwand leicht einen Login auf beliebigen Webseiten automatisieren könnt. Ich werde dies an elitepvpers demonstrieren. Um dem ganzen einen kleinen Sinn zu geben, zeige ich zusätzlich, wie man die Zahl der ungelesenen Nachrichten sowie die Zahl von allen Nachrichten und die egold Nummer ausliest.

Wenn man den Code ausprobieren möchte, braucht man nur eine Javaumgebung und die jaunt library, die man sich kostenlos downloaden kann.

Achtung: Dieses TUT erklärt nicht wie man programmiert oder die Syntax zu Java. Auch werden keine HTML Sachen erklärt.

Schritt 1:

Simples GUI um die Daten strukturiert anzuzeigen. Diesen Code wird nicht weiter erklärt. Er dient einfach zur Erstellung eines GUI.

Code:
package elitepvpers_login;

import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JLabel;
import java.awt.Font;
import javax.swing.SwingConstants;

public class code extends JFrame {

        JLabel lblNewLabel_1 = new JLabel("Private Messages:");
        JLabel lblNewLabel_2 = new JLabel("elite Gold: ");
        private JPanel contentPane;

	public code() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 300);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		
		JLabel lblNewLabel = new JLabel("Account Information: ");
		lblNewLabel.setFont(new Font("Arial Black", Font.PLAIN, 23));
		lblNewLabel.setHorizontalAlignment(SwingConstants.CENTER);
		lblNewLabel.setBounds(0, 11, 434, 28);
		contentPane.add(lblNewLabel);
		
		
		lblNewLabel_1.setFont(new Font("Arial", Font.PLAIN, 14));
		lblNewLabel_1.setBounds(59, 89, 172, 22);
		contentPane.add(lblNewLabel_1);
		
		
		lblNewLabel_2.setFont(new Font("Arial", Font.PLAIN, 14));
		lblNewLabel_2.setBounds(59, 122, 172, 22);
		contentPane.add(lblNewLabel_2);
	}
	
	public static void main(String[] args) {
		code frame = new code();
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}
	
}
Schritt 2:

Einbindung der jaunt library
Code:
import com.jaunt.*;
import com.jaunt.component.Form;
Schritt 3:

Deklaration 3 Variablen, in denen später die Informationen des eigenen Accounts gespeichert werden.

Code:
private String first_message_number;
	private String second_message_number;
        private JPanel contentPane;
	private String e_gold;
	JLabel lblNewLabel_1 = new JLabel("Private Messages:");
	JLabel lblNewLabel_2 = new JLabel("elite Gold: ");
Schritt 4:

Adden zweier Funktionen in der Mainmethode. In der ersten Funktion befindet sich die ganze Logik, in der zweiten werden die Informationen in das Label geschrieben.

Code:
public static void main(String[] args) {
		code frame = new code();
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
		frame.login_to_epvp_and_extract_account_information();
		frame.print_information();
	}
Schritt 5:

Jetzt kommen wir zum wichtigen Part dieses Tutorials, nämlich der Automatisierung des Logins.

Zuerst erstellen wir einen UserAgent innerhalb eines try catches Blocks. Mithilfe dieses Agents können wir nachher Seiten besuchen und requests senden.

Code:
try{

       UserAgent userAgent = new UserAgent(); 



     }
     catch(JauntException e){
         System.err.println(e);
     }
Schritt 6

Automatisierung Login

Dieser Schritt kann mit zwei verschiedenen Methoden gelöst werden. Ich zeige beide, erkläre aber nur die zweite Methode, da ich bei der Ersten Bilder benötige und ich momentan noch nicht berechtigt bin, diese einzubinden.

Methode 1:


Code:
userAgent.sendHEAD("http://www.elitepvpers.com/forum/login.php?do=login");
			  userAgent.sendPOST("http://www.elitepvpers.com/forum/login.php?do=login",
					    "vb_login_username=your_username&vb_login_password=&cookieuser=1&s=&securitytoken=1424094481-c28dfbdcc8291a7d2ff82ae234a3fb7fb8188941&do=login&vb_login_md5password=827ccb0eea8a706c4c34a16891f84e7b&vb_login_md5password_utf=827ccb0eea8a706c4c34a16891f84e7b&logintoken=62f6c856ac739a0304385e654ed1ff8f37c873f2662a72ad1ecef05ef8abf450&agentspecs=271&methoduuidv2=1&loginuuidv2=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsImlzcyI6Imh0dHA6XC9cL3d3dy5lbGl0ZXB2cGVycy5jb21cL2ZvcnVtIn0.ImRXcWNHeWI4bGxWRUhZXC9PRGhtTEN1eUFBenpnaW0yeE0weTczK1VJZGF0Ig.dRsAffBinNqNyQmFSN8mwIFvk2_C0PT6ycg6LaKKO1A");
In der ersten Zeile sendet man den Header, der immer bei einem Seitenaufruf automatisch gesendet wird. Die URL ist der Ort der Verarbeitung der Logineingabe. Die Methode sendPOST sendet einen post request mit deinen Formular angaben. Wen interessiert wie man diese Daten bekommt klickt hier.


Methode 2

Code:
userAgent.visit("http://www.elitepvpers.com");
			  Form form = userAgent.doc.getForm(0);
			  form.setTextField("vb_login_username", "your_username");
			  form.setTextField("vb_login_password", "your_password");
			  form.submit();
			  System.out.println("location:" + userAgent.getLocation());
Die visit Methode ist relativ selbsterklärend.
Danach wird das erste Formular geholt.
Beim setTextField wird das username Textfeld mit dem Namen vb_login_username mit deinem username gefüllt. Um den Namen eines Feldes herauszufinden, klickt man rechtsklick auf das Feld, dann Element untersuchen und dort findet man den Namen des Elements.
Zum Schluss submitet man die Form und schickt sie somit an den Server zur Verarbeitung.
Mit dem Syste.out.print.ln kann man noch überprüfen, ob der Login geklappt hat, in dem die aktuelle location ausgibt.

Schritt 7

Finden und herauslesen der Account Infos im Quelltext.

Code:
                          Element elements = userAgent.doc.findFirst("<ul id=\"userbaritems\">");
			  String messages = elements.getElement(1).innerHTML();
			  
			  
			  int index = messages.lastIndexOf(",");
			  int index2 = messages.indexOf("Unread ");
			  first_message_number = messages.substring(index2+7, index);
			  
			  index = messages.lastIndexOf(".");
			  index2 = messages.indexOf("Total ");
			  second_message_number = messages.substring(index2+6, index);
			  
			  e_gold = elements.getElement(3).getElement(1).innerHTML();
Um diese Infos zu kriegen muss man den Quelltext analysieren. Die Infos zu deinen Nachrichten und dem Elitegold befinden sich im <ul> tag, deshalb speichere ich das in der Variable elements. Danach wird das ZWEITE Element innerhalb des ul tags herausgelesen, nämlich ein li tag in dem die Nachrichten gespeichert sind. Deshalb getElement(1). Die 6 nächsten Zeilen sind normale Stringoperationen, um die Nummern der Nachrichten zu extrahieren. In der letzten Zeile wird das egold aus dem Quelltext extrahiert. Dieses müssen wir glücklicherweise nicht mehr weiter bearbeiten.

Somit haben wir bereits alle Infos, die wir wollten. Nun kann man das noch schön darstellen, dieser Schritt gehört aber nicht mehr zum wsentlichen Part.

Code:
lblNewLabel_1.setText(lblNewLabel_1.getText() + first_message_number + "/" + second_message_number);
		lblNewLabel_2.setText(lblNewLabel_2.getText() + e_gold);

Der ganze Code:


Code:
package elitepvpers_login;

import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JLabel;

import java.awt.Font;

import javax.swing.SwingConstants;

import com.jaunt.*;
import com.jaunt.component.Form;

public class code extends JFrame {
	
	private String first_message_number;
	private String second_message_number;
	private String e_gold;
	JLabel lblNewLabel_1 = new JLabel("Private Messages:");
	JLabel lblNewLabel_2 = new JLabel("elite Gold: ");

	private JPanel contentPane;

	public code() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 300);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		
		JLabel lblNewLabel = new JLabel("Account Information: ");
		lblNewLabel.setFont(new Font("Arial Black", Font.PLAIN, 23));
		lblNewLabel.setHorizontalAlignment(SwingConstants.CENTER);
		lblNewLabel.setBounds(0, 11, 434, 28);
		contentPane.add(lblNewLabel);
		
		
		lblNewLabel_1.setFont(new Font("Arial", Font.PLAIN, 14));
		lblNewLabel_1.setBounds(59, 89, 172, 22);
		contentPane.add(lblNewLabel_1);
		
		
		lblNewLabel_2.setFont(new Font("Arial", Font.PLAIN, 14));
		lblNewLabel_2.setBounds(59, 122, 172, 22);
		contentPane.add(lblNewLabel_2);
	}
	
	public void login_to_epvp_and_extract_account_information()
	{
		try{
			  UserAgent userAgent = new UserAgent(); 
			  /*userAgent.sendHEAD("http://www.elitepvpers.com/forum/login.php?do=login");
			  userAgent.sendPOST("http://www.elitepvpers.com/forum/login.php?do=login",
					    "vb_login_username=yourname&vb_login_password=&cookieuser=1&s=&securitytoken=1424094481-c28dfbdcc8291a7d2ff82ae234a3fb7fb8188941&do=login&vb_login_md5password=827ccb0eea8a706c4c34a16891f84e7b&vb_login_md5password_utf=827ccb0eea8a706c4c34a16891f84e7b&logintoken=62f6c856ac739a0304385e654ed1ff8f37c873f2662a72ad1ecef05ef8abf450&agentspecs=271&methoduuidv2=1&loginuuidv2=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsImlzcyI6Imh0dHA6XC9cL3d3dy5lbGl0ZXB2cGVycy5jb21cL2ZvcnVtIn0.ImRXcWNHeWI4bGxWRUhZXC9PRGhtTEN1eFRxK3ViQzhqa3RJa2Jid2lxYlpGR3dcL3ppbW8zWFRreXRSckVBV3BQUDNXT1YrKzdadnVFa0F5RThOc3ljVk1rZnRUQWlUektCTUt0c3JkN1M1T0k4dkVsdWNjYmM2TVNVaGVlNzRLT1wvd00wNDhiK1N4UXJsZmNSUjhPcUhpNXFDdkpETXl6NkRkYVlEUDVtbTR2dFRweEwxU2ZOdjVJc3hsRkptMHpqMTA5M3Mrd29KOWdcL1ZhWkt6WjFMTmxoM2FXeGpuNWdITkxxYW9BQVZJVVNZeUFBenpnaW0yeE0weTczK1VJZGF0Ig.dRsAffBinNqNyQmFSN8mwIFvk2_C0PT6ycg6LaKKO1A");
			  */
			  
			  userAgent.visit("http://www.elitepvpers.com");
			  Form form = userAgent.doc.getForm(0);
			  form.setTextField("vb_login_username", "yourname");
			  form.setTextField("vb_login_password", "your_password");
			  form.submit();
			  System.out.println("location:" + userAgent.getLocation() + "");
			  
			  Element elements = userAgent.doc.findFirst("<ul id=\"userbaritems\">");
			  String messages = elements.getElement(1).innerHTML();
			  
			  
			  int index = messages.lastIndexOf(",");
			  int index2 = messages.indexOf("Unread ");
			  first_message_number = messages.substring(index2+7, index);
			  
			  index = messages.lastIndexOf(".");
			  index2 = messages.indexOf("Total ");
			  second_message_number = messages.substring(index2+6, index);
			  
			  e_gold = elements.getElement(3).getElement(1).innerHTML();
			  
			}
			catch(JauntException e){
			  System.err.println(e);
			}
	}
	public void print_information()
	{
		lblNewLabel_1.setText(lblNewLabel_1.getText() + first_message_number + "/" + second_message_number);
		lblNewLabel_2.setText(lblNewLabel_2.getText() + e_gold);
	}
	
	public static void main(String[] args) {
		code frame = new code();
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
		frame.login_to_epvp_and_extract_account_information();
		frame.print_information();
	}
	
}
ACHTUNG Hier müssen noch die userdaten angepasst werden.





Das wäre es schon. Ich entschuldige mich bereits im Voraus für Schreibfehler oder Unklarheiten, welche wahrscheinlich häufig vorkommen werden. Meine elementare Absicht mit diesem Tut war, euch die Einfachheit der Webautomatisierung mit Java aufzuzeigen.

Mit freundlichen Grüssen
w1nst0ne
02/16/2015 17:30 Zunft#2
Da ich gerade ebenfalls in die Richtung programmiere, habe ich hier einen alternativen Weg mithilfe von [Only registered and activated users can see links. Click Here To Register...] inkl. MD5 Hash vom Passwort erzeugen und Session Cookie holen und speichern:

Code:
private final String USER_AGENT = "Mozilla/5.0";
String strCookie;
    
    public void login(String username, String md5Password)
    {
        try { 
            
            HttpClient httpClient = new HttpClient();

            httpClient.getParams().setParameter(HttpMethodParams.USER_AGENT, this.USER_AGENT);

            

                PostMethod postMethod = new PostMethod("http://www.elitepvpers.com/forum/login.php?do=login&langid=1") 
                {
                    @Override
                    public boolean getFollowRedirects()
                    {
                        return true;
                    }
                };

                postMethod.addParameter("vb_login_username", username);
                postMethod.addParameter("cookieuser", "1");
                postMethod.addParameter("s", "");
                postMethod.addParameter("securitytoken", "guest");        
                postMethod.addParameter("do", "login");
                postMethod.addParameter("vb_login_md5password", md5Password);
                postMethod.addParameter("vb_login_md5password_utf", md5Password);
                postMethod.addParameter("Content-Type", "ISO-8859-1");

                
                httpClient.executeMethod(postMethod);
                String resp = postMethod.getResponseBodyAsString();

                System.out.println("Cookie - wichtig: " + getCookies(httpClient));

                System.out.println("Response: " + resp);
                
                if(isLoggedIn(resp))
                    System.err.println("Erfolgreich eingeloggt");
                else
                    System.err.println("Nicht eingeloggt");        
            
        } catch (IOException ex) {
            Logger.getLogger(Connection.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

public boolean isLoggedIn(String input)
    {
        if(input.contains("Log Out"))
            return true;
        return false;
    }

public String getCookies(HttpClient client)
    {
      Cookie[] cookies = client.getState().getCookies();
      
      strCookie = "";
      
      for (int i = 0; i < cookies.length; i++) 
      {
        Cookie cookie = cookies[i];
        
        if(cookie.getName().equals("bbsessionhash"))
        {
            strCookie = cookie.toString();
        }
      }
      
      return strCookie;

    }
    
    public String createMd5(String input) throws NoSuchAlgorithmException, UnsupportedEncodingException
    {
        
        
        MessageDigest md = MessageDigest.getInstance("MD5");
		md.update(input.getBytes());
		byte[] digest = md.digest();
		StringBuffer sb = new StringBuffer();
		for (byte b : digest) {
			sb.append(String.format("%02x", b & 0xff));
		}
        
        System.out.println(sb.toString());
        
        return sb.toString();
    }