So geht’s: Automatisierte Bildschirmfotos mit FTP-Upload per AppleScript
Veröffentlicht: 24. Januar 2008, 17:00 Uhr
Mit ein wenig AppleScript und Mac OS X Bordmitteln lässt sich in kurzer Zeit ein Skript schreiben, dass in regelmäßigen Abständen Bildschirmfotos erstellt und anschließend per FTP an einen Server übermittelt.
Als Hauptwerkzeug dient uns hierfür der bei Mac OS X mitgelieferte Skripteditor, mit dem sich bequem AppleScripts erstellen lassen. Außerdem verwenden wir im späteren Verlauf die Kommandozeilen-Programme screencapture, sips, curl und rm.
Grundgerüst
Zunächst beginnen wir damit das Grundgerüst des Skriptes zu erstellen in dem wir alle notwendigen Variablen speichern. Hierzu verwenden wir den Namespace des Finders, da dieser Prozess immer aktiv ist und nicht erst gestartet werden muss:
tell application "Finder"
--- Hier folgen später Variablen und Programmlogik
end tell
Variablen
Nun erstellen wir die Variablen um diverse Werte, wie etwa die Adresse des FTP-Servers oder den Dateinamen, zu speichern und nachträglich bequem editieren zu können. Im ersten Block legen wir daher alle notwendigen Variablen zum späteren Upload per FTP fest. Der zweite Block beinhaltet die maximale Größe und das Format des fertigen Bildschirmfotos. Im dritten Block legen wir fest wo die Datei zunächst lokal gespeichert werden soll und im letzten werden die lokalen Pfade zusammengesetzt.
--- Benutzerdaten und Pfade für den FTP-Upload
set ftpHost to "meinserver.de" as string
set ftpUser to "benutzername" as string
set ftpPass to "kennwort" as string
set ftpDir to "/verzeichnis/" as string
set ftpFile to "dateiname" as string
--- Maximale Breite/Höhe festlegen und Format angeben
set resizeMaxWH to 640 as integer
set resizeFormat to "png" as string
--- Lokale Pfade und Dateinamen festlegen
set screenFolder to "/tmp/" as string
set screenTemp to "temp.png" as string
set screenName to "screenshot" as string
--- Pfade zusammensetzen
set screenTempFile to (screenFolder & screenTemp) as string
set screenFinalFile to (screenFolder & screenName) as string
Format
Im nächsten Schritt beginnen wir damit zu unterscheiden in welchem Format (JPEG oder PNG) das Bildschirmfoto erstellt werden soll. Dazu schreiben wir unmittelbar nach der Deklarierung aller Variablen die folgenden Befehle in unser Skript:
--- Formate unterscheiden
if resizeFormat is equal to "png" then
set screenExtension to ".png" as string
else if resizeFormat is equal to "jpeg" then
set screenExtension to ".jpg" as string
end if
Bildschirmfoto erstellen
Jetzt führen wir per AppleScript das Kommandozeilenprogramm aus um ein Bildschirmfoto zu erstellen. Das Parameter -x unterdrückt den sonst üblichen Ton wie wir ihn von der manuellen Betätigung her kennen.
--- Bildschirmfoto erstellen
do shell script "screencapture -x " & quoted form of ¬
(POSIX path of screenTempFile)
Größe der Grafik ändern
Im nächsten Schritt verwenden wir das Programm sips um das Bildschirmfoto gemäß den obigen Vorgaben zu verkleinern. Das Endresultat hat somit die maximale Breite bzw. Höhe des per resizeMaxWH angegebenen Wertes.
--- Größe ändern
do shell script "sips -Z " & resizeMaxWH & " -s format " & resizeFormat ¬
& " " & quoted form of (POSIX path of screenTempFile) & " --out " ¬
& quoted form of (POSIX path of screenFinalFile & screenExtension)
FTP-Upload
Der Upload auf einen Server erfolgt per FTP und wird mit curl durchgeführt. Dafür setzen wir zunächst die URL zusammen und übergeben diese anschließend an das Programm.
--- Upload der Datei
set ftpUrl to quoted form of ("ftp://" & ftpUser & ":" & ftpPass ¬
& "@" & ftpHost & "/" & ftpDir & ftpFile & screenExtension) ¬
do shell script "curl -T " & quoted form of ¬
(POSIX path of screenFinalFile & screenExtension) & " " & ftpUrl
Temporäre Datei löschen
Damit keine unnötigen Daten anfallen löschen wir im letzten Schritt die temporär erstellten Dateien.
--- Datei löschen
do shell script "rm " & quoted form of ¬
(POSIX path of screenTempFile) & "; " & "rm " & quoted form of ¬
(POSIX path of screenFinalFile & screenExtension)
Nachtrag
Das fertige Skript kann nun als solches gespeichert werden. Ich empfehle zunächst einen Test im Skripteditor selbst. Entsprechende Fehler werden dort direkt angezeigt. Wer das Skript in regelmäßigen Abständen abrufen möchte dem sei das Programm CronniX empfohlen. Mit diesem können Cronjobs angelegt werden, die dann zu bestimmten Zeiten ausgeführt werden. Mittels osascript skript.scpt kann so z.B. alle 5 Minuten ein Bildschirmfoto aufgenommen werden.
Das vollständige Skript kann hier heruntergeladen werden. Ein Beispiel für ein Bildschirmfoto kann hingegen hier eingesehen werden.
Martin Michel schrieb am 30. Januar 2008, 11:19 Uhr
Hallo Cedric,
vielen Dank fuer das tolle Skript, genau diese Idee hat ich auch schon laenger, sozusagen als eine Art Desktop-Webcam :)
Allerdings kann man, glaube ich, den anfangs beschriebenen ‘Finder’-Block im Skript weglassen, der Finder wird ja nicht angesprochen.
Ausserdem rate ich dazu, die Shell-Befehle als UTF-8 zu uebermitteln, dann klappt es auch zuverlaessig bei obskuren Zeichen in Pfadnamen.
set command to “ls -a” as «class utf8»
do shell script command
Nochmals vielen Dank dafuer, dass Du Deine Arbeit mit uns teilst!
Und Gruesse an den Bodensee aus Ostwestfalen. War letztes Jahr laenger in Konstanz, hat mir sehr gut gefallen :D
P.S.: Sitze gerade an einer US-Tastatur…
Cedric schrieb am 30. Januar 2008, 14:46 Uhr
Hallo Martin,
danke für die hilfreichen Hinweise. Ich werde das Skript gemäß deinen Empfehlungen hin anpassen. Demnächst folgt übrigens noch ein weiteres Skript.
Viele Grüße,
Cedric
Thomas schrieb am 22. März 2008, 21:07 Uhr
Ich habe das mal ausprobiert und leider haben die Dateien nach dem Upload alle als Rechte 600. Kann man das irgendwie beeinflussen?
Cedric schrieb am 25. März 2008, 08:36 Uhr
Hi Thomas, bitte überprüfe doch einmal ob bei einem Upload mit einem FTP-Programm auch die Rechte auf 600 gesetzt werden. Ich könnte mir gut vorstellen, dass dies am FTP-Benutzer liegt und nicht an meinem Skript.
Marco Koch schrieb am 12. Februar 2009, 16:53 Uhr
Hallo,
ich bin begeistert von diesem Script!
Ich würde es sofort verwenden aber mir fehlt etwas kleines.
Wissen Sie vielleicht wie man noch einen Zeitstempel in den Dateinamen einbauen könnte.
Ich wäre sehr froh auf eine Antwort. ;)
Liebe Grüsse Marco Koch
Cedric schrieb am 13. Februar 2009, 09:22 Uhr
Hi Marco,
versuch es doch mal mit:
set timestamp to ((do shell script “perl -e ‘print time();’”)) as text
Gruß,
Cedric
Marco schrieb am 13. Februar 2009, 16:46 Uhr
Hi Cedric,
danke viel mal!
Aber ich habe etwas geGoogelt und habe den Befehl current date (wenn es den ein Befehl ist) gestossen.
Ist echt kompliziert sich die Zeit so zu formatieren wie mann sie will
Gruss Marco