Script: Bild von URL Speichern

Ich war auf der Suche nach einem Script, dass in regelmäßigen Abständen das Bild einer Webcam auf meinem Server speichert, um aus den Einzelbildern später einen Zeitraffer-Film zu bauen. Leider habe ich keine zufrieden stellende Lösung gefunden und daher selbst etwas gebaut, was ich hier zur Verfügung stelle.

Schritt 1: die URL des Live-Bildes

Zunächst braucht man natürlich eine URL, unter der das jeweils aktuelle Bild liegt. Dazu muss man wissen, dass Webcams in der Regel ein Bild auf einem Server ablegen und dieses in einem gewissen Rhythmus aktualisieren, also überschreiben. Für diese Demo hier nehmen wir den Eiffelturm. Die URL lautet:

http://www.parislive.net/eiffelwebcam3.jpg

Schritt2: Das PHP Script

Nun benötigt man ein Script, dass das Bild von der URL auf dem lokalen Server speichert. Ich verwende dazu fopen() – wer genaueres dazu lesen will: fopen bei php.net. Hier nun also mein Script:

$contents= file_get_contents('http://www.parislive.net/eiffelwebcam3.jpg');
setlocale(LC_TIME, 'de_DE');
$savename = strftime("%Y-%m-%d_%H-%M-%S");

$savefile = fopen("$savename.jpg", "w");
fwrite($savefile, $contents);
fclose($savefile);
?>

Erklärung

Die ersten 3 Zeilen sind dazu da Variablen zu vergeben. In Zeile 1 wird für “file_get_contents” die URL des Live-Bildes eingesetzt. Das ist eigentlich die einzige Zeile, die ihr anpassen müsst. Zeile 2 stellt die Zeitangabe für dieses Script auf ein deutsches Format und in Zeile 3 wird eine Variable für den Dateinamen des zu speichernden Bildes vergeben – hier “Jahr-Monat-Tag_Stunde-Minute-Sekunde”, also z.B. “2010-10-06_15-23_48.jpg”

Die drei letzten Zeilen erzeugen eine Datei mit dem so definierten Namen und speichern den Inhalt der URL, also unser Live-Bild, in diese Datei.

Demo

Die Demo zeigt genau dieses Script, allerdings lasse ich das Bild nicht jedes Mal unter neuem Namen speichern.

[download id=”7″ format=”1″]

Automatisieren

Bisher wird lediglich bei jedem Aufruf der PHP-Seite ein Bild auf den Server gespeichert. Will man nun aber z.B. jeden Tag um 14:00 ein Bild des Eiffelturms speichern, lässt sich das am einfachsten mit Hilfe eines Cron-Jobs lösen.

Dazu braucht man nicht zwingend einen eigenen Server mit Shell-Zugang, da es so wunderbare, kostenfreie Dienste, wie cron-job.org gibt. Da kann man sich anmelden und einstellen, dass das Script beispielsweise jeden Tag um 14:00 aufgerufen werden soll.

Ich hoffe die Anleitung war verständlich und kann dem einen oder anderen weiter helfen.

Bild: aboutpixel.de tape VI © Thomas Pieruschek



// Kommentar schreiben
// Trackback URL
// Kommentare als RSS 2.0

