PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : string aus URL suchen



Cristhecrusader
04.08.2010, 16:15
Hallo,
Ich suche eine Moeglichkeit dass das Programm auf eine URL geht und auf der Website nach einem bestimmten string sucht.
Hat jemand eine Idee welche Bibliothek/Header was auch immer so eine Moeglichkeit bereitstellt?

Megagamer
04.08.2010, 16:25
Das dürfte dir helfen : Winsock Tutorial: Grundlagen und TCP (http://www.c-worker.ch/tuts/wstut_op.php)

inout
04.08.2010, 16:30
Da gibt es etliche Möglichkeiten.
Du kannst dir dazu mal Sockets (http://www.c-worker.ch), WinInet (http://msdn.microsoft.com/en-us/library/aa385483%28VS.85%29.aspx), libcurl (http://curl.haxx.se/libcurl/), boost.regex (http://www.boost.org/doc/libs/1_43_0/libs/regex/doc/html/index.html) bzw. die C++ Stringfunktionen (http://www.cplusplus.com/reference/string/string/) ansehen.

AlterHacker
04.08.2010, 16:59
Folgendes benötigst du:
Irgendwie eine Methode, Sockets zu benutzen. Ganz komfortabel:
C++ Socket Class for Windows (http://www.adp-gmbh.ch/win/misc/sockets.html)
Dann musst du dich mit dem Webserver verständigen:
Hypertext Transfer Protocol – Wikipedia (http://de.wikipedia.org/wiki/Hypertext_Transfer_Protocol)
Und finally, deine Ausgabe auf der Seite finden:[Ganz simpel]
strstr - C++ Reference (http://www.cplusplus.com/reference/clibrary/cstring/strstr/)

Ggf kannst du echt noch regexp etc anschauen falls du das benötigst.

zao
05.08.2010, 01:05
Da tuts auch schon die WinApi!
Einfachen HttpRequest mit "Get" als Paramter an die gewünschte Seite. Als Antwort erhältst du den Seitenquelltext der Seite, den du dann nach belieben nach dem String untersuchen kannst.

Hier die entsprechenden Functions aus WinInet:

InternetOpen (http://msdn.microsoft.com/en-us/library/aa385096%28v=VS.85%29.aspx)
InternetConnect (http://msdn.microsoft.com/en-us/library/aa384363%28v=VS.85%29.aspx)
HttpOpenRequest (http://msdn.microsoft.com/en-us/library/aa384233%28v=VS.85%29.aspx)
HttpSendRequest (http://msdn.microsoft.com/en-us/library/aa384247%28v=VS.85%29.aspx)
InternetReadFile (http://msdn.microsoft.com/en-us/library/aa385103%28v=VS.85%29.aspx)

Gruß

zao

Cristhecrusader
05.08.2010, 02:39
Danke fuer all die Antworten werd mich da dann mal ransetzen, seid echt top :P

DoS
07.08.2010, 07:37
Guten Tag :),
zwar ist BlackBerry derzeit nicht da, aber ich weiß, dass er sich darüber aufregen würde, wenn ich jetzt einen für C++ kompletten,schnell kopierbaren Source poste. Deswegen habe ich das heute auf eine andere Weise gemacht. :) Weil ich Perl cool finde, gibt es die Lösung in Perl. Den Code wird auch ein C++ler (ungefähr) verstehen. Da jetzt endlich der Ursprung der Sockets die Berkeley Socket API ist, sind bei der Verwendung von Sockets also keine großen Unterschiede.

Heißt auf gut Deutsch: Wenn du mit C++ ein Programm schreiben möchtest, dass den Inhalt einer Website mittels Sockets runterlädt, dann hilft Folgendes weiter ( habe den Quellcode auch meiner Meinung nach schön kommentiert :); ich empfehle außerdem den kommentierten Quellcode in einen (syntaxhervorhebenden) Editor zu kopieren und auf "Vollbild" anzugucken. Dann hat man einen besseres Überblick :) ) :

(Achtung: Hier werden die Backslashs (" \ ") nicht angezeigt. In dem Code in den Code-Tags unten schon)

#!/usr/bin/perl -w
use Socket;
use IO::Handle;
use strict;

#1.) Der erste Teil dient dazu, dass der Websitename eingelesen wird und entsprechend brauchbar gemacht wird.
print "Bitte geben Sie die zu durchsuchende Website in der Form \"www.Website.de/../\" ein\n";
my $seite = <>;
chomp $seite;
print "Bitte geben Sie den Suchbegriff ein\n";
my $begriff = <>;
chomp $begriff;
my $mHost = $seite;
my $mPfad = $seite;

#Die Filterung wird hier mit regulären Ausdrücken gelöst. Man kann das natürlich auch anders machen.
#Wichtig ist nur, dass $mHost später den Wert in der Form (www.)adresse.de besitzt. Die Unterverzeichnisse
#, also website.de/.../..., dürfen nicht dabei stehen (auch nicht http:// am Anfang)
#$mPfad sollte nur die Verzeichnisstruktur enthalten, also von dem obigen Beispiel dann "/.../...".
#Achtung: Der reguläre Ausdruck ist verfälscht, da hier keine Backslashs angezeigt werden.
#Siehe unkommentierten Quellcode.
$mHost =~ s/(http\:\/\/)?((www\.)?[a-z0-9\-\.]+)\/?([a-z0-9\.\-\/\=\&\_\?\+\%\:]*)/$2/i;
$mPfad =~ s/(http\:\/\/)?(www\.)?[a-z0-9\-\.]+\/?([a-z0-9\.\-\/\=\&\_\?\+\%\:]*)/$3/i;

#2.)Hier, im zweiten Teil, wird es nun interessanter. In diesem Schritt wird ein Socket aufgebaut
# und dazu benutzt um ein Request abzuschicken.
my $port = getservbyname ("http", "tcp"); #Hier wird der Port ("http" steht sozusagen für einen Port)
# und das Transportprotokoll in der Variable $port festgehalten.
my $ziel = sockaddr_in($port, inet_aton ("$mHost")); #In dieser Zeile wird mit "inet_aton" der Hostname (IP geht auch) in eine Vierergruppenschreibweise gepackt,
# die von sockaddr_in genutzt wird. "sockaddr_in" macht aus den $port und $ip Angaben eine wichtige Host/Port-Struktur,
#die wir später brauchen. Diese wird in der Variable "$ziel" gespeichert.
socket (SOCK, AF_INET, SOCK_STREAM, getprotobyname ("tcp")); #"AF_INET" sagt aus, dass es sich um ein TCP/IP Socket handelt. SOCK_STREAM sorgt dafür,
#dass das Socket ein Stream Socket wird. Das brauchen wir für unsere TCP Verwendung
#(Guck dir den Unterschied zwischen TCP und UDP an, dann verstehst du warum für TCP meistens Stream-Sockets genutzt werden).
#Mit "getprotobyname()" wird das Transportprotokoll in einen geeigneten Integer(Ganzzahl) umgewandelt.
connect (SOCK, $ziel); #Jetzt haben wir alles was wir brauchen: Los geht's :D. Wir stellen jetzt die Verbindung her. :)
SOCK->autoflush (1); #Wir schalten noch schnell die Pufferung aus, weil unser Request sofort abgeschickt werden soll.

#3.) Jetzt kommt der dritte Teil. Das Request wird abgeschickt und die Antworten empfangen.
#Das eigentliche Request ist Folgendes: "GET /$mPfad HTTP/1.1 \r\nHost: $mHost\r\nConnection: close\r\n\r\n"
#Wir teilen dem Server mit, welche Datei wir denn jetzt von dem Server downloaden möchten. Das tuen wir
#mit dem GET Befehl. Außerdem müssen wir unsere verwendete HTTP Version mitteilen (es gab/gibt auch HTTP in Version 1.0).
#Natürlich teilen wir dem Server auch mit, von welchem Host wir die Datei verlangen :).
#Die bisher angegebenen Sachen sind die notwendigen in HTTP 1.1.
#Was ist das, warum ist da noch mehr? Ganz einfach, weil wir nach der Antwort vom Server
#keine Verbindung mehr brauchen. Deswegen können wir auch gleich unsere einfache Schleife nutzen.
# :) Mit "\r\n" werden die Attribute getrennt und mit "\r\n\r\n"
#schließlich das Ende des Requests signalisiert.
#Mehr zum Lesen gibt es natürlich in dem entsprechenden RFC.
print SOCK "GET /$mPfad HTTP/1.1 \r\nHost: $mHost\r\nConnection: close\r\n\r\n";

#Solange die Antwort übersandt wird, werden die Daten der Varible $data zugeführt.
my $data;
my $line;
while ($line = <SOCK>) {
$data = "$data$line";
}

close(SOCK); # Socket schließen

#4.) Überprüfung der empfangenen Daten auf das Schlüsselwort (ist es enthalten oder nicht).
if($data=~/$begriff/)
{
print "Der Begriff \"$begriff\" wurde gefunden \n";
}
else
{
print "Der Begriff \"$begriff\" wurde nicht gefunden \n";
}

#Das war es. Ich hoffe ich konnte dir helfen :)Hier der kommentierte Code in Code Tags. Zum Kopieren für den Editor geeignet (hier wird es richtig angezeigt):

#!/usr/bin/perl -w
use Socket;
use IO::Handle;
use strict;

#1.) Der erste Teil dient dazu, dass der Websitename eingelesen wird und entsprechend brauchbar gemacht wird.
print "Bitte geben Sie die zu durchsuchende Website in der Form \"www.Website.de/../\" ein\n";
my $seite = <>;
chomp $seite;
print "Bitte geben Sie den Suchbegriff ein\n";
my $begriff = <>;
chomp $begriff;
my $mHost = $seite;
my $mPfad = $seite;

#Die Filterung wird hier mit regulären Ausdrücken gelöst. Man kann das natürlich auch anders machen.
#Wichtig ist nur, dass $mHost später den Wert in der Form (www.)adresse.de besitzt. Die Unterverzeichnisse
#, also website.de/.../..., dürfen nicht dabei stehen (auch nicht http:// am Anfang)
#$mPfad sollte nur die Verzeichnisstruktur enthalten, also von dem obigen Beispiel dann "/.../...".
#Achtung: Der reguläre Ausdruck ist verfälscht, da hier keine Backslashs angezeigt werden.
#Siehe unkommentierten Quellcode.
$mHost =~ s/(http\:\/\/)?((www\.)?[a-z0-9\-\.]+)\/?([a-z0-9\.\-\/\=\&\_\?\+\%\:]*)/$2/i;
$mPfad =~ s/(http\:\/\/)?(www\.)?[a-z0-9\-\.]+\/?([a-z0-9\.\-\/\=\&\_\?\+\%\:]*)/$3/i;

#2.)Hier, im zweiten Teil, wird es nun interessanter. In diesem Schritt wird ein Socket aufgebaut
# und dazu benutzt um ein Request abzuschicken.
my $port = getservbyname ("http", "tcp"); #Hier wird der Port ("http" steht sozusagen für einen Port)
# und das Transportprotokoll in der Variable $port festgehalten.
my $ziel = sockaddr_in($port, inet_aton ("$mHost")); #In dieser Zeile wird mit "inet_aton" der Hostname (IP geht auch) in eine Vierergruppenschreibweise gepackt,
# die von sockaddr_in genutzt wird. "sockaddr_in" macht aus den $port und $ip Angaben eine wichtige Host/Port-Struktur,
#die wir später brauchen. Diese wird in der Variable "$ziel" gespeichert.
socket (SOCK, AF_INET, SOCK_STREAM, getprotobyname ("tcp")); #"AF_INET" sagt aus, dass es sich um ein TCP/IP Socket handelt. SOCK_STREAM sorgt dafür,
#dass das Socket ein Stream Socket wird. Das brauchen wir für unsere TCP Verwendung
#(Guck dir den Unterschied zwischen TCP und UDP an, dann verstehst du warum für TCP meistens Stream-Sockets genutzt werden).
#Mit "getprotobyname()" wird das Transportprotokoll in einen geeigneten Integer(Ganzzahl) umgewandelt.
connect (SOCK, $ziel); #Jetzt haben wir alles was wir brauchen: Los geht's :D. Wir stellen jetzt die Verbindung her. :)
SOCK->autoflush (1); #Wir schalten noch schnell die Pufferung aus, weil unser Request sofort abgeschickt werden soll.

#3.) Jetzt kommt der dritte Teil. Das Request wird abgeschickt und die Antworten empfangen.
#Das eigentliche Request ist Folgendes: "GET /$mPfad HTTP/1.1 \r\nHost: $mHost\r\nConnection: close\r\n\r\n"
#Wir teilen dem Server mit, welche Datei wir denn jetzt von dem Server downloaden möchten. Das tuen wir
#mit dem GET Befehl. Außerdem müssen wir unsere verwendete HTTP Version mitteilen (es gab/gibt auch HTTP in Version 1.0).
#Natürlich teilen wir dem Server auch mit, von welchem Host wir die Datei verlangen :).
#Die bisher angegebenen Sachen sind die notwendigen in HTTP 1.1.
#Was ist das, warum ist da noch mehr? Ganz einfach, weil wir nach der Antwort vom Server
#keine Verbindung mehr brauchen. Deswegen können wir auch gleich unsere einfache Schleife nutzen.
# :) Mit "\r\n" werden die Attribute getrennt und mit "\r\n\r\n"
#schließlich das Ende des Requests signalisiert.
#Mehr zum Lesen gibt es natürlich in dem entsprechenden RFC.
print SOCK "GET /$mPfad HTTP/1.1 \r\nHost: $mHost\r\nConnection: close\r\n\r\n";

#Solange die Antwort übersandt wird, werden die Daten der Varible $data zugeführt.
my $data;
my $line;
while ($line = <SOCK>) {
$data = "$data$line";
}

close(SOCK); # Socket schließen

#4.) Überprüfung der empfangenen Daten auf das Schlüsselwort (ist es enthalten oder nicht).
if($data=~/$begriff/)
{
print "Der Begriff \"$begriff\" wurde gefunden \n";
}
else
{
print "Der Begriff \"$begriff\" wurde nicht gefunden \n";
}

#Das war es. Ich hoffe ich konnte dir helfen :)
Hier noch einmal der unkommentierte Quellcode:

#!/usr/bin/perl -w
use Socket;
use IO::Handle;
use strict;

print "Bitte geben Sie die zu durchsuchende Website in der Form \"www.Website.de/../\" ein\n";
my $seite = <>;
chomp $seite;
print "Bitte geben Sie den Suchbegriff ein\n";
my $begriff = <>;
chomp $begriff;
my $mHost = $seite;
my $mPfad = $seite;

$mHost =~ s/(http\:\/\/)?((www\.)?[a-z0-9\-\.]+)\/?([a-z0-9\.\-\/\=\&\_\?\+\%\:]*)/$2/i;
$mPfad =~ s/(http\:\/\/)?(www\.)?[a-z0-9\-\.]+\/?([a-z0-9\.\-\/\=\&\_\?\+\%\:]*)/$3/i;

my $port = getservbyname ("http", "tcp");
my $ziel = sockaddr_in($port, inet_aton ("$mHost"));
socket (SOCK, AF_INET, SOCK_STREAM, getprotobyname ("tcp"));
connect (SOCK, $ziel);
SOCK->autoflush (1);

print SOCK "GET /$mPfad HTTP/1.1 \r\nHost: $mHost\r\nConnection: close\r\n\r\n";

my $data;
my $line;
while ($line = <SOCK>) {
$data = "$data$line";
}
close(SOCK);

if($data=~/$begriff/)
{
print "Der Begriff \"$begriff\" wurde gefunden \n";
}
else
{
print "Der Begriff \"$begriff\" wurde nicht gefunden \n";
}


Viel Spaß damit :).

Mit freundlichen Grüßen
DoS

P.S. Nehmt es mir nicht übel, dass ich den Quellcode in PHP Tags gepackt habe. Ich wollte, dass die Kommentare zur besseren Übersicht hervorgehoben werden (außerdem ist es ja auch eine Scriptsprache ;) ).