Heute: Server-Verzeichnisse per HTTP rekursiv auslesen und Dateien downloaden sowie Ordner erstellen.
Kennt Ihr das Problem, ihr sucht bestimmte Dateien und die Website, die sie anbietet, stellt lediglich eine Sammlung aller einzelner Dateien ohne Gesamtdownload zur Verfügung? Was nun? Jede Datei einzeln herunterladen? Nix da!
Es werden mal eben ein paar kleine Scripte entwickelt, welche sämtliche Verzeichnisse und Unterverzeichnisse durchsuchen, Dateien downloaden und in Ordnern entsprechend ablegen.
Was wird benötigt?
- Dateien herunterladen, da Serververzeichnis-unabhängig hier: VBScript
- Ordner lokal erstellen, hier: Batch-Script
- Website crawlen und die Kommandos zum Ausführen der VBS und Batch geben: PHP
VBScript – Datei downloaden
Dem VBScript werden als Parameter die URL der Datei sowie den Speicherort der Zieldatei übergeben. Über das Windows-Objekt XmlHttp wird ein Request auf den Server ausgeführt und die Rückgabe abgespeichert.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
download Wscript.Arguments(0), Wscript.Arguments(1) function download(sFileURL, sLocation) Set objXMLHTTP = CreateObject("MSXML2.XMLHTTP") objXMLHTTP.open "GET", sFileURL, false objXMLHTTP.send() do until objXMLHTTP.Status = 200 : wscript.sleep(1000) : loop If objXMLHTTP.Status = 200 Then Set objADOStream = CreateObject("ADODB.Stream") objADOStream.Open objADOStream.Type = 1 objADOStream.Write objXMLHTTP.ResponseBody objADOStream.Position = 0 Set objFSO = Createobject("Scripting.FileSystemObject") If objFSO.Fileexists(sLocation) Then objFSO.DeleteFile sLocation Set objFSO = Nothing objADOStream.SaveToFile sLocation objADOStream.Close Set objADOStream = Nothing End if Set objXMLHTTP = Nothing End function |
Batch Script – Ordner erstellen
Im Batch-Script wird lediglich ein make-Direction ausgeführt, auch hier nicht direkt per PHP, damit Webserver-Verzeichnis-unabhängig auf Order zugegriffen werden kann.
1 2 |
@echo off mkdir %1 |
PHP – Website auslesen und Ausführen der externen Scripts
In den ersten beiden Zeilen des PHP-Files werden die URL der zu durchsuchenden Website sowie der lokale Speicherort angegeben. Über einen regulären Ausdruck (RegEx) wird nach Links gesucht und überprüft, ob dieser zu einer Datei oder einem Unterordner verweißt. Entsprechend werden die bisher erstellen VBS und Batch ausgeführt. Zusätzlich speichert ein Logging jede Aktivität in einer log.txt. Findet die Funktion ein Unterverzeichnis der Website, ruft sie sich selbst erneut auf, solange bis alle Verzeichnisse durchsucht und alle Dateien heruntergeladen sind – evtl. Timeout-Zeit erhöhen.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
$url = 'http://www.your-lorem-ipsum.url/'; $path = 'C:\Downloads\\'; searchDir(); function searchDir($dir='') { global $url, $path; $input = @file_get_contents($url.$dir) or die("Error:".$url.$dir); $regexp = '<a\s[^>]*href=(\"??)([^\" >]*?)\\1[^>]*>(.*)<\/a>'; if(preg_match_all("/$regexp/siU", $input, $matches, PREG_SET_ORDER)) { foreach($matches as $match) { if($fh = fopen("log.txt","a+")) { fwrite($fh, 'Search: '.$dir.$match[2]."\r\n"); fclose($fh); } if(count(explode('.', $match[2])) == 2 AND substr($match[2], -1, 1) != '/') { echo 'File: '.$dir.$match[2].' '; exec("C:\wamp\www\dl\DL_XmlHttp.vbs \"".$url.$dir.$match[2]."\" \"".$path.str_replace(array('/', '%20'), array('\\', ' '), $dir).$match[2]."\""); } elseif(substr($match[2], -1, 1) == '/' AND count(explode('/', $match[2])) == 2) { echo 'Dir: '.$dir.$match[2].' '; exec("C:\wamp\www\dl\create_dir.bat \"".$path.str_replace(array('/', '%20'), array('\\', ' '), $dir).str_replace('%20', ' ', substr($match[2], 0, -1))."\""); searchDir($dir.$match[2]); } } } } </a\s[^> |
Das System erfüllt seinen Sinn, funktioniert problemlos und schnell und der Entwickler kann sich zurücklehnen und F5 drücken.