Snoopy PHP Klasse

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.

Snoopy

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.

PHP.ini

PEAR

Snoopy

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.

Michael Jentsch

Michael Jentsch arbeitet seit 2006 bei der Itellium Services GmbH als Entwickler und Software Architekt. Er ist spezialisiert auf Java basierte Web-Applikationen und E-Commerce. Neben dem Beruf interessiert er sich auch für Suchmaschinenoptimierung und ist engagiert in vielen Open Source Projekten im Web Umfeld. Sie erreichen ihn per E-Mail unter [email protected].

More Posts

Comments

  1. Georg says:

    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

    • admin says:

      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

  2. skullteria says:

    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/

«
facebook this
"));