# Neues Forum Thema erstellen mit java(httpclient)



## Jigga (8. Okt 2010)

hey leute,also die überschrift verrät euch ja schon so ziehmlich alles.ich möchte mich in ein forum einloggen(das funktioniert sogar schon) und dort in einem bestimmten unterforum ein neues thema erstellen.
Ich habe mir das ganze mit live httpheaders angeschaut und so alles rausgefiltert,was an feldern asugefüllt und gesendet werden muss.das habe ich dann in eine "MultipartEntity"
reinegpackt und versucht an die seite "http://beispiel.de/forum/unterforum/forum.posting/"
zu senden.Jedoch passiert da rein gar nichts.
Muss ich vll. irgendwas noch mit den cookies anstellen,sie mitsenden oder ähnliches?

oder habt ihr evtl ganz andere ideen,wie ich die idee realisieren kann?dann nur her damit

PS:Und nein, das ist von den Betreibern des Forums nicht vorboten,weil es ein Tool werden soll,dass einen gewissen Vorgang für alle erleichtern soll
Das forum ist überinges ein phpBB von Free forum hosting - FORUMOTION - Create a free forum!

Hier ist noch meine grobe anmelden kalsse + anschließendem versuch ein thema zu erstellen:


```
public class ClientFormLogin {
 
    //hier stehen noch die nötigen variablen,die ich rausgekürzt habe
 
    public static void main(String[] args) throws Exception {
 
        DefaultHttpClient httpclient = new DefaultHttpClient();
 
        HttpGet httpget = new HttpGet(
                "http://edhlr.forums-free.ca/login.forum?connexion/");
 
        HttpResponse response = httpclient.execute(httpget);
        HttpEntity entity = response.getEntity();
 
        System.out.println("Login form get: " + response.getStatusLine());
        if (entity != null) {
            entity.consumeContent();
        }
        System.out.println("Initial set of cookies:");
        List<Cookie> cookies = httpclient.getCookieStore().getCookies();
        if (cookies.isEmpty()) {
            System.out.println("None");
        } else {
            for (int i = 0; i < cookies.size(); i++) {
                System.out.println("- " + cookies.get(i).toString());
            }
        }
 
        HttpPost httpost = new HttpPost(
                "http://edhlr.forums-free.ca/login.forum?connexion/");
 
        List<NameValuePair> nvps = new ArrayList<NameValuePair>();
        nvps.add(new BasicNameValuePair("username", "muster"));
        nvps.add(new BasicNameValuePair("password", "123456"));
        nvps.add(new BasicNameValuePair("redirect", ""));
        nvps.add(new BasicNameValuePair("query", ""));
        nvps.add(new BasicNameValuePair("login", "Log+in"));
 
        httpost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8));
 
        response = httpclient.execute(httpost);
        entity = response.getEntity();
 
        System.out.println("Login form get: " + response.getStatusLine());
        if (entity != null) {
            entity.consumeContent();
        }
 
                //Die logon cookies werden hier korrekt ausgegeben
        System.out.println("Post logon cookies:");
        cookies = httpclient.getCookieStore().getCookies();
        if (cookies.isEmpty()) {
            System.out.println("None");
        } else {
            for (int i = 0; i < cookies.size(); i++) {
                System.out.println("- " + cookies.get(i).toString());
            }
        }
        
                //Hier werden die daten für den thread festgelegt
                // "nul" steht für die zahl "0",die vorher mit von int zu einem String in die variable eingelesen wird.
        final MultipartEntity mpe = new MultipartEntity(
                HttpMultipartMode.BROWSER_COMPATIBLE);
        mpe.addPart("subject", new StringBody("threadName"));
        mpe.addPart("topic_color", new StringBody(""));
        mpe.addPart("message", new StringBody("banRequest"));
        mpe.addPart("lt", new StringBody(nul));
        mpe.addPart("mode", new StringBody("newtopic"));
        mpe.addPart("f", new StringBody(hlrID));
        mpe.addPart("post", new StringBody("Send"));
        mpe.addPart("notify", new StringBody("on"));
        mpe.addPart("poll_title", new StringBody(""));
        mpe.addPart("poll_option_text", new StringBody("on"));
        mpe.addPart("poll_length", new StringBody(""));
        mpe.addPart("poll_miltiple", new StringBody(nul));
        mpe.addPart("poll_cancel_vote", new StringBody(nul));
        //Diese beiden Felder sind am ende vom POST in livehttpheaders,
               //jedoch weiß ich noch nicht so recht,was hier rein soll.
               //Es ist eine buchstaben und zahlen folge,die sich immer unterscheidet!
               //Die SID ist es auch nicht.
               mpe.addPart("auth[]",
                new StringBody(""));
        mpe.addPart("auth[]",
                new StringBody(""));
 
                //Die URL zu der "new Topic" seite
        final HttpPost httpPost = new HttpPost(
                "http://edhlr.forums-free.ca/post.forum?mode=newtopic&f=11/");
        httpPost.setEntity(mpe);
 
        response = new DefaultHttpClient().execute(httpPost);
 
    }
}
```


----------



## diel2001 (8. Okt 2010)

Wenn du eingeloggt bist, dann wird es eine Session geben. 
Eventuell musst du noch die Session-ID mitschicken, sonst weiß er doch gar nicht wem er den Post zuordnen soll


----------



## Jigga (8. Okt 2010)

diel2001 hat gesagt.:


> Wenn du eingeloggt bist, dann wird es eine Session geben.
> Eventuell musst du noch die Session-ID mitschicken, sonst weiß er doch gar nicht wem er den Post zuordnen soll



daran habe ich auch schon gedacht,ich versuche sie mal auszulesen.aber wie sende ich sie?
Binde ich sie auch einfach ins Multipart ein?
danke für die antwort 

EDIT: Ausserdem machen mir die letzten 2 felder im new topic post sorgen.beide heißen "auth[]" und haben immer eine andere zahlen und buchstaben folge,wie zB diese hier: "58c2d89b8957b870edd15cbc83ec8bed"
und beide unterscheiden sich ebenfalls.habe bis jetzt noch nicht rausfinden können,wo diese herkommen...


----------



## kay73 (8. Okt 2010)

Es ist schon so ein fieses Gefriemel, Posts für phpBB3 zu bauen und Du kannst nicht wissen, was der Hoster für Modifikationen am Forum vorgenommen hat. Diese Auth-felder deuten darauf hin; aber man müsste sie eigentlich im Seitenquelltext finden.

Es muss z. B. auch ein kleiner Zeitraum zwischen dem Wert des letzten Klicks (hidden Formparameter) und der Serverzeit liegen. phpBB3 scheint auch auf Reposts zu checken. Der Code unten kann auf einer unmodifizierten phpBB3-Installation ein neues Thema erzeugen; die Posts landen aber auf der Approval-Liste. Und der Post wird nicht immer erstellt. Keine Ahnung warum...



```
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.lang.StringEscapeUtils;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.params.ClientPNames;
import org.apache.http.client.params.CookiePolicy;
import org.apache.http.entity.mime.HttpMultipartMode;
import org.apache.http.entity.mime.MultipartEntity;
import org.apache.http.entity.mime.content.StringBody;
import org.apache.http.impl.client.BasicCookieStore;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.params.CoreProtocolPNames;
import org.apache.http.util.EntityUtils;

public class PhpBB3Client {

	private final String url;
	
	private final DefaultHttpClient httpClient;
	
	private final BasicCookieStore cookieStore = new BasicCookieStore();
	
	private static final Pattern pSID = Pattern.compile("<input\\s+type=\"hidden\"\\s+name=\"sid\"\\s+value=\"([a-zA-Z0-9]+)\"\\s+/>",
		Pattern.CASE_INSENSITIVE | Pattern.MULTILINE);
	
	private static final Pattern pREDIRECT = Pattern.compile("<input\\s+type=\"hidden\"\\s+name=\"redirect\"\\s+value=\"(\\S+)\"\\s+/>", 
			Pattern.CASE_INSENSITIVE | Pattern.MULTILINE);
	
	private static final Pattern pCREATION_TIME = Pattern.compile("<input\\s+type=\"hidden\"\\s+name=\"creation_time\"\\s+value=\"(\\d+)\"\\s+/>",
			Pattern.CASE_INSENSITIVE | Pattern.MULTILINE);
	
	private static final Pattern pFORM_TOKEN = Pattern.compile("<input\\s+type=\"hidden\"\\s+name=\"form_token\"\\s+value=\"([a-zA-Z0-9]+)\"\\s+/>",
			Pattern.CASE_INSENSITIVE | Pattern.MULTILINE);
			
	private static final Pattern pPOST_ACTION=Pattern.compile("<form\\s+id=\"postform\"\\s+method=\"post\"\\s+action=\"(.+)\"\\s+enctype=\"multipart/form-data\"\\s*>",
			Pattern.CASE_INSENSITIVE | Pattern.MULTILINE);

	private static final Pattern pLAST_CLICK = Pattern.compile("<input\\s+type=\"hidden\"\\s+name=\"lastclick\"\\s+value=\"(\\d+)\"\\s+/>",
			Pattern.CASE_INSENSITIVE | Pattern.MULTILINE);

	public PhpBB3Client (final String url) {
		this.url = url+(url.endsWith("/") ? "" : "/");
		
		httpClient = new DefaultHttpClient();
		httpClient.setCookieStore(cookieStore);
		httpClient.getParams().setBooleanParameter(CoreProtocolPNames.USE_EXPECT_CONTINUE, false);
		httpClient.getParams().setParameter(ClientPNames.COOKIE_POLICY, CookiePolicy.BROWSER_COMPATIBILITY);
	}
	
	public void login(final String username, final String password) {

		try {
			final String postURL=url + "ucp.php?mode=login";
			final HttpGet get = new HttpGet(postURL);
			
			HttpResponse response = httpClient.execute(get);
			if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {
				throw new IllegalStateException("Expected 200, got: " + response.getStatusLine().getStatusCode());
			}
			
			String content = EntityUtils.toString(response.getEntity());
			
			Matcher m = pSID.matcher(content);
			if(!m.find()) {
				throw new IllegalStateException("Could not parse SID.");
			}
			final String sid = m.group(1);
			
			m = pREDIRECT.matcher(content);
			if(!m.find()) {
				throw new IllegalStateException("Could not parse \"redirect\".");
			}
			final String redirect=m.group(1);
			
			final List<NameValuePair> formparams = new ArrayList<NameValuePair>();
			formparams.add(new BasicNameValuePair("username", username));
			formparams.add(new BasicNameValuePair("password", password));
			formparams.add(new BasicNameValuePair("autologin", "on"));
			formparams.add(new BasicNameValuePair("viewonline", "on"));
			formparams.add(new BasicNameValuePair("viewonline", "on"));
			formparams.add(new BasicNameValuePair("sid", sid));
			formparams.add(new BasicNameValuePair("login", "Login"));
			formparams.add(new BasicNameValuePair("redirect", redirect));		
		
			final UrlEncodedFormEntity loginPost = new UrlEncodedFormEntity(formparams, "UTF-8");
			HttpPost httpPost = new HttpPost(postURL);
			httpPost.setEntity(loginPost);
			
			response = httpClient.execute(httpPost);
			if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {
				throw new IllegalStateException("Expected 200, got: " + response.getStatusLine().getStatusCode());
			}
			
			response.getEntity().consumeContent();			
			
		} catch (final Throwable t) {
			throw new RuntimeException("Could not login! ", t);
		}
	}
	
	public void newTopic(final long forumId, final String subject, final String message ) {
		try {

			final String postURL = url + "posting.php?mode=post&f=" + forumId;
			final HttpGet get = new HttpGet(postURL);

			HttpResponse response = httpClient.execute(get);
			if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {
				throw new IllegalStateException("Expected 200, got: " + response.getStatusLine().getStatusCode());
			}
			
			String content = EntityUtils.toString(response.getEntity());
			
			Matcher m = pCREATION_TIME.matcher(content);
			if(!m.find()) {
				throw new IllegalStateException("Could not parse creation_time."+content);
			}
			final String creationTime = m.group(1);
			
			m = pFORM_TOKEN.matcher(content);
			if(!m.find()) {
				throw new IllegalStateException("Could not parse form_token.");
			}
			final String formToken=m.group(1);
			
			m = pLAST_CLICK.matcher(content);
			if(!m.find()) {
				throw new IllegalStateException("Could not parse last_click.");
			}
			final String lastClick=m.group(1);
			
			m = pPOST_ACTION.matcher(content);
			if(!m.find()) {
				throw new IllegalStateException("Could not parse post_action.");
			}
			String postAction=m.group(1);
			if(postAction.startsWith("./")) {
				postAction=postAction.substring(2, postAction.length());
			}
			postAction=StringEscapeUtils.unescapeHtml(postAction);
			
			final MultipartEntity mpe = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
			mpe.addPart("icon", new StringBody("0"));
			mpe.addPart("subject", new StringBody(subject));
			mpe.addPart("addbbcode20", new StringBody("100"));
			mpe.addPart("message", new StringBody(message));
			mpe.addPart("lastclick", new StringBody(""+(Integer.valueOf(lastClick)-3000)));
			mpe.addPart("post", new StringBody("Submit"));
			mpe.addPart("attach_sig", new StringBody("on"));
			mpe.addPart("topic_type", new StringBody("0"));
			mpe.addPart("topic_time_limit", new StringBody("0"));
			mpe.addPart("creation_time", new StringBody(creationTime));
			mpe.addPart("form_token", new StringBody(formToken));
			
			final HttpPost httpPost = new HttpPost(url+postAction);
			httpPost.setHeader("Referer", postURL);
			httpPost.setEntity(mpe);
							
			response = httpClient.execute(httpPost);
			response.getEntity().consumeContent();
			
		} catch (final Throwable t) {
			throw new RuntimeException("Could not post new Thread to forum "+forumId, t);
		}
	}
	
	public static void main(String[] args) {
		final PhpBB3Client client = new  PhpBB3Client("http://localhost/phpBB3/");
		client.login("testuser", "test123");
		client.newTopic(2, "Test", "Hello world! :-) blablablablaba"+System.currentTimeMillis());
	}
}
```


----------



## Jigga (9. Okt 2010)

ich danke dir schon mal vielmals an dieser stelle.damit werde ich direkt mal "rumspielen" 

hat jemand vielleicht noch eine idee zu den beiden "auth[]" feldern?
hab den quelltext der sete "new topic" mal danach durchsuch und nur ein ergebniss gefunden: 

```
addHiddenFields('post',{'auth[]':[['d2gd14g6f7%3A3ccc8238b1%3A93b132e4e22',22],['63g887ieeh9d3hhh6d38997%3A45%3A766995',18]]})
```

sind auch zwei nummern,aber die heir sind länger und unterscheiden sich von denen,die beim "new topic POST" gesendet werden.ich verzweifle echt an diesen 2 feldern! 


EDIT: Mir fällt gerade auf,dass die auth[] codes im POST so "lang" sind wie die sid,werden die vielleicht von der irgendwie abgeleitet?irgendwo muss man die doch herkriegen,die können ja nicht einfach aus dem nichts.


----------



## kay73 (9. Okt 2010)

Das wird ein JavaScript sein. Dir wird nichts anderes übrig bleiben als z. B. mit Firebug das Script zu debuggen und zu versuchen herauszukriegen, wo genau die Felder dranhängen. Ich könnte wetten, das dient einzig und allein dazu, es den Leuten möglichst schwierig zu machen, POSTs automatisiert abzusetzen damit sie dazu auf die Webseite müssen und all die Webŕbebanner sehen


----------



## Jigga (9. Okt 2010)

kay73 hat gesagt.:


> Das wird ein JavaScript sein. Dir wird nichts anderes übrig bleiben als z. B. mit Firebug das Script zu debuggen und zu versuchen herauszukriegen, wo genau die Felder dranhängen. Ich könnte wetten, das dient einzig und allein dazu, es den Leuten möglichst schwierig zu machen, POSTs automatisiert abzusetzen damit sie dazu auf die Webseite müssen und all die Webŕbebanner sehen



naja wenns denn da mal werbebanner gäbe,ich kriege zumindest keine.na gut wie auch immer.ich versuche dann mal nach einem firebug tutorial zu suchen,weil ich gerade ziehmlich überfordert mit dem tool bin.danke für den tipp an dieser stelle!


----------



## Jigga (10. Okt 2010)

Ich bin gerade überglücklich,weil ich die beiden auth[] codes mit firebug gefunden habe 
Jetzt muss ich nur noch gucken wie ich diese auslesen kann.
die ganze stelle,die dafür wohl zuständig ist sieht so aus:


```
//<![CDATA[ 
window.onload = function(e) {replaceFormAction('post',dF('nzzv%2B9G%2B8L%2B8Lkjnrx4lux%7Bsy3lxkk4ig%2B8Lvuyzotm4lux%7Bs%2B9Lyoj%2B9Ji8h%3F%3El%3F%3C%3F8%3D%3E%3A6h6k%3C9%3A%3D%3A%3A798ii%3F%3C%3Fh%3A','103'));addHiddenFields('post', {'auth[]':[['%3Eg79ljlkh9%3Bk%3Eh%3Ejh%3C%3Bh6ij%3B%3A%3Bhhl89%36A',51],['7l%3E%3Cj6%3A%3Ehg6%3F9%3B%3B%3B6%3A%3Fji%3D%3B6g%3D7%3Fj%3Akg6',47]]});};$(function(){});//]]>


<input type="hidden" name="auth[]" value="8a13fdfeb35e8b8db65b0cd545bbf234">
<input type="hidden" name="auth[]" value="1f86d048ba093555049dc75a719d4ea0">
```

die beiden "value" werte sind die,die ich brauche.das ganze findet sich auf der seite,nachdem man "new topic" geklickt hat,sprich wenn man gerade dabei ist sein neues thema zu schreiben.

EDIT: ok ich meine ich muss eine javascript funktion aufrufen(die oben beschriebene).
Weiß jemand wie ich das machen kann,damit ich dann meine "value" werte geliefert kriege?


----------



## Jigga (11. Okt 2010)

hmm seltsemerweise habe ich keinen "EDIT" button hier gerade,deswegen muss ich leider spammen....
hab jetzt die "value" werte mit einer zusätzlichen bibliothen auslesen können.jedoch klappt mein forum post noch nicht so richtig.deswegen die frage: kann ich alle attribute der multipart entity mit live http headers auslesen,oder gibt es da noch welche,die versteckt sind?
bei mir gibt es zB nix in richtung "lastClick" oder "signatur" im POST befehl,deswegen hatte ich das eigentlich ausgelassen


----------



## kay73 (12. Okt 2010)

LiveHttpHeaders und TamperData helfen nict wirklich weiter. Ich verwende WireShark, verwende http als Filter und lasse mir den gesamten TCP-Stream anzeigen.

Wenn ihr wirklich phpBB automatisiert ansteuern wollt, macht es vielleicht eher Sinn, eine normale phpBB Indtallation auf einem Freehoster wie funpic.de zu fahren.


----------



## Jigga (13. Okt 2010)

kay73 hat gesagt.:


> LiveHttpHeaders und TamperData helfen nict wirklich weiter. Ich verwende WireShark, verwende http als Filter und lasse mir den gesamten TCP-Stream anzeigen.
> 
> Wenn ihr wirklich phpBB automatisiert ansteuern wollt, macht es vielleicht eher Sinn, eine normale phpBB Indtallation auf einem Freehoster wie funpic.de zu fahren.



also in den daten von wireshark und live httpheaders/temper data habe ich jetzt keinen unterschied gefunden.Hatte bei mir einen kleinen rechtschreibfehler drin,daran hatte es im endeffekt gescheitert 
jetzt funktioniert alles eigentlich,treibe nur noch die kinderkrankheiten aus.
ganz großen dank für die hilfe an dieser stelle


----------



## Timi (6. Dez 2013)

Hallo kann mir einer sagen wo hier der Fehler ist ? 

/**
  *
  * Beschreibung
  *
  * @version 1.0 vom 12/1/2013
  * @author 
  */
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class Abfrage_teil_drei {
  String ConnectURL = "jdbc:mysql://           ";
  String benutzername = "                      ";
  String passwort = "                          ";
  Connection conn;  
  public static void main(String[] args) {
    try { 
      Class.forName("com.mysql.jdbc.Driver").newInstance();
    } catch(Exception e) {
      System.err.println("Treiber sind nicht da bzw. konnten nicht geladen werden");
      System.err.println(e);
      e.printStackTrace();
      System.exit(-1);

    } 
    System.out.println("Treiber sind da und können Verwendet werden!");

    try {
      conn = DriverManager.getConnection(ConnectURL, benutzername, passwort);
      Statement stmt = conn.createStatement();
      String querty = "                ";
      ResultSet rs = stmt.executeQuery(query);
      System.out.println("              ");
      while (rs.netxt()) {
        System.out.println(rs.getString("  ")+ "\t" );
        }
        rs.close();
        stmt.close();

      }
     catch (SQLException e) {
         System.err.println("Verbindung nicht möglich");
         System.exit(-1);



      } // end of while
    }
  } // end of main


Danke


----------