35 Kommentare zu "Script: Bild von URL Speichern"

  • […] Vielleicht hilft Dir das hier: Script: Bild von URL Speichern // Blog.Tocki | Tilman Ockert, Stuttgart Damit kann man Bilder von externen URLs per PHP auf dem eigenen Server speichern (und dann […]

  • Bild von externer URL auf eigenem Webspace speichern…

    Ich war auf der Suche nach einem Script, dass in regelmäßigen Abständen das Bild einer Webcam auf meinem Server speichert, um aus den Einzelbildern später einen Zeitraffer-Film zu bauen….

  • Servus,

    ich habe mir gerade das Script von euch heruntergeladen wo ich mittels file_get_content ein Bild aus dem Internet automatisch auf meinem eigenen Server abspeichern kann. ich habe das Script 1 zu 1 kopiert und übernommen allerdings schmeißt er mir immer weider einen Fehler aus.
    Vielleicht könnt ihr mir da ja kurz helfen.

    Warning: file_get_contents(): URL file-access is disabled in the server configuration in /home/f7604264/public_html/xmlscript/getimage.php on line 3 Warning: file_get_contents(http://www.parislive.net/eiffelwebcam3.jpg): failed to open stream: no suitable wrapper could be found in /home/f7604264/public_html/xmlscript/getimage.php on line 3 Warning: fopen(2010-11-23_15-13-28.jpg): failed to open stream: Permission denied in /home/f7604264/public_html/xmlscript/getimage.php on line 7 Warning: fclose(): supplied argument is not a valid stream resource in /home/f7604264/public_html/xmlscript/getimage.php on line 9 Bild am Dienstag, 23. Nov 2010 um 15:13:28 aufgenommen.

    Gruß Julian

  • Hi Julian,

    mir scheint, dass Dein Hoster nicht erlaubt, dass Du auf fremde URLs mittels “file_get_contents” zugreifst.

    Was hast Du denn genau vor?

  • File_get contents ist auf on gesetzt. Ist firmeninterner Webserver wo ich meine php.ini selbst einstellen kann. file_get_include ist auf off sollte da aber eigentlich egal sein.

    folgendes will ich machen: Ich gerneriere mir aus einer XML Datei ein paar hundert pfade die auf Bilder auf einem externen Webserver liegen. z.b. wie bei dir http://www.parislive.net/eiffelwebcam3.jpg

    Diese Bilder (oder erst mal nur eins) will ich durch dein script bei mir auf dem Webserver in einem bestimmten Ordner abspeichern. Jetzt habe ich dein Script genommen um das mal auszuprobieren, weil ich mit fopen() auch nur Fehler bekommen habe. Bei deinem script erscheint dann allerdings der Fehler wie oben angezeigt.

    Ich möchte eigentlich genau das gleiche machen was du mit dem Script oben auch machst.

    Danke für die schnelle Antwort

    Gruß Julian

  • Ach also so isses gesetz sorry

    allow_url_fopen = On

  • … d.h. es geht jetzt?

  • ne :-) leider nicht
    auch bei allow_url_includ = on nicht

    bin ein wenig am verzweifeln :-)

  • Sorry, kann ich gerade von hier aus nichts zu sagen.

    Drück Dir die Daumen.

  • Sorry ich nehme alles zurück :-) Hatte zwar im root geändert aber wir haben anscheinend je Account ne weitere PHP.ini eingestellt :-) es funktioniert danke dir fürs Script:-)

    Gruß Julian

  • Jörg sagt:

    Hi,
    tolles Script.
    Jedoch habe ich festgestellt, dass das Bild 0 kb hat, wenn es gespeichert wird. Die Bilder sind zwar schön nach Zeit auf meinem Server gespeichert, aber ich kann sie nicht abrufen/bearbeiten, da sie ja nur 0 kb haben. Wird hier nur die Verlinkung gespeichert?
    Oder mache ich einen Denkfehler?

    Gruß
    JÖRG

  • Jörg sagt:

    Hi nochmal,
    ergänzend wollte ich noch mitteilen, dass ich die Bilder nicht von einem externen Server, sondern vom eigenen holen möchte. Aber das hat doch mit dem Fehler sicherlich nichts zu tun, oder?
    Frage: Muss zwingend allow_url_fopen = On sein?
    Oder liegt es an anderen php-Einstellungen?

    Für Hilfe wäre ich dankbar.

    Gruß JÖRG

  • Jörg sagt:

    Und ein letztes mal,

    konnte das Problem selber lösen!
    Ein wirklich suuuuper Script, viiieeeelen Dank.

    Lösung:
    Beim Pfad vom Bild habe ich nicht “http://…..” verwendet, sondern den absoluten Serverpfad “/var/www/…../”.

    Hoffe kann mit meiner Antwort auch anderen helfen!

    Gruß JÖRG

  • Eddy sagt:

    Hallo,

    ein wirklich brauchbares Skript.

    Könnte man noch eine Überprüfung einbauen, damit gleich große Bilder nicht nochmal geholt weden?
    Mit ” getimagesize ” vielleicht?

    Gruß Eddy

  • Hi Eddy,

    halte ich für kontra-Produktiv,ich weiß allerdings nicht, wozu Du das Script verwenden möchtest :-)

    Im ursprünglichen Sinne wäre es ja sogar schlecht, wenn ein aktuelleres Bild nicht geladen würde, nur, weil die Dateigröße zufällig gleich ist. Ich will ja immer das neueste Bild haben.

  • Eddy sagt:

    Hallo Tilman,

    benutze das Skript für ein Webcam-Bild, das nicht
    nach einem Zeitmuster, sondern willkürlich aufgenommen wird.
    Mit einem stündlichen Cronjob habe ich dann manchmal doppelte Bilder in meiner Galerie.

    Mit ” getimagesize ”geht es nicht, eher mit “filesize”.

    Gruß Eddy

  • Martin sagt:

    Kennt jemand einen Freehoster auf dem das Skript läuft?

  • Holger sagt:

    Hallo Tilman,

    wollte mich auf diesem Wege auch für das Script bedanken. Das ist in Verbindung mit einem Cronjob genau, was ich gesucht hatte :o)

    Grüße
    Holger

  • Urs sagt:

    Hallo Tilman
    Super Script, das mein Problem lösen könnte; wenn ich den nicht ein Brett vor dem Kopf hätte.
    Das Script läuft super auf meinem QNAS Webserver. Tiptop! Allerdings müsste ich die Bilder in einen anderen Ordner speichern, als wo das Skript selber läuft (deine Standardvorgabe). Der Skript Ordner ist mit user/password geschützt. Damit komme ich nicht ohne diese Eingabe an die gespeicherten Bilder (Hintergrund: ich will mit der Minianwendung “Diashow” von Win7 ständig wechselnde Bilder der Webcam auf dem Desktop anzeigen). Kannst du mir einen Anstoss geben wie ich $savefile = fopen(“$savename.jpg”, “w”);
    abändern muss um in einem hirarchisch oberen Ordner zu speichern? Ich raffs nicht!
    Vielen Dank zum Voraus

  • excalibur sagt:

    hallo, finde die idee toll. brauche allerdings aus einem anderen grund solch ein script: mit opera mini lassen sich keine html dateien speichern! will per bookmarklet eine url an ein script auf ein server schicken. dieser soll diese anfragen bearbeiten: speichern der htmls. wenn ich ein anderes script aufrufe soll dort ein download button sein, der mir die sammlung als zip anbietet… leider bin ich ganz neu php am lernen und weiss nicht mal grob wie ich das webcam script dazu bringen kann den ersten part zu uebernehmen. bitte helft mir! danke

  • Hallo excalibur!

    Für so ein Screenshot-Tool ist das Script hier eher ungeeignet. Aber wozu so kompliziert? Es gibt Tools, die das für Dich übernehmen können. Schau mal bei Google – das hier wäre vielleicht was (thumbalizr.com/apitools) hat sogar ne total einfache API.

  • Excalibur sagt:

    Thumbalizer kannte ich noch nicht, danke. habe es sofort ins bookmarklet integriert.

    was ich eigentlich will, ist ein -save as html- workaround fuer opera mini. ich klicke im bookmarklet ein -save to server- knopf, mein server fuehrt das php aus, das wie dieses webcam script eine url holen geht und speichert. ich geh nach einiger zeit auf mein webftp mit opera mini und klicke -zip and download- ich weiss, read-it-later oder pdf my url gibts dafuer, aber mein handy kann sogar html offline oeffnen, nur eben nicht speichern…

  • Matthias sagt:

    hallo, tolles script, wie packe ich denn da am bestene eine schleife rein so das alle bilder gepeichert werden, beispielswiese:
    001.png bis 999.png
    danke

  • Wolfgang sagt:

    Hallo,

    das ist genau das, was ich gesucht habe.
    Nur leider werden die Bilder mit 0kb “gespeichert” und sind somit unbrauchbar/nicht vorhanden.

    Was mache ich falsch, oder wo sollte ich zu denken ansetzen?

    Vielen Dank & LG Wolfgang

  • Ludwig sagt:

    Hätte die gespeicherten Bilder auch gerne benutzbar und nicht mit 0 KB. Hab schon den ganzen nachmittag in www geschaut und nix brauchbares gefunden um das zu ändern. Denn der Script funktioniert und wäre echt schade dass es jetzt an der Filesize scheitert.

  • Ludwig sagt:

    ok hat sich erledigt hab den webspace hoster gewechselt und jetzt klappt der script

  • Frank sagt:

    Hallo,

    super Script. Genau das habe ich gesucht. Nur Verzeichnisse und JPG auf GIF anpassen und funktioniert mit Cronjob. Bei uns sind es GIF Dateien.
    Danke
    Grüsse

  • Sebastian sagt:

    Hallo,

    finde das Script auch sehr gut! Aber leider habe ich auch das Problem dass die gepeicherten Bilder 0KB groß sind… Woran kann das liegen? Mach ich was falsch?

    Gruß

  • Martin sagt:

    ich such eine Lösung um aus einem Webcam Flash-Stream ein aktuelles Einzelbild zu erzeugen/grabben um dieses auf einer Webseite anzuzeigen. Jeweils beim Aktualisieren der Webseite sollte sich das Bild auch aktualisieren? Hat jemand eine Idee?

  • […] preload the statistics images like e.g. the livewatch.de uptime monitor in the footer and the pingdom results on the statistics page via cronjob as described by tocki in this article. […]

  • Klaus sagt:

    Danke für das Script! Genau das habe ich gesucht.

  • Oliver sagt:

    Super Script. Macht was es soll. Ich würde es gerne dahingehend erweitern, dass es die Bilder jeweils pro Tag in einen eigenen Unterordner speichert. Da ich in Sachen PHP nicht gerade sehr belesen bin bräuchte ich dabei mal etwas Hilfe.

  • hatgefunden sagt:

    Hallo,

    vielen Dnak für das Script. Kenne mich da nun gar nicht aus aber es tut was es soll.

    Vielen vielen Dank :)

Schreibe einen Kommentar