Thomas Luethi: Automatischer Bilderdownload

Beitrag lesen

Hallo,

if (!copy("http://xxxx:xxxx@contentservice.wortundbildverlag.de/WUBPICS/big/13997.jpg", $file))

Das Schema username:passwort@www.example.com ist in HTTP falsch.
Es "funktioniert" - noch - zufaellig in ein paar _Browsern_,
aber nicht mit PHP.
(Im MS IE wird es vermutlich mit den neuesten Service Packs
nicht mehr funktionieren.)

Man kann aber auch mit PHP "Browser spielen", d.h. per HTTP
gewisse Anfragen an Webserver schicken und dann die Antworten,
die ebenfalls per HTTP reinkommen, auswerten.
Auch die "Credentials" (Benutzername und Passwort) fuer
Basic Authentication kann man so uebermitteln.

In den Benutzerkommentaren auf der Manual-Seite zu fsockopen()
http://www.php.net/manual/de/function.fsockopen.php
hat es ein paar Beispiele.
Ich selbst verwende die folgende Funktion (Vorgeschlagen von Ben Blazely),
um aus einem passwortgeschuetzten Bereich eines Webservers
(Text-)Daten abzuholen:

function connecttourl($addr, $port, $path, $user="", $pass="", $timeout="30")
       {
        $urlHandle = fsockopen($addr, $port, $errno, $errstr, $timeout);
        if ($urlHandle)
          {
                socket_set_timeout($urlHandle, $timeout);
                if ($path)
                {
                        $urlString = "GET $path HTTP/1.0\r\nHost: $addr\r\nConnection: Keep-Alive\r\nUser-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows 98)\r\n";
                        if ($user)
                                $urlString .= "Authorization: Basic ".base64_encode("$user:$pass")."\r\n";
                        $urlString .= "\r\n";
                        // folgende Zeile nur zur Veranschaulichung:
                        echo "<pre>".htmlentities($urlString)."</pre>\n";

fputs($urlHandle, $urlString);
                        $response = fgets($urlHandle);
                        if (substr_count($response, "200 OK") > 0)      // Check the status of the link
                        {
                                $endHeader = false;                     // Strip initial header information
                                while ( !$endHeader)
                                {
                                        if (fgets($urlHandle) == "\r\n")
                                                $endHeader = true;
                                }
                                return $urlHandle;                      // All OK, return the file handle
                        }
                        else if (strlen($response) < 15)                // Cope with wierd non standard responses
                        {
                                fclose($urlHandle);
                                return -1;
                        }
                        else                                            // Cope with a standard error response
                        {
                                fclose($urlHandle);
                                return substr($response,9,3);
                        }
                }
                return $urlHandle;
          }
        else
                return 0;
       } // Ende der Funktion connecttourl

/* Und so greife ich auf die Funktion zu: */

$addr="www.example.com";
$port="80";
$path="/verzeichnis/datei.xyz?bla=1&foo=2";
$user="Benutzername";
$pass="Passwort";

$urlhandle=connecttourl($addr, $port, $path, $user, $pass);
$inhalt="";
if (($urlhandle<1) OR (is_numeric($urlhandle)))
  {
   echo "<p>Problem mit der Seite <a href='http://$addr$path'>$addr$path</a> - urlhandle=($urlhandle).</p>\n";
  }
else
  {
   echo "<p>Seite <a href='http://$addr$path'>$addr$path</a> erreicht; urlhandle=($urlhandle).</p>\n";
   while (!feof($urlhandle))
    {
     $inhalt.=fgets($urlhandle,128);
    }
   fclose($urlhandle);
  }

Wenn alles geklappt hat, steht nun die ganze Antwort des Webservers
in der Variable $inhalt

Diese koennte man nun also mit den geeigneten Datei-Funktionen
in eine Datei auf dem eigenen Server schreiben.
Bei Dir sind Bilder im Spiel, also binaere Daten.
Das macht es evtl. etwas komplizierter, aber das Prinzip bleibt gleich.

HTH, Gruesse,

Thomas

--
Bitte keine Mails mit Fachfragen - dafuer gibt es das Forum!
Ich mag es, wenn URLs verlinkt sind (</faq/#Q-19>).
Oft gestellte PHP-Fragen beantwortet die dclp-FAQ bestens: http://www.dclp-faq.de/