• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Webbrowser einbinden

chiemera

Newbie
Hallo,

habe mal eine allgemeine Frage. Unter Windows habe ich mit Delphi programmiert.
In Delphi konnte man beispielsweise einfach eine Webbrowser Komponente in seine GUI ziehen und schon hatte man einen Webbrowser in der Anwendung implementiert.

Gibt es sowas ähnliches auch in Entwicklungsumgebungen für Linux? Klar die InternetExplorer ActiveX kann wohl kaum verwendet werden, aber es war schon ein praktisches Feature in Delphi.
Allgemein intressiert es mich wie aufwendig es beispielsweise wäre mit KDevelop eine Anwendung zu entwicklen mit der ich den Quellcode einer bestimmten Website auslesen und im Programm weiter auswerten kann.
Kann man den Konqueror beispielsweise dazu veranlassen den HTML Code einer Seite einfach in eine Datei zu schreiben oder noch besser ihn direkt meinem Programm zurückzugeben?

Grüße
Thomas
 

homer65

Hacker
Warum brauchst du dazu einen Browser? Welche Programmiersprache willst du denn benutzen? Mit Java wäre sowas einfach zu realisieren. Könnte mal ein Beispiel raussuchen, wenn dich das interessiert?
 

sparrow

Member
Ich versteh das Problem nicht ganz.
Den Inhalt einer Webseite brauchst du nicht in Konqueror speichern. Jede moderne Programmiersprache kennt heute auch Nezwerkverbindungen.
Ein Webbrowser geht (grob) wie folgt vor:

Webbrowser -> Server Anfrage
Webbrowser <- Server Ausliefern der Seite, meist als HTML-Doc
Webbroser: interpretieren des Codes und rendern der Darstellung

Wenn du also einen Request an den Server absetzt kommt der HTML-Code der Seite zurück.

<edit>

Unter Java könnte das ganze in etwa so aussehen:

Code:
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;

public class RequestTest {

	// Start des Programms
	public static void main(String[] args) {
		// Prüfen ob Argumente beim Start übergeben wurden
		if (args.length == 0) {
			System.out.println("Plaase use the URL of the target-website as argument");
			System.exit(0);
		}
		// Erstellen einer URL aus dem 1. übergebenen Argument
		// Wenn nicht gültig: Abbruch (try / catch)
		try {
			URL url = new URL(args[0]);
			RequestTest test = new RequestTest();
			test.readAndPrintIncomingData(url);
		} catch (MalformedURLException e) {
			System.out.println(args[0] + " is not a valid URL");
			System.exit(1);
		}
	}
	
	// Ausgeben der eingehenden Daten
	private void readAndPrintIncomingData(URL url) {
		try {
			// Einen Stream zu der URL öffnen
			// kommt es zu einem Fehler (URL nicht verfügbar...): Abbruch (try / catch)
			InputStream incoming = url.openStream();
			while (true) {
				// Auslesen der eingehenden Bytes, ist der Datenstrom
				// zu Ende Beenden der Schleife
				int in = incoming.read();
				if (in < 0) {
					break;
				}
				// Ausgeben des empfangens Bytes
				System.out.print((char) in);
			}
		} catch (IOException e) {
			e.printStackTrace();
			System.out.println("An error occures: " + e.getMessage());
		}
		
	}

}

Das Programm erwartet als übergebenes Argument eine URL, empfängt die Antwort vom Server und gibt sie auf der Konsole aus.
 
OP
C

chiemera

Newbie
Ja damit funktioniert das schon, solange ich nicht beispielsweise das HTTPS-Protokoll damit empfangen will. Dann müsste ich die Antwort noch selber irgendwie entschlüsseln um an den HTML Code der Website zu gelangen.
Das wäre z.B. mit einem eingebundenen Webbrowser in Delphi viel simpler, weil der da die Arbeit des entschlüsselns für mich übernimmt. Allerdings muss man deiner Lösung auf jeden Fall zu gute halten, dass sie sehr sehr viel schlanker ist als ein komplett eingebundener Browser.
Außerdem bekomme ich so Gelegenheit mein Protokollwissen (z.B. HTTPS) zu erweitern.

Jetzt nochmal kurz zu dem was ich vor habe:
Eigentlich geht es mir darum ein kleines praktisches Tool zu programmieren, welches sich im Hintergrund auf meinen OnlineBanking Account einloggt und mir meinen aktuellen Kontostand preisgibt 8)
Hatte ich unter Windows als kleines TrayIcon neben der Uhr, wahr schon ganz lustig. Wollte mir was ähnliches jetzt für Linux basteln. Und OnlineBanking nutzt nunmal HTTPS :)
Weiß auch nicht wieso die da immer soviel Wert auf Sicherheit legen *g*

Grüße
Thomas
 

homer65

Hacker
Kollege sparrow war schneller. Genau so eine Beispiel hatte ich auch. Aber mal zu https: Habe selber keine Erfahrung damit, aber ich denke, wenn man die URL auch in der Form https://wasauchimmer angibt braucht man nichts per Hand zu entschlüsseln. Bin aber nicht 100% sicher.
 
OP
C

chiemera

Newbie
Doch leider schon. Ich habe mal mit Ethereal den Datenverkehr zwischen Firefox und einer HTTPS Seite überwacht und dabei festgestellt, dass die Antwort vom Server nur aus Zeichnwirrwarr besteht. Firefox scheint dieses WirrWarr dann zu entschlüsseln und einen HTML-Code zu generieren.
Ich werde heute Abend mal den Mitschnitt auf meinen Server legen und hier den Link hinzufügen. Weiß auch nicht wie, aber es gibt bestimmt eine Bibliothek oder etwas ähnliches mit dem man den ankommenden Datenverkehr entschlüsseln kann. Muss mich mal über das Protokoll schlau machen.
 

homer65

Hacker
Eventuell interessant könnte auch der folgende Link sein:
http://jakarta.apache.org/commons/httpclient
Habe mich aber damit noch nicht beschäftigt.
 
chiemera schrieb:
Ja damit funktioniert das schon, solange ich nicht beispielsweise das HTTPS-Protokoll damit empfangen will. Dann müsste ich die Antwort noch selber irgendwie entschlüsseln um an den HTML Code der Website zu gelangen.
Dafür gibt es libcurl.
 

homer65

Hacker
Habe mir jetzt mal ein wenig das Tutorial zu Httpclient angesehen. Der folgende Quelltext daraus funktioniert bei mir, nachdem ich auch noch logging und codec aus dem Jakarta commons Projekt der ASF installiert hatte:
package pack;
import org.apache.commons.httpclient.*;
import org.apache.commons.httpclient.methods.*;
import org.apache.commons.httpclient.params.HttpMethodParams;
import java.io.*;
public class Main
{
private static String url = "http://www.apache.org";
public static void main(String[] args)
{
HttpClient client = new HttpClient();
GetMethod method = new GetMethod(url);
method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,
new DefaultHttpMethodRetryHandler(3, false));
try
{
int statusCode = client.executeMethod(method);
if (statusCode != HttpStatus.SC_OK) {
System.out.println("Method failed: " + method.getStatusLine());
}
byte[] responseBody = method.getResponseBody();
System.out.println(new String(responseBody));
}
catch (HttpException e)
{
System.out.println("Fatal protocol violation: " + e.getMessage());
e.printStackTrace();
}
catch (IOException e)
{
System.out.println("Fatal transport error: " + e.getMessage());
e.printStackTrace();
}
finally
{
method.releaseConnection();
}
}
}

Komme aber momentan nicht an eine https Seite heran und kann damit nicht experimentieren. Laut der Feature List von Httpclient soll der aber auch https können.
 

sparrow

Member
chiemera schrieb:
Ja damit funktioniert das schon, solange ich nicht beispielsweise das HTTPS-Protokoll damit empfangen will. Dann müsste ich die Antwort noch selber irgendwie entschlüsseln um an den HTML Code der Website zu gelangen.

Das ist nicht korrekt.
Mit dem Mini-Programm kannst du Problemlos auch Seiten ausgeben die über das https-Protokoll ausgeliefert werden, ohne Änderungen am Code.
Der Grund dafür ist ganz einfach: Ich verwende in dem Programm keine direkte Socket-Connection und sende darüber den Request sondern verwende die Klasse java.net.URL. Diese Klasse ist sowas wie die eierlegende Wollmilchsau was Verbindungen angeht. In dem Moment wo der Stream geöffnet wird verhandelt diese Klassem im Hintergrund mit dem Server über die Art der Verschlüsselung und gibt den Stream problemlos sofort aus. Und zwar unverschlüsselt.
Wichtig ist nur, dass die URL richtig vorgegeben wird, also mit einem https:// voraus, dann sollte das alles kein Problem sein.
 
OP
C

chiemera

Newbie
ok, vielen Dank für die vielen Antworten von euch. Ich werde mich jetzt mal ins programmieren stürzen :wink:
Mal sehn was so alles bei rauskommt.

Thomas
 
Oben