Webkatalog"bot" CGI und PHP

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Xabyt
User
Beiträge: 32
Registriert: Montag 30. April 2007, 14:05

Hallo,
In einem Tutorial wurde beschrieben wie man einen Webkatalogeintragungs"bot" basteln kann, der jedoch anscheinend nur für Webkataloge die zur Eintragung CGI-skripte verwenden, um einen Beitrag zu speichern, geeignet ist, also nur Formularauswertungsprogramme mit der Endung .cgi. Wenn dieser bot jetzt jedoch Daten bei einem Webkatalog der das Formular mit PHP (was viel häufiger ist) auswertet einschicken soll, wie muss ich dann folgendes Skript ändern, bzw. muss ich es überhaupt ändern? Beim Probieren wird immer nur die print-Anweisung am Ende ausgegeben, deshalb habe ich keine Klarheit.

Hier der angegebene Code (von drweb.de):

Code: Alles auswählen

#!/usr/bin/python
import cgi
import urllib
puffer = cgi.FieldStorage ()
url = puffer["url"].value
email = puffer["email"].value
parameter = urllib.urlencode({'url': url, 'email': email, 'action': "Submit"})
urllib.urlopen ("http://www.xy.de/cgi-bin/submit.cgi", parameter)
print "Content-Type: text/plain \n\n"
print "Eintrag erfolgt"
Grüße,
Felix[/code]
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Xabyt hat geschrieben:Beim Probieren wird immer nur die print-Anweisung am Ende ausgegeben, deshalb habe ich keine Klarheit.[/code]

Grüße,
Felix
Hallo Felix!

Nur mal eine kurze Analyse dieses Codes:

Code: Alles auswählen

#!/usr/bin/python
# cgi-Modul importieren (z.B. zuständig für die Auswertung von GET und POST)
import cgi

# urllib-Modul importieren (z.B. zuständig für die clientseitige Verwendung
#                           des HTTP-Protokolls)
import urllib

# puffer? Warum nennt man so eine Variable puffer? (lassen wir es mal dabei stehen)
puffer = cgi.FieldStorage ()

# Vom FieldStorage, den per GET oder POST übergebenen Feldwert des Feldes "url"
# auslesen.
url = puffer["url"].value

# Vom FieldStorage, den per GET oder POST übergebenen Feldwert des Feldes "email"
# auslesen.
email = puffer["email"].value

# Beide oben angegebenen Zeilen setzen voraus, dass die Felder "url" und "email"
# per GET oder POST übergeben wurden, was bei GET diesem URL entspricht:
# http://servername/scriptpfad?url=http%3A%2F%2Fgerold.bcom.at&email=meine%40emailadresse.at
# "url" und "email" wurden in diesem Beispiel mit ``urllib.urlencode()`` umgewandelt.

# Die per POST oder GET erhaltenen Werte werden in ein Dictionary gesteckt, welches
# mit ``urllib.urlencode()`` in einen gültigen "query string" umgewandelt werden.
parameter = urllib.urlencode({'url': url, 'email': email, 'action': "Submit"})
# So ein "query string" kann entweder an einen URL angehängt werden (GET) oder
# über den Header einer Serveranfrage (POST) zum Server übermittelt werden. Beides
# ist möglich.

# Es wird eine Webadresse per HTTP angefordert. Die Parameter werden über den
# Header der Serveranfrage (REQUEST) an den Server übermittelt. ``urllib.urlopen``
# liefert ein dateiartiges Objekt zurück, das aber hier ins Leere geht, da es nicht
# mit einer Variable benannt wird.
#
#   response = urllib.urlopen("url")
#   print response.read()
#
urllib.urlopen("http://www.xy.de/cgi-bin/submit.cgi", parameter)
# Was ist hier passiert? Es wurde ein URL aufgerufen und gleichzeitig wurden
# die Werte für "url", "email" und "action" übermittelt. Es wurde keine 
# Rückgabe ausgewertet.

# Der erste Text, der an den Browser zurück geliefert wird ist der Header.
# Dieser wird nicht angezeigt und durch eine Leerzeile vom Rest der Rückgabe
# getrennt. Hier wird dem Browser mindestens der "Content-Type" übermittelt, 
# damit er weiß, wie er die Rückgabe darstellen soll. Diese Zeile sollte 
# normalerweise so weit oben wie möglich stehen, dass nicht ungewollt etwas
# anderes als Header an den Browser übermittelt wird.
print "Content-Type: text/plain \n\n"

# Sichtbare Rückgabe an den Browser.
print "Eintrag erfolgt"
Es wird also beim Aufruf dieses Skripts erwartet, dass "url" und "email" als Text übergeben wird. Mit diesen Werten wird dann ein Programm mit der Endung "cgi" (wahrscheinlich ein Perl-Skript) aufgerufen. Dieses Perl-Skript kann dann mit diesen Werten tun und lassen, was es möchte. Dieses Perl-Skript könnte z.B. diese Werte irgendwo in eine Datenbank eintragen. Wir wissen es nicht und können es nicht nachprüfen. Die Adresse lässt sich nicht aufrufen. Den Server "xy.de" gibt es anscheinend nicht.

Hast du noch Fragen?

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Xabyt
User
Beiträge: 32
Registriert: Montag 30. April 2007, 14:05

Ich meinte das anders, dieses Programm soll "email" und "url" von mir an ein Auswertungsprogramm eines Webkatalogs schicken, das die werte "url" und "email" eigentlich normalerweise von einem HTML Formular zugesandt bekommt. In dem Fall überträgt dieses Programm die werte der Felder "email" und "url" des Formulars des Webkatalogs, nur eben ohne Formular, gleich an das (CGI[perl oder so]) Auswertungsskript, welches die Daten in den Webkatalog aufnimmt. Dieses Programm soll Benutzern die Arbeit ersparen sich immer manuell in Webkataloge einzutragen, wenn das Programm größer wird und Daten in mehrere Webkataloge einträgt (z.B. mit einer Schleife) so macht es erst richtig sinn. der Code so wie ich ihn hier gepostet habe stammt nicht von mir, er ist aus einem Tutorial. Fehler wie z.B. dass die Funktion(erst das Objekt) nicht über eine Variable aufgerufen wird, kann ich nichts dafür, und da ich Anfänger bin dachte ich das passt so.

Code: Alles auswählen

email = puffer["email"].value
Das hier soll einer der werte sein die später in den Webkatalog eingetragen werden, deswegen der name "puffer", kann man per FieldStorage nur GET oder POST daten auslesen, oder sie auch für eine spätere Eintragung, in dem Fall in einen Webkatalog "präparieren"?

Meine eigentliche Frage war:
Kann dieses Skript auch Daten an ein Auswertungsprogramm geschrieben in PHP senden, also nicht nur an CGI (also z.B. Perl o.a.)?
"gibhierdeinedatenan.html" gibt die werte der Felder nach einer Usereingabe an "hierwerdendeinedatenausgewertet.cgi" weiter, kann es aber auch an "hierwerdendeinedatenausgewertet.php" geschickt werden? Das nicht "gibhierdeinedatenan.html" die daten an das Auswertungsprogramm "hierwerdendeinedatenausgewertet.php" schickt, sondern "hierstehenmeinedatendrinundwerdenverschickt.py"?

Ich hoffe ihr versteht mich und entschuldige logische und grammatische Fehler.

Gruß,
Felix
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Xabyt hat geschrieben:Kann dieses Skript auch Daten an ein Auswertungsprogramm geschrieben in PHP senden, also nicht nur an CGI (also z.B. Perl o.a.)?
Ja. Außerdem gibt es PHP auch als CGI-Version.

Irgendwie habe ich das gefühl, du siehst hier Probleme, die es in wahrheit gar nicht gibt. Wohin Daten aus einem HTML-Formular geschickt werden, entscheidet das Forumlar. Wohin Daten in einem Skript geschickt werden, entscheidet das Skript.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

CGI ist eine Schnittstelle, die man mit PHP, Python, Perl, C, Pascal, Assembler oder sonstwas auf der Serverseite benutzen kann. Nach Außen, sprich gegenüber dem Client, sieht das aber alles gleich aus. Der sieht sogar nicht mal was von CGI, sondern arbeitet nur mit HTTP, um Daten (in der Regel) per GET oder POST an den Server zu übermitteln. Ob da PHP läuft oder wasauchimmer kannst du vollkommen außer Acht lassen.
Xabyt
User
Beiträge: 32
Registriert: Montag 30. April 2007, 14:05

Y0Gi hat geschrieben:CGI ist eine Schnittstelle, die man mit PHP, Python, Perl, C, Pascal, Assembler oder sonstwas auf der Serverseite benutzen kann. Nach Außen, sprich gegenüber dem Client, sieht das aber alles gleich aus. Der sieht sogar nicht mal was von CGI, sondern arbeitet nur mit HTTP, um Daten (in der Regel) per GET oder POST an den Server zu übermitteln. Ob da PHP läuft oder wasauchimmer kannst du vollkommen außer Acht lassen.
Soviel war mir klar, da ich in Python aber doch noch ein Anfänger bin, war ich mir nicht sicher ob dieses Skript die Daten auf eine Weise an das Auswertungsskript sendet, die nur Perl o.a. lesen kann. Ich denke das hat sich jetzt aber erledigt, ich hätte wohl besser nachdenken sollen. Danke

Gruß,
Felix
Antworten