Snoopy ist eine PHP Klasse die einen Web Browser simuliert und unter der GNU LESSER GENERAL PUBLIC LICENSE v2.1 steht. Damit kann sie sowohl in freien als auch in kommerziellen Projekten und Produkten Anwendung
finden. Aus diesem Grund habe ich mir mal die Zeit genommen und die Klasse anhand einiger Beispiele genauer untersucht. Die grundlegende Idee ist so einfach und so alt wie das HTTP Protokoll selbst. Mit der Snoopy Klasse ist es möglich den Download von Webseiten per HTTP zu automatisieren. Dabei wird neben dem GET Request auch der POST Request ermöglicht. Hinzu kommen noch Cookies, automatisches Laden von Frames, Unterstützung von Proxys und HTTP-Authentication (Anmeldung mit Benutzer und Passwort), Eingabe eines beliebigen User-Agent, Referer uvm.
Ein Beispiel für die Klasse Snoopy
Hier das Original Beispiel aus dem README der Distribution mit einigen Kommentaren von mir.
include \"Snoopy.class.php\"; $snoopy = new Snoopy; // Die folgenden 2 Zeilen rufen den Inhalt der Seite www.php.net ab und // zeigen den Inhalt als Text an. $snoopy->fetchtext(\"http://www.php.net/\"); print ($snoopy->results); // Die folgenden 2 Zeilen rufen den Inhalt der Seite www.phpbuilder.com ab und // zeigen die Links der Seite an. $snoopy->fetchlinks(\"http://www.phpbuilder.com/\"); print_r ($snoopy->results); // Die folgenden 6 Zeilen Beispielcode erzeugen einen POST REQUEST mit den Parametern // q=amiga, submit=Search! und searchhost=Altavista. Das Ergebnis ist der HTML Code // der Seite ohne HTTP-Header $submit_url = \"http://lnk.ispi.net/texis/scripts/msearch/netsearch.html\"; $submit_vars[\"q\"] = \"amiga\"; $submit_vars[\"submit\"] = \"Search!\"; $submit_vars[\"searchhost\"] = \"Altavista\"; $snoopy->submit($submit_url,$submit_vars); print ($snoopy->results); // Die folgenden 7 Zeilen rufen den Inhalt der Seite www.ispi.net ab und // zeigen den Inhalt der Frames Text an. Die maximale Frametiefe ist hier 5. $snoopy->maxframes=5; $snoopy->fetch(\"http://www.ispi.net/\"); echo \"<PRE>\\n\"; echo htmlentities($snoopy->results[0]); echo htmlentities($snoopy->results[1]); echo htmlentities($snoopy->results[2]); echo \"</PRE>\\n\"; // Die folgenden 2 Zeilen rufen den Inhalt der Seite www.altavista.com ab und // zeigen den Inhalt des Formulares an. // Hinweis: Wenn auf der Seite mehr als ein Formular verwendet wird, // werden alle Formulare der Seite ausgegeben. $snoopy->fetchform(\"http://www.altavista.com\"); print $snoopy->results;
Weitere umfangreiche Beispiele finden sich im Abschnitt EXAMPLES der README Datei.
Die Liste der wichtigsten Snoopy Features
Einfaches abrufen von Web Inhalten
Einfaches abrufen des Textinhaltes von Webseiten
Einfaches abrufen der Links von Webseiten
Support von HTTP Proxys
Support von HTTP-Authentication (Anmeldung mit Username und Passwort)
Unterstützt die Änderung der HTTP-Request Headerdaten user_agent, referer, cookie
Unterstützt Weiterleitungen (redirects) mit Vorgabe einer best. Weiterleitungstiefe
Snoopy kann die Links einer Webseite in \”fully qualified URLs\” umwandeln
Automatisches ausfüllen und abschicken von Formularen
Seit der Version 0.92 werden auch Frames unterstützt
Seit der Version 0.92 werden auch Cookies im Request und Response Code unterstützt
Anforderungen der Klasse Snoopy
Snoopy wurde entwickelt und getestet mit PHP 3.0.12. Benötigt aber PHP4 Beta 4 oder neuer für den Support von \”Read Timeout\”. Snoopy benötigt PCRE (Perl Compatible Regular Expressions) die seit PHP 3.0.9 Bestandteil der PHP Standardinstallation sind. Snoopy benötigt kein MySQL und auch sonst keine weiteren Pakete oder Module.
Die Installation von Snoopy.class.php
In der Datei INSTALL der Version 1.2.3 steht lapidar nur folgender Satz:
\”Put Snoopy.class.php into one of the directories specified in your php.ini include_path directive.\”
Das ist aber nur möglich, wenn man die entsprechenden Rechte auf dem Server hat. Abfragen kann man den include_path ganz einfach mit folgenden PHP Skript.
phpinfo.php <? phpinfo(); ?>
Dieses Kommando zeigt alle möglichen Infos zu der PHP Installation an. In der Zeile für den include_path steht dann der eingestellte Pfad. In meinem Falle ist es “.;c:\programme\xamp\xampp\php\pear\” (Der Kenner wird gleich erkennen, dass es sich um eine XAMPP Installation unter Windows handelt – richtig. Bei einen Suse Linux System könnte es folgendermassen aussehen. “.:/usr/share/php”). Aber zurück zum Include Path. In meinem Falle ist an Anfang der Pfades ein “.” eingetragen. Das bedeutet ich kann die Datei Snoopy.class.php in das Verzeichnis
kopieren in dem ich auch mein PHP Skript ausführe. In dem Verzeichnis habe ich normalerweise alle Rechte (lesen, schreiben, ausführen). Sollte aber auch das nicht richtig funktionieren, bleibt nur den Inhalt der Datei Snoopy.class.php in mein PHP-File zu kopieren. Achtung: Dass sollte immer nur der letzte verzweifelte Ausweg sein. Denn ein include “Snoopy.class.php”; bei dem die Datei “Snoopy.class.php” im gleichen Verzeichnis liegt wie das auszuführende PHP Skript sollte IMMER klappen.
Sollte man aber z.B. einen Root-Server betreiben und öfter mit der Datei “Snoopy.class.php” arbeiten ist es ratsam die Datei an einer zentralen Stelle in den Include_Path zu übernehmen. In meinem Falle währe es unter “c:\programme\xamp\xampp\php\pear\”. Da hier aber nur PEAR (The PHP Extension and Application Repository) rein gehört ist es ratsam den Include_Path zu erweitern und die Datei “Snoopy.class.php” an anderer Stelle abzulegen.
Die Autoren von Snoopy.class.php
Monte Ohrt - main Snoopy work Andrei Zmievski - miscellaneous fixes - read timeout support - file submission capability Gene Wood - bug fixes - security fixes
Die Funktionen der Klasse Snoopy.class.php
fetch($URI)
Dies ist die Methode mit der Web Inhalte geladen werden können. Der Parameter $URI ist der URL der geladen werden soll. Das Ergebnis wird unter $this->results gespeichert. Wenn mit der Methode Frames geladen werden (Siehe auch Klassenvariable maxframes) ist das Ergebnis ein Array bei dem jedes Element des Arrays ein Frame enthält.
fetchtext($URI)
Diese Methode entspricht der Methode fetch. Außer das hier der reine Textanteil in der Variable results gespeichert wird. Alle HTML Tags werden entfernt und evtl. vorhandene Sonderbehandlungen durchgeführt. Dies betrifft z.B. Umlaute und Sonderzeichen.
fetchform($URI)
Diese Methode entspricht der Methode fetch. Außer das hier nur die Formularelemente in der Variable results gespeichert werden. Alle anderen nicht relevanten Teile der HTML Seite werden entfernt.
fetchlinks($URI)
Diese Methode entspricht der Methode fetch. Außer das hier nur die Links der Seite in der variable results gespeichert werden. Das Ergebnis in der Variable results ist ein Array.
submit($URI,$formvars)
Mit dieser Methode werden die Formulardaten an den angegebenen URI gesendet. In dem Array formvars stehen alle Werte des Formulars. (Hierbei handelt es sich um einen POST Request)
submittext($URI,$formvars)
Diese Methode entspricht der Methode submit. Außer das hier der reine Textanteil der Webseite in der Variable results gespeichert wird. Alle HTML Tags werden entfernt und evtl. vorhandene Sonderbehandlungen durchgeführt. Dies betrifft z.B. Umlaute und Sonderzeichen.
submitlinks($URI)
Diese Methode entspricht der Methode submit. Außer das hier nur die Links der Seite in der variable results gespeichert werden.
Die Klassenvariablen der Klasse Snoopy.class.php
$host | Der HTTP Host von dem die Inhalte geladen werden sollen. |
$port | Der HTTP Post des HTTP-Servers (z.B. Apache Webserver) |
$proxy_host | Der HTTP Proxy Host (falls vorhanden) |
$proxy_port | Der HTTP Proxy Port (falls vorhanden) |
$agent | Der verwendete User_Agent |
$referer | Der verwendete Referer |
$cookies | Die Cookies (falls vorhanden) |
$rawheaders | Andere HTTP-Header Informationen (falls vorhanden) |
$maxredirs | Maximale Anzahl der HTTP-Redirects. |
$offsiteok | Folge auch Redirects die auf einen anderen Server verweisen. (Ja/Nein) |
$expandlinks | Sollen Links in vollständige URLs umgewandelt werden (Ja/Nein) |
$user | HTTP-Authentication Benutzername (falls vorhanden) |
$pass | HTTP-Authentication Passwort (falls vorhanden) |
$accept | HTTP-Accept Typen Default: (image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*) |
$error | Evtl. vorhandene Fehlermeldungen (falls vorhanden) |
$response_code | HTTP-Response Code der vom Server übertragen wurde. |
$headers | HTTP-Header der vom Server übertragen wurde. |
$maxlength | Maximale Länge der Daten (HTTP-Response Body). |
$read_timeout | Socket Timeout auf die Leseoperationen. Wenn 0 wird kein Timeout verwendet. |
$timed_out | Wird auf 1 gesetzt wenn die Leseoperation in ein Timeout gelaufen ist. |
$maxframes | Anzahl der Frames die geladen werden. |
$status | HTTP Status der fetch Methode(n) |
$temp_dir | Das temp Verzeichnis in das die Klasse schreiben darf |
$curl_path | System Pfad zu cURL. Wenn cURL nicht installiert ist bitte auf false setzen. |
Hallo PHP-Autoren,
als PHP-Anfänger habe ich eine Frage zu den Beispielzeilen zum Aufruf der Klasse Snoopy (und poste sie hier, weil ich in der Seite keinen Forumslink gefunden habe).
Ist dies reiner PHP-Sourcecode oder können die Aufrufe (unverändert) z.B. in einem Unix-script verwendet werden – um die PHP Aufrufe nur als Unterfunktionen innerhalb eines Rahmenprogramms (z.B. von Linux oder Perl aus) zu machen?
Danke im Voraus und schöne Grüße
Schorsch
Bei Snoopy handelt es sich um PHP Code, den Du nicht in Unix Scripten verwenden kannst. Es sit aber möglich, in deine Unix Scripte PHP Scripte einzufügen. Dazu muss der PHP interprete installiert sein. Die Shell kann PHP Aufrufe leider nicht interpretieren.
Gruß
Michael
Ich bin dir sehr dankbar für deine detaillierte Erklärung. Würde mich freuen, wenn du noch ein Thread über ImageMagick schreibst.
Mit freundlichen Grüßen, skullteria.
Link im Anhang:
http://www.imagemagick.org/