HttpClient + 'Login'

Hallo,
ich möchte ein Programm schreiben, das eine Seite besucht und dort ein Textfeld ausfüllt.
Ein Teil des Quelltextes der Seite sieht so aus:

Bitte gib „33“ ein …

(ich hoffe der Teil reicht)

So. Aufgrund des „method=„POST““ habe ich mir gedacht, machste ne postMethod auf.

PostMethod post = new PostMethod(http://url...);

Nun steht dort "post.addParameter(„numm“, „33“);

Zu guter Letzt ergibt „client.executeMethod(post);“ 200, was doch eigentlich soviel heißt wie „Alles in Ordnung“… Aber wieso zum Teufel passiert nicht das, was eigentlich passieren muss, wenn diese Eingabe funktionieren würde - und zwar, dass mein Counter (auf der Seite (kein Java^^)) hochzählen würde

So. Aufgrund des „method=„POST““ habe ich mir gedacht, machste
ne postMethod auf.

PostMethod post = new
PostMethod(http://url…);

Was ist PostMethod für ne Klasse?
So eine Klasse gibt es nicht in der Standard Java API. Ist das was eigenes oder ne 3rd-Party Klasse? Hellsehen können wir nicht…

So eine Klasse gibt es nicht in der Standard Java API. Ist das
was eigenes oder ne 3rd-Party Klasse? Hellsehen können wir
nicht…

Nein, aber wie im Titel beschrieben, ist die Klasse Teil des Apacheprojekts „HttpClient“…
http://hc.apache.org/httpclient-3.x/apidocs/index.html

Naja, HttpClient könnte ja auch eine eigene Klasse von dir sein. So fern liegend ist die Namensgebung ja nicht für einen HTTP-Client. Wenn man nicht weiß, dass es unter den dutzenden von Apacheprojekten ein solches gibt, dann kommt man da nunmal nicht gleich drauf.

Aber egal. Folgender Code funktioniert bei mir jedenfalls einwandfrei:

import java.io.IOException;

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

public class HttpClientTest {

 public static void main(String[] args) throws HttpException, IOException {
 // Erstelle POST-Anfrage fuer Selfhtml-Testseite
 HttpClient client = new HttpClient();
 String url = "http://de.selfhtml.org/cgi-bin/comments.pl";
 PostMethod post = new PostMethod(url);
 // Benoetigte Formular-Parameter mit Werten setzen
 post.addParameter("Vorname", "Max");
 post.addParameter("Zuname", "Mustermann");
 post.addParameter("Text", "Dies ist ein Test");
 // Sende POST-Request und gib HTTP Status der Server-Antwort aus
 System.out.println("Sende POST an " + url);
 int httpStatusCode = client.executeMethod(post);
 System.out.println("HTTP-Status: " + httpStatusCode);
 // Gib den Inhalt der Server-Antwort aus.
 String response = post.getResponseBodyAsString();
 System.out.println(response);
 }

}

Das Formular wird einwandfrei abgeschickt, die Server-Antwort ist genau
die gleiche, als wenn man das Formular via Browser auf der Seite http://de.selfhtml.org/html/formulare/anzeige/input_… abschicken wuerde.

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Das funktioniert bei mir auch.
Aber im Moment habe ich noch ein ganz anderes Problem.
Auf der Seite läuft ein Timer ab. Nachdem dieser abgelaufen ist, ändert sich der Quelltext insofern, als dass eine Zahl ausgegeben wird.
Diese Zahl soll man dann in das Bestätigungsfeld eingeben.
Letzteres ist im Moment egal, da ich nichteinmal (mehr) an die Zahl komme.
Mein Aufbau:

GetMethod get = new GetMethod(url); 
client.executeMethod(get);
Thread.sleep(31000);
String body = get.getResponseBodyAsString();

„body“ ist nun aber immernoch der Quelltext der Seite, vor Ablauf des Timers. Wieso??

Es hatte vor 2 Tagen mit diesem Code eigentlich geklappt - ich habe nur die URL verändert - seitdem geht keine URL mehr.
Kann es am Server liegen (dass dieser vielleicht was verändert hat)?

Mein Aufbau:

GetMethod get = new GetMethod(url);
client.executeMethod(get);
Thread.sleep(31000);
String body = get.getResponseBodyAsString();

„body“ ist nun aber immernoch der Quelltext der Seite,
vor Ablauf des Timers. Wieso??

Weil das per JavaScript nachträglich eingebaut wird und ich bezweifle mal ganz stark, dass der HttpClient JavaScript ausführt im Hintergrund.

Es hatte vor 2 Tagen mit diesem Code eigentlich geklappt - ich
habe nur die URL verändert - seitdem geht keine URL mehr.
Kann es am Server liegen (dass dieser vielleicht was verändert
hat)?

Poste doch mal einen Beispiel-Code der bei dir nicht geht. Dann kann ich mir das mal anschauen. Sonst wird das eine fröhliche Ratestunde, denn Ursachen gibts da wahrscheinlich dutzende.

Das Problem mit der Zahl hat sich scheinbar gelöst.
Diese aber korrekt zu senden scheitert leider vergeblich. Das Programm läuft zwar scheinbar ohne Fehler ab, jedoch wird die Zahl nicht eingegebn - dieses würde ich in meinem Webinterface nämlich sehen.
Mein Code:
http://pastebin.com/m2b5a15cd

Hallo,

Der POST Request sendet den Parameter an dieser Stelle

post.addParameter("numm", this.getNumber(url));
this.client.executeMethod(post); 

Bist du sicher, dass der Server den Parameter korrekt verarbeitet?
Was gibt ein

method.getResponseBodyAsString();

im Anschluß aus?

Das

statusCode = this.client.executeMethod(method);
Thread.sleep(31000);
String sources = method.getResponseBodyAsString();

dürfte übrigens nichts bringen, die executeMethod Methode sendet den Request, getResponseBodyAsString() gibt lediglich den (bereits zuvor erhaltenen) Inhalt zurück.

Gruß
Heavy

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Der POST Request sendet den Parameter an dieser Stelle

post.addParameter(„numm“, this.getNumber(url));
this.client.executeMethod(post);

Bist du sicher, dass der Server den Parameter korrekt
verarbeitet?

Nein, absolut nicht. :smiley:

Was gibt ein

method.getResponseBodyAsString();

im Anschluß aus?

Den Quelltext des Frames:
http://pastebin.com/m9737306

Das

statusCode = this.client.executeMethod(method);
Thread.sleep(31000);
String sources = method.getResponseBodyAsString();

dürfte übrigens nichts bringen, die executeMethod Methode
sendet den Request, getResponseBodyAsString() gibt lediglich
den (bereits zuvor erhaltenen) Inhalt zurück.

Mhm, das Ergebnis ist jedenfalls eine Zahl :smiley:
Aber wie sollte ich das denn nun umstellen?

„/mailframe.php?best=true&usr=ben&quid=123456789&mid=987654321“

Sendest du das Formulat auch an diese Adresse, also inkl aller Parameter da drin?

„/mailframe.php?best=true&usr=ben&quid=123456789&mid=987654321“

Sendest du das Formulat auch an diese Adresse, also inkl aller
Parameter da drin?

PostMethod post = new PostMethod("www.paid2surf.de/mailframe.php?check=true&usr=nonstop555&quid=351050346&mid=20060714451");

post.addParameter("numm", ""+this.getNumber("www.paid2surf.de/mailframe.php?check=true&usr=nonstop555&quid=351050346&mid=20060714451");

this.client.executeMethod(post); 

So sieht das letztlich aus.
GetNumber gibt die Zahl aus dem Quelltext zurück, die dort eigentlich eingesetzt werden soll.
Ich bin mir nur nicht sicher, ob es nun diese Zahl ist, oder ob es ein Problem darstellt, wenn zwei Methoden executed werden (werden dann auch zwei Verbindungen erstellt? - Denn das käme doch einem „Aktualisieren“ im Browser gleich - und das bedeutet, dass eine neue Nummer zugeteilt wird)

Ich denke der Fehler ist folgender:

Ich nehme an, dass die URL des Formulars jedes mal anders ist, und zwar weil die Parameter quid oder mid bei jedem Aufruf anders sind.

Du machst zuerst:

PostMethod post = new PostMethod(url.toExternalForm());

Die URL ist dabei eine mit der quid=X1 und mid=Y1.

Danach machst du den GET-Request, um die Nummer zu bekommen. Dadurch wird aber eine neue quid oder mid generiert, so dass die alte URL des POST-Request nun nicht mehr stimmt. Ist dem so? Das kannst du ja testen, in dem du die Seite mehrmals aufrufst und schaust, ob die mid und quid immer gleich sind oder ob sie verschieden sind.

Wenn die mailframe.php aber exakt die nummer will, die bei dem GET-Request erzeugt wurde, dann klappt das logischerweise nicht mehr.

Du müsstest also zuerst den GET-Request machen. Aus dem Response musst du die Nummer UND die URL des Formulars extrahieren. Der POST-Request muss dann exakt an diese URL die Nummer schicken.

Ist das vielleicht die Lösung?

…aber wie im Titel beschrieben, ist die Klasse Teil des
Apacheprojekts „HttpClient“…
http://hc.apache.org/httpclient-3.x/apidocs/index.html

Ich hab mal noch ne frage:
Wie kann ich auf diese klasse zugreifen?

Du musst dir den Apache HttpClient runterladen und die JAR-Datei einbinden in deinen Classpath.

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Du musst dir den Apache HttpClient runterladen und die
JAR-Datei einbinden in deinen Classpath.

wo muss ich das denn runterladen?

wo muss ich das denn runterladen?

http://hc.apache.org/downloads.cgi

Nicht wirklich schwer zu finden…