Generieren Sie mit AppleScript eine Liste offener Registerkarten in Safari
() translation by (you can also view the original English article)
Unabhängig davon, ob Sie ein Blogger sind, der an einer Zusammenfassung arbeitet, oder ein Student, der Nachforschungen anstellt, müssen Sie wahrscheinlich eine Liste von Websites erstellen, die auf Ihren Safari-Registerkarten basieren. Lassen Sie uns lernen, wie Sie ein AppleScript schreiben, das diesen Prozess für uns erledigt.



Ein Beispiel dafür, was das Skript basierend auf den geöffneten Registerkarten in Safari ausgeben soll.
Was wir lernen werden
Das Skript, das wir schreiben werden, ist eigentlich ziemlich einfach. Wenn Sie mit AppleScript beginnen, ist das das perfekte Projekt, um Ihre Zähne zu schneiden.
Es spielt keine Rolle, ob Sie tatsächlich ein Tool benötigen, mit dem eine Liste von Safari-Registerkarten erstellt wird. Hier ist es wichtig zu lernen, wie wir diese Aufgabe angehen.
Hier ist es wichtig zu lernen, wie wir diese Aufgabe angehen.
Wir werden auf eine Reihe von AppleScript-Konstrukten stoßen, die auf Ihrem Weg zum Automatisierungsprofi von entscheidender Bedeutung sind: Variablen, "Wiederholen mit"-Schleifen, Arbeiten mit Zeichenfolgen, Escapezeichen und vieles mehr.
Schritt 1. Erstellen Sie einen Algorithmus
Das erste, was Sie bei der Arbeit mit einem Programmierprojekt tun möchten, ist zu prüfen, ob Sie einen Algorithmus skizzieren können. Dieses Wort klingt ziemlich einschüchternd, aber es ist wirklich nur eine ausgefallene Art zu sagen, dass wir die Schritte ausarbeiten müssen, die wir tun werden.
Es ist nur eine ausgefallene Art zu sagen, dass wir die Schritte ausarbeiten müssen, die wir tun werden.
Um einen Algorithmus für unser Projekt zu erstellen, müssen wir zwei Dinge grundlegend verstehen: unser letztendliches Ziel und die Schritte, die erforderlich sind, um es zu erreichen. Der letzte Teil ist etwas knifflig, da er einige spezifische Kenntnisse darüber erfordert, wie das Problem aus programmtechnischer Sicht angegangen werden kann. Dies kann je nach Funktionsweise Ihres Gehirns intuitiv sein oder auch nicht.
Das Ziel
Lassen Sie uns zunächst unser Ziel analysieren. Was wollen wir erreichen? Das Endergebnis, für das ich fotografieren möchte, ist ein TextEdit-Dokument, das eine Liste der geöffneten Registerkarten in Safari enthält. Jede Registerkarte sollte wie folgt als HTML-Link formatiert sein, wobei der Titel der Registerkarte auf den Linktext festgelegt ist:
1 |
<a href="www.siteurl.com">Tab Title Here</a> |
Der Prozess
Mit diesem Ziel vor Augen können wir beginnen, unseren Algorithmus zu skizzieren, indem wir über die Prozesse nachdenken, die erforderlich sind, damit wir dieses Ziel erreichen. Sorgen Sie sich an dieser Stelle nicht um Perfektion. Wir werden diesen Prozess mental verfeinern, wenn wir auf Herausforderungen im Codierungsprozess stoßen. Dies dient lediglich dazu, ein Gefühl dafür zu bekommen, wie unser Skript aussehen wird.
- Zählen Sie die Anzahl der Safari-Fenster
- Zählen Sie die Anzahl der Registerkarten in jedem Fenster
- Erstellen Sie eine Schleife, die alle Registerkarten jedes Fensters durchläuft
- Holen Sie sich den Namen der aktuellen Registerkarte
- Holen Sie sich die URL der aktuellen Registerkarte
- Speichern Sie den Namen der Registerkarte, die URL und anderen gewünschten Text in einer Variablen
- Öffnen Sie TextEdit
- Erstellen Sie ein neues Dokument
- Setzen Sie den Text des neuen Dokuments auf die Variable, die unsere Informationszeichenfolge enthält
Schritt 2. Erstellen Sie einen Safari Tell Block
Nachdem wir nun einen Überblick über die Schritte erhalten haben, die wir benötigen, ist es Zeit, mit dem Codieren zu beginnen. Die ersten Schritte in unserem Algorithmus hatten alle mit Safari zu tun. Das erste, was wir in unserem Skript tun müssen, ist, einen Tell-Block für Safari zu erstellen.
[applescript]
tell application "Safari"
end tell
[/applescript]
Tell-Blöcke geben an, mit wem wir in unserem Skript sprechen, mit wem / was wir sprechen. In diesem Fall handelt es sich um die Anwendung Safari.
Tipp: Vergessen Sie nicht, Ihre Tell-Blöcke mit "end tell" zu schließen. Ihr Skript gibt ohne dies einen Fehler aus.
Schritt 3. Erstellen Sie Anfangsvariablen
Eines der ersten Dinge, die ich in einem Skript gerne mache, ist das Erstellen von Variablen, von denen ich weiß, dass ich sie brauche. Dies hilft dabei, die Voraussetzungen für den Rest des Skripts zu schaffen und die Dinge zu organisieren.
An diesem Punkt weiß ich, dass ich drei verschiedene Variablen einrichten muss: eine für die Fensteranzahl, eine für die Registerkartenanzahl und eine für den resultierenden Dokumenttext.
Die Tab-Count-Variable muss aktualisiert werden, wenn wir durch die Fenster blättern, damit sie in einer Schleife verschachtelt werden muss, aber die anderen können wir jetzt erledigen.
[applescript]
tell application "Safari"
--Variables
set windowCount to number of windows
set docText to ""
end tell
[/applescript]
Einstellen der Fensteranzahl
Nach dem Kommentar erstellt die erste Codezeile eine Variable namens "windowCount". Beachten Sie, dass dies sehr beschreibend ist und nicht generisch wie "myVariable". Versuchen Sie immer, Ihren Variablen einen nützlichen Namen zu geben, damit die Lesbarkeit Ihrer Skripte hoch bleibt.
Die Befehle von AppleScript kommen dem einfachen Englisch oft sehr nahe, was es für Anfänger zu einer sehr einfachen Sprache macht, schnell zu lernen.
Die Syntax zum Zählen der Fenster ist sehr einfach: Setzen Sie (die Variable) auf die Anzahl der Fenster. Die Befehle von AppleScript kommen dem einfachen Englisch oft sehr nahe, was es für Anfänger zu einer sehr einfachen Sprache macht, schnell zu lernen.
Die docText-Variable
Der seltsame Teil des obigen Codes ist, dass ich eine leere Zeichenfolgenvariable erstellt habe. Warum muss man das tun? Der Grund wird später klarer, aber im Grunde wird unsere Wiederholung jedes Mal etwas hinzufügen, und wir brauchten einfach einen Ort, an dem wir anfangen können. Sie können einer nicht vorhandenen Variablen nichts hinzufügen!
Schritt 4. Wiederholen Sie zuerst den Block
Um unser Ziel zu erreichen, benötigen wir zwei Wiederholungsblöcke. Die Logik dahinter ist einfacher, wenn Sie von innen nach außen arbeiten.
Die Logik dahinter ist einfacher, wenn Sie von innen nach außen arbeiten.
Unser Ziel ist es, den Titel und die URL von einer Registerkarte abzurufen und diese dann für jede Registerkarte zu wiederholen(Wiederholungsblock). Der Trick ist mehr als ein offenes Fenster geben kann, so dass wir diesen Vorgang für jedes Fenster wiederholen müssen (Wiederholungsblock).
Wiederum ist dieser Denkprozess genau darauf ausgerichtet, wie wir arbeiten müssen, also beginnen wir mit dem Wiederholungsblock "Jedes Fenster".
[applescript]
tell application "Safari"
--Variables
set windowCount to number of windows
set docText to ""
- Wiederholen Sie dies für jedes Fenster
repeat with x from 1 to windowCount
set tabCount to number of tabs in window x
end repeat
end tell
[/applescript]
Wiederholen Sie mit
Ein einfacher Wiederholungsblock könnte so etwas wie "5-mal wiederholen" sagen, aber wir haben hier etwas Komplizierteres getan. Mit dem Konstrukt "Wiederholen Sie mit" können wir eine absichtlich generische Variable (x) einrichten, die jedes Mal erhöht wird, wenn der Wiederholungsblock ausgeführt wird.
Damit dies funktioniert, müssen wir unserem Skript den Start- und Stopppunkt für x mitteilen, während es seine Iterationen durchläuft. Ich habe AppleScript angewiesen, x bei 1 zu beginnen und dann zu erhöhen, bis ein Wert erreicht ist, der der Anzahl der geöffneten Fenster entspricht, ausgedrückt als die zuvor eingerichtete Variable.
Ich habe dieses Konstrukt verwendet, weil es unseren Wiederholungsblock extrem vielseitig macht.
Ich habe dieses Konstrukt verwendet, weil es unseren Wiederholungsblock extrem vielseitig macht. Wenn das Skript vier Fenster zählt, wird der Wiederholungsblock viermal ausgeführt, wenn er fünfzig zählt, wird der Block fünfzigmal ausgeführt.
Tabs zählen
Danach wiederholte ich im Grunde den Vorgang, den wir zuvor für die Fensteranzahl verwendet hatten, um eine Variable auf die Anzahl der Registerkarten im aktuellen Fenster festzulegen.
Um dies zu erreichen, musste ich die Variable x ziehen. Denken Sie daran, dass diese Variable jedes Mal erhöht wird, wenn der Wiederholungsblock ausgeführt wird. Beim ersten Durchgang zählen wir also die Anzahl der Registerkarten in Fenster eins, beim zweiten Mal die Anzahl der Registerkarten in Fenster zwei usw.
Schritt 5. Zweiter Wiederholungsblock
Nachdem wir einen Wiederholungsblock eingerichtet haben, der jedes Fenster durchläuft, müssen wir einen weiteren Wiederholungsblock in diesen einfügen, um alle Registerkarten anzuzeigen. Die beiden zusammen werden in der Lage sein, jeden Tab jedes Fensters auszuschalten.
Während wir hier sind, richten wir auch einige Variablen für den nächsten Schritt ein.
[applescript]
tell application "Safari"
--Variablen
set windowCount to number of windows
set docText to ""
--Wiederholen Sie dies für jedes Fenster
repeat with x from 1 to windowCount
set tabCount to number of tabs in window x
-- Wiederholen Sie diesen Vorgang für jede Registerkarte im aktuellen Fenster
repeat with y from 1 to tabCount
--Name und URL der Registerkarte abrufen
set tabName to name of tab y of window x
set tabURL to URL of tab y of window x
end repeat
end repeat
end tell
[/applescript]
Wiederholen Sie diesen Vorgang für jede Registerkarte im aktuellen Fenster
Wie Sie sehen können, verwendet dieser Wiederholungsblock eine ähnliche Syntax wie zuvor. Wir haben bereits im vorherigen Schritt die Anzahl der Registerkarten gezählt und den Wiederholungsblock mithilfe der generischen Inkrementierungsvariablen y von 1 auf tabCount gesetzt.
Grab Tab Name und URL
Um diesen Schritt abzuschließen, haben wir zwei Variablen initiiert. Die Syntax dieser ist nahezu identisch, nur einer erfasst den Namen der aktuellen Registerkarte und der andere die URL. Ich habe die spezifische Syntax für diese Befehle im Safari AppleScript-Wörterbuch gefunden.
Beachten Sie, dass wir zum Abrufen des Namens und der URL der aktuellen Registerkarte einfach die x- und y-Variablen verwenden, die bei jeder Ausführung des Wiederholungsblocks erhöht werden. Wenn wir also zum ersten Mal den Namen und die URL von Tab 1 von Fenster 1, dann Tab 2 von Fenster 1 und dann Tab 1 von Fenster 2 usw. abrufen.
Schritt 6. Füllen Sie die docText-Zeichenfolge aus
Erinnern Sie sich an die leere docText-Variable, die wir zuvor erstellt haben? Jetzt füllen wir es mit dem Text, den wir für jeden Eintrag in unserer Liste haben möchten. Jedes Mal, wenn der Wiederholungsblock ausgeführt wird, werden der Titel und die URL der aktuellen Registerkarte mithilfe der oben beschriebenen HTML-Formatierung zur Variablen hinzugefügt.
Der Code dafür ist die komplizierteste Syntax, auf die wir bisher gestoßen sind. Schauen Sie unten nach und dann werde ich Ihnen zeigen, wie das alles funktioniert.
[applescript]
tell application "Safari"
--Variablen
set windowCount to number of windows
set docText to ""
--Wiederholen Sie dies für jedes Fenster
repeat with x from 1 to windowCount
set tabCount to number of tabs in window x
--Wiederholen Sie diesen Vorgang für jede Registerkarte im aktuellen Fenster
repeat with y from 1 to tabCount
--Name und URL der Registerkarte abrufen
set tabName to name of tab y of window x
set tabURL to URL of tab y of window x
set docText to docText & ¬
"<a href=" & "\"" &
tabURL & "\"> "& ¬
tabName & ¬
"</a>" & ¬
linefeed as string
end repeat
end repeat
end tell
[/applescript]
Verkettung
Das erste, was Sie hier wissen müssen, ist, dass die Verkettung (Zusammenstellen von Inhalten) in AppleScript über das kaufmännische Und erfolgt. Im obigen Beispiel möchte ich der Variablen jedes Mal eine Reihe verschiedener Dinge hinzufügen, daher verwende ich das kaufmännische Und, um alle Teile miteinander zu verbinden.
Hinzufügen zur Variablen
Beachten Sie, dass ich die docText-Variable auf "docText und..." gesetzt habe. Warum sollte ich eine Variable auf sich selbst setzen? Damit wird AppleScript mitgeteilt, dass ich die Variable docText auf alles setzen möchte, was bereits gespeichert ist, sowie auf einige andere Dinge.
Am Ende enthält diese Variable den gesamten Inhalt dessen, was in unser TextEdit-Dokument eingefügt wird.
Auf diese Weise füge ich jedes Mal, wenn der Wiederholungsblock erneut durchlaufen wird, dieser Variablen etwas hinzu und lasse sie wachsen, anstatt ihren Inhalt zu ersetzen. Am Ende enthält diese Variable den gesamten Inhalt dessen, was in unser TextEdit-Dokument eingefügt wird.
Zeilenumbrüche und Zeilenvorschübe
Im obigen Code gibt es zwei verschiedene Formen von Zeilenumbrüchen. Das erste ist eine Reihe oberflächlicher Zeilenumbrüche, die ich in meinen Code eingefügt habe, um ihn ein wenig lesbarer zu machen. Ich wollte klarstellen, dass der Variablen einzeln mehrere verschiedene Teile hinzugefügt werden.
Das Symbol "¬" kann mit Option + Eingabetaste in AppleScript eingegeben werden und zeigt an, dass der Zeilenumbruch lediglich visuell ist und nicht die Ausführung des Codes berücksichtigen sollte.
In Wirklichkeit ist dies alles eine einzelne Codezeile, die ich normalerweise wie folgt schreiben würde:
[applescript]
Setzen Sie docText auf docText & "<a href=" & "\"" & tabURL & "\">" & tabName & "</a>" & Zeilenvorschub als Zeichenfolge
[/applescript]
Beachten Sie, dass am Ende dieser Codezeile das Wort "Zeilenvorschub" steht. Im Gegensatz zu den obigen oberflächlichen Zeilenumbrüchen stellt dies etwas dar, das ich der Variablen tatsächlich hinzufügen möchte. Am Ende jeder Werbebuchung füge ich einen Zeilenvorschub ein, damit die nächste Listenposition in einer neuen Zeile beginnt.
Strings & Escaped Charaktere
Das Seltsame an dem HTML-Text, den wir einfügen möchten, ist, dass er Anführungszeichen enthält, die von AppleScript verwendet werden, um den Anfang und das Ende einer Zeichenfolge wie folgt anzugeben:
[applescript]
set myString to "Ladle rat rotten hut"
[/applescript]
Hier haben wir eine Variable initiiert und mit Text gefüllt. Der Text ist von Anführungszeichen umgeben und teilt AppleScript mit, dass die Variable vom Typ Zeichenfolge ist.
Wenn AppleScript Anführungszeichen verwendet, um Zeichenfolgen zu umgeben, wie speichern wir Anführungszeichen als Teil einer Zeichenfolge? Die Antwort ist, den Anführungszeichen mit einem Backslash wie folgt zu "entkommen":
[applescript]
set myString to "/"Ladle rat rotten hut/""
[/applescript]
Im ersten Beispiel war der Inhalt der Variablen wie folgt: Schöpfkelle Ratten faule Hütte (ohne Anführungszeichen gespeichert). Im zweiten Beispiel enthielt die Variable tatsächlich eine Reihe von Anführungszeichen: "Schöpfkelle Ratten faule Hütte".
Fassen Sie alles zusammen
Angesichts all der Informationen, die wir gerade gelernt haben, sind hier die einzelnen Teile, die in unsere Variable eingefügt und zusammengehalten werden.
- <a href = "
- tabURL
- ">
- tabName
- </a>
- linefeed
Wenn alle diese Elemente zusammengestellt sind und das Skript für jede Registerkarte in jedem Fenster wiederholt wird, sollten wir eine Liste haben, die genau wie das zu Beginn festgelegte Ziel formatiert ist.
1 |
<a href="www.siteurlone.com">Tab One Title Here</a> |
2 |
<a href="www.siteurltwo.com">Tab Two Title Here</a> |
3 |
<a href="www.siteurlthree.com">Tab Three Title Here</a> |
Schritt 7. Erstellen Sie das Textdokument
Nachdem wir alle diese Informationen in einer praktischen Variablen gespeichert haben, ist es Zeit, etwas damit zu tun. In unserem Fall möchten wir es in ein Textdokument werfen.
Erstellen Sie dazu einen neuen Tell-Block für TextEdit wie folgt:
[applescript]
tell application "Safari"
--Variablen
set windowCount to number of windows
set docText to ""
--Wiederholen Sie dies für jedes Fenster
repeat with x from 1 to windowCount
set tabcount to number of tabs in window x
--Wiederholen Sie diesen Vorgang für jede Registerkarte im aktuellen Fenster
repeat with y from 1 to tabcount
--Name und URL der Registerkarte abrufen
set tabName to name of tab y of window x
set tabURL to URL of tab y of window x
Setzen Sie docText auf docText & "<a href=" & "\"" & tabURL & "\">" & tabName & "</a>" & Zeilenvorschub als Zeichenfolge
end repeat
end repeat
end tell
--Dokumenttext schreiben
tell application "TextEdit"
activate
make new document
set the text of the front document to docText
end tell
[/applescript]
Innerhalb des TextEdit-Tell-Blocks habe ich drei Dinge getan: Zuerst habe ich der Anwendung gesagt, sie soll "aktivieren", wodurch sie einfach in den Vordergrund gerückt wird, damit Sie die Früchte Ihrer Arbeit sehen können.
Als Nächstes forderte ich TextEdit auf, ein neues Dokument zu erstellen. Schließlich beendete ich das Skript, indem ich den Text des neuen Dokuments auf die Variable setzte, die unsere Liste von Links enthält.
Versuchen Sie weiter
Damit ist unser Skript fertig! Wenn Sie an diesem langen Glückwunsch festgehalten haben, haben Sie bereits mehr AppleScript geschrieben als die große Mehrheit der Mac-Benutzer und können sich als Elite-Mitglied der Mac-Nerd-Community betrachten.
Stellen Sie zum Ausprobieren des Skripts sicher, dass Safari mit mehreren Registerkarten und mehreren Fenstern für verschiedene Websites geöffnet ist. Sobald Sie dies eingerichtet haben, drücken Sie einfach die Wiedergabetaste in AppleScript, um die Magie zu beobachten.
Tipp: Speichern Sie eine Version als Anwendung, damit Sie sie bei Bedarf schnell ausführen können.
Fehlerbehebung
Unweigerlich werden viele von Ihnen diesen Punkt erreichen und einen Fehler finden. Etwas ist schief gelaufen, aber was? Meistens ist die Antwort so einfach wie ein Tippfehler. Sind Sie sicher, dass Sie das Skript genau so eingegeben haben, wie es oben angezeigt wird? AppleScript versucht normalerweise, Sie auf das spezifische Problem aufmerksam zu machen, seinen Ratschlägen zu folgen und die problematische Zeile erneut einzugeben.
AppleScript versucht normalerweise, Sie auf das spezifische Problem aufmerksam zu machen, seinen Ratschlägen zu folgen und die problematische Zeile erneut einzugeben.
Leider ist es durchaus möglich, dass Sie alles richtig eingegeben haben und trotzdem eine Fehlermeldung erhalten. Möglicherweise liegt ein Problem mit Ihrer Version von Safari vor, oder das Skript mag die von Ihnen ausgewählten Webseiten aus einem unbekannten Grund nicht. Versuchen Sie, die Dinge zu ändern und festzustellen, ob Sie das Problem genau bestimmen können.
Die Fehlerbehandlung ist ein ziemlich tiefgreifendes Thema, das ich in einem zukünftigen Artikel ausführlich behandeln werde. Weitere Informationen dazu, wie Sie das Skript ändern können, um bestimmte Aktionen auszuführen, wenn ein Fehler ausgelöst wird, finden Sie in unserem Artikel über erweiterte AppleScript-Techniken.
Abschluss
Ich habe Sie gerade durch den gesamten Prozess des Schreibens eines AppleScript geführt, um eine Liste von Links aus Ihren geöffneten Registerkarten in Safari zu generieren. Dies sollte Ihnen bei diesen großen Forschungsprojekten viel Ärger ersparen.
Hoffentlich haben Sie auf Ihrem Weg viele großartige Dinge über AppleScript gelernt und erfahren, wie Sie einfache, aber sich wiederholende Aufgaben automatisieren können. Wenn Sie Fragen haben, können Sie unten einen Kommentar hinterlassen oder uns auf Twitter kontaktieren.