Genera un elenco di schede aperte di Safari con AppleScript

Indipendentemente dal fatto che tu sia un blogger che sta lavorando a una retata o uno studente che sta facendo qualche ricerca, probabilmente hai incontrato la necessità di creare un elenco di siti web basato sulle tue schede Safari attualmente aperte. Impariamo come scrivere un AppleScript che gestirà questo processo per noi.


Un esempio di ciò che lo script dovrebbe produrre in base alle schede aperte in Safari.

Cosa stiamo andando ad imparare

La sceneggiatura che stiamo per scrivere è in realtà abbastanza semplice, quindi se hai appena iniziato con AppleScript, questo è il progetto perfetto per tagliare i denti.

Indipendentemente dal fatto che tu abbia effettivamente bisogno di uno strumento che creerà un elenco di schede di Safari è irrilevante. La cosa importante qui è imparare da come ci avviciniamo a questo compito.

La cosa importante qui è imparare da come ci avviciniamo a questo compito.

Stiamo andando a colpire su una serie di costrutti AppleScript che sono fondamentali nel tuo percorso per diventare un professionista dell'automazione: variabili, loop "repeat with", utilizzo di stringhe, caratteri di escape e molto altro.


Passaggio 1. Creare un algoritmo

La prima cosa che vuoi fare quando lavori con qualsiasi progetto di programmazione è vedere se riesci a delineare un algoritmo. Questa parola sembra piuttosto intimidatoria, ma in realtà è solo un modo elegante per dire che dobbiamo elaborare i passaggi di ciò che faremo.

È solo un modo elegante per dire che dobbiamo elaborare i passaggi di ciò che faremo.

Per creare un algoritmo per il nostro progetto, dobbiamo avere una comprensione di base di due cose: il nostro obiettivo finale e i passi necessari per raggiungerlo. L'ultima parte è un po 'complicata perché richiede alcune conoscenze specifiche su come affrontare il problema da una prospettiva di programmazione, che può essere o meno intuitiva a seconda di come funziona il tuo cervello.

L'obiettivo. il gol

Analizziamo prima il nostro obiettivo, cosa vogliamo raggiungere? Il risultato finale che mi piacerebbe girare è un documento TextEdit che contiene un elenco delle schede aperte in Safari. Ogni scheda dovrebbe essere formattata come un collegamento HTML con il titolo della scheda impostata sul testo del collegamento, in questo modo:

 Titolo della scheda qui

Il processo

Con questo obiettivo in mente, possiamo iniziare a delineare il nostro algoritmo pensando ai processi che devono accadere per noi per raggiungere questo obiettivo. A questo punto, non preoccuparti della perfezione. Definiremo mentalmente questo processo quando incontreremo delle sfide nel processo di codifica, questo è semplicemente per aiutarci a capire come sarà la nostra sceneggiatura.

  1. Contare il numero di finestre di Safari
  2. Contare il numero di schede in ogni finestra
  3. Crea un ciclo che passa attraverso ogni scheda di ogni finestra
  4. Prendi il nome della scheda corrente
  5. Prendi l'URL della scheda corrente
  6. Memorizza il nome della scheda, l'URL e altro testo desiderato in una variabile
  7. Apri TextEdit
  8. Crea un nuovo documento
  9. Imposta il testo del nuovo documento sulla variabile che contiene la nostra stringa di informazioni

Passaggio 2. Creare un blocco Tell di Safari

Ora che abbiamo il nostro schema di base dei passaggi che avremo richiesto, è il momento di passare alla codifica. I primi passaggi del nostro algoritmo hanno tutti a che fare con Safari, quindi la prima cosa che dobbiamo fare nel nostro script è creare un tell block per Safari.

[AppleScript]
dire all'applicazione "Safari"
fine raccontare
[/ AppleScript]

Racconta ai blocchi come avremo come target chi / con cosa stiamo parlando nel nostro script, in questo caso è l'applicazione Safari.

Mancia: Non dimenticare di chiudere i blocchi di tell con "end tell", il tuo script genererà un errore senza questo.


Passaggio 3. Creare variabili iniziali

Una delle prime cose che mi piace fare in qualsiasi script è creare qualsiasi variabile che io sappia avrò bisogno. Questo aiuta a preparare il terreno per il resto della sceneggiatura e mantiene le cose organizzate.

A questo punto, so che avrò bisogno di impostare tre variabili diverse: una per il conteggio delle finestre, una per il conteggio delle tabulazioni e una per il testo del documento risultante.

La variabile di conteggio delle schede deve essere aggiornata mentre ciclichiamo attraverso le finestre, quindi sarà necessario annidarle in un ciclo, ma le altre di cui possiamo occuparci ora.

[AppleScript]
dire all'applicazione "Safari"

--variabili
imposta windowCount sul numero di finestre
imposta docText a ""

fine raccontare
[/ AppleScript]

Impostazione del numero di finestre

Dopo il commento, la prima riga di codice crea una variabile chiamata "windowCount". Si noti che questo è molto descrittivo, non qualcosa di generico come "myVariable". Cerca sempre di dare un nome alle tue variabili qualcosa di utile in modo che la leggibilità dei tuoi script rimanga alta.

I comandi di AppleScript sono spesso molto vicini all'inglese semplice, il che lo rende un linguaggio davvero facile da imparare per i principianti.

La sintassi per il conteggio delle finestre è semplicissima: imposta (variabile) su numero di finestre. I comandi di AppleScript sono spesso molto vicini all'inglese semplice, il che lo rende un linguaggio davvero facile da imparare per i principianti.

La variabile docText

La parte strana del codice sopra è che ho creato una variabile stringa vuota, perché dovrei farlo? La ragione sarà più chiara in seguito, ma in pratica la nostra ripetizione passerà e aggiungeremo qualcosa a questo ogni volta e abbiamo semplicemente bisogno di un punto di partenza. Non è possibile aggiungere qualcosa a una variabile che non esiste!


Passaggio 4. Primo blocco di ripetizione

Per raggiungere il nostro obiettivo, avremo bisogno di due blocchi di ripetizione. La logica dietro a questo è più facile da avvolgere la mente se si lavora da dentro.

La logica dietro a questo è più facile da avvolgere la mente se si lavora da dentro.

Il nostro obiettivo è quello di prendere il titolo e l'URL da una scheda, quindi ripetere quello per ogni scheda (blocco di ripetizione). Il trucco è che ci potrebbe essere più di una finestra aperta, quindi dobbiamo ripetere quel processo per ogni finestra (blocco di ripetizione).

Ancora una volta, questo processo di riflessione è incentrato su come dobbiamo lavorare, quindi inizieremo con il blocco di ripetizione "ogni finestra".

[AppleScript]
dire all'applicazione "Safari"

--variabili
imposta windowCount sul numero di finestre
imposta docText a ""

--Ripeti per ogni finestra
ripetere con x da 1 a windowCount
imposta tabCount sul numero di schede nella finestra x
fine ripetizione
fine raccontare
[/ AppleScript]

Ripeti con

Un semplice blocco di ripetizione potrebbe dire qualcosa come "ripeti 5 volte", ma qui abbiamo fatto qualcosa di un po 'più complicato. Il costrutto "repeat with" ci permette di impostare una variabile volutamente generica (x) che aumenterà ogni volta che viene eseguito il blocco di ripetizione.

Affinché ciò funzioni, dobbiamo dire al nostro script il punto di partenza e di arresto per x mentre scorre le sue iterazioni. Quello che ho fatto è stato detto ad AppleScript di avviare x a 1, quindi aumentarlo fino a quando non raggiunge un valore uguale al numero di finestre aperte, espresso come la variabile che abbiamo impostato prima.

Ho usato questo costrutto perché rende il nostro blocco di ripetizione estremamente versatile.

Ho usato questo costrutto perché rende il nostro blocco di ripetizione estremamente versatile. Se lo script conta quattro finestre, il blocco di ripetizione verrà eseguito quattro volte, se conta cinquanta, il blocco verrà eseguito cinquanta volte.

Conteggio delle schede

Successivamente, ho praticamente ripetuto il processo che abbiamo usato prima per il conteggio delle finestre per impostare una variabile sul numero di schede nella finestra corrente.

Per farcela, ho dovuto inserire la variabile x. Ricorda che questa variabile aumenterà ogni volta che viene eseguito il blocco di ripetizione. Quindi, la prima volta, conteremo il numero di schede nella finestra uno, la seconda volta, conteremo il numero di schede nella finestra due, ecc..


Passaggio 5. Secondo blocco ripetuto

Ora che abbiamo un blocco di ripetizione impostato che passerà attraverso ogni finestra, dobbiamo inserire un altro blocco di ripetizione all'interno di quello per esaminare ogni scheda. I due insieme saranno in grado di buttare giù ogni scheda di ogni finestra.

Mentre siamo qui, imposteremo anche alcune variabili per il prossimo passo.

[AppleScript]
dire all'applicazione "Safari"

--variabili
imposta windowCount sul numero di finestre
imposta docText a ""

--Ripeti per ogni finestra
ripetere con x da 1 a windowCount
imposta tabCount sul numero di schede nella finestra x

--Ripeti per ogni scheda nella finestra corrente
ripetere con y da 1 a tabCount
--Ottieni nome scheda e URL
imposta tabName sul nome della scheda y della finestra x
imposta tabURL sull'URL della scheda y della finestra x
fine ripetizione

fine ripetizione
fine raccontare
[/ AppleScript]

Ripeti per ogni scheda nella finestra corrente

Come puoi vedere, questo blocco di ripetizione utilizza una sintassi simile a ciò che abbiamo visto prima. Abbiamo già contato il numero di schede nel passaggio precedente in modo da impostare il blocco di ripetizione per passare da 1 a tabCount, utilizzando la variabile di incremento generica y.

Afferra nome e URL della scheda

Per completare questo passaggio, abbiamo avviato due variabili. La sintassi di questi è quasi identica, solo uno prende il nome della scheda corrente e l'altro lo prende. Ho trovato la sintassi specifica per questi comandi nel dizionario AppleScript di Safari.

Si noti che, per prendere il nome e l'URL della scheda corrente, stiamo semplicemente usando le variabili x e y che aumentano ogni volta che viene eseguito il blocco di ripetizione. Quindi la prima volta prendiamo il nome e l'URL della scheda uno della finestra uno, quindi la scheda due della finestra uno, quindi forse la scheda uno della finestra due, ecc..


Passaggio 6. Riempi stringa docText

Ricorda quella variabile docText vuota che abbiamo creato prima? Ora lo riempiremo con il testo che vogliamo per ogni voce nella nostra lista. Ogni volta che viene eseguito il blocco di ripetizione, il titolo e l'URL della scheda corrente verranno aggiunti alla variabile utilizzando la formattazione HTML che abbiamo delineato sopra.

Il codice per questo è la sintassi più complicata che abbiamo incontrato finora, dai uno sguardo qui sotto e poi ti spiegherò come funziona.

[AppleScript]
dire all'applicazione "Safari"

--variabili
imposta windowCount sul numero di finestre
imposta docText a ""

--Ripeti per ogni finestra
ripetere con x da 1 a windowCount
imposta tabCount sul numero di schede nella finestra x

--Ripeti per ogni scheda nella finestra corrente
ripetere con y da 1 a tabCount

--Ottieni nome scheda e URL
imposta tabName sul nome della scheda y della finestra x
imposta tabURL sull'URL della scheda y della finestra x

imposta docText su docText e ¬
"tabURL &" \ ">" & ¬
tabName e ¬
"" & ¬
linefeed come stringa
fine ripetizione

fine ripetizione
fine raccontare
[/ AppleScript]

Concatenazione

La prima cosa che devi sapere qui è che la concatenazione (mettendo insieme le cose) in AppleScript è gestita tramite la e commerciale. Nell'esempio sopra, voglio aggiungere un po 'di cose diverse alla variabile ogni volta, quindi uso la e commerciale per connettere tutti i pezzi insieme.

Aggiunta alla variabile

Si noti che ho impostato la variabile docText su "docText & ..." un mucchio di altre cose. Perché dovrei impostare una variabile su se stessa? Ciò che sta facendo è dire a AppleScript che voglio impostare la variabile docText su tutto ciò che è già memorizzato, oltre ad altre cose.

Alla fine, questa variabile conterrà l'intero contenuto di ciò che verrà inserito nel nostro documento TextEdit.

In questo modo, ogni volta che si ripete il blocco di ripetizione, aggiungo a questa variabile e la faccio crescere anziché sostituire il suo contenuto. Alla fine, questa variabile conterrà l'intero contenuto di ciò che verrà inserito nel nostro documento TextEdit.

Line Break e Linefeeds

Esistono due diverse forme di interruzioni di riga nel codice sopra. Il primo è una serie di interruzioni di linea superficiali che ho inserito nel mio codice nel tentativo di renderlo un po 'più leggibile. Volevo chiarire che diversi pezzi sono stati aggiunti alla variabile individualmente.

Il simbolo "¬" può essere digitato in AppleScript con Opzione + Ritorno e indica che l'interruzione di riga è meramente visiva e non deve influire sul modo in cui viene eseguito il codice.

In realtà però, tutto questo è una singola riga di codice, che normalmente scriverò come segue:

[AppleScript]
imposta docText su docText & "" & tabName & "" & linefeed come stringa
[/ AppleScript]

Avviso vicino alla fine di questa riga di codice è la parola "linefeed". A differenza delle interruzioni di linea superficiali sopra, questo rappresenta qualcosa che in realtà voglio aggiungere alla variabile. Alla fine di ogni elemento pubblicitario, inserisco un avanzamento di riga in modo che l'elemento dell'elenco successivo inizi su una nuova riga.

Archi e personaggi in fuga

La cosa strana del testo HTML che stiamo cercando di inserire è che contiene citazioni, che sono effettivamente utilizzate da AppleScript per indicare l'inizio e la fine di una stringa in questo modo:

[AppleScript]
imposta myString su "Ladle rat rotten hut"
[/ AppleScript]

Qui abbiamo iniziato una variabile e l'abbiamo riempita con del testo. Il testo è circondato da virgolette e indica a AppleScript che la variabile è di tipo stringa.

Quindi, se AppleScript utilizza le virgolette per circondare le stringhe, come possiamo memorizzare le virgolette come parte di una stringa? La risposta è "scappare" i caratteri del preventivo con un backslash come questo:

[AppleScript]
imposta myString su "/" Ladle rotten hut / ""
[/ AppleScript]

Nel primo esempio, il contenuto della variabile era il seguente: Ladle rat rotten hut (memorizzato senza virgolette). Nel secondo esempio, la variabile conteneva in realtà un insieme di virgolette: "Mestolo ratto di malga".

Mettere tutto insieme

Con tutte le informazioni che abbiamo appena appreso, ecco i singoli pezzi che vengono inseriti nella nostra variabile e incollati insieme.

  • TabURL
  • ">
  • tabName
  • avanzamento riga

Quando tutti questi elementi sono messi insieme e lo script viene ripetuto per ogni scheda in ogni finestra, dovremmo avere un elenco che è formattato esattamente come l'obiettivo che abbiamo impostato all'inizio.

 Tab One Titolo Here Tab Two Title Here Tab Three Title Here

Passaggio 7. Creare il documento di testo

Ora che abbiamo tutte queste informazioni memorizzate in una variabile conveniente, è il momento di fare qualcosa con esso. Nel nostro caso, vogliamo gettarlo in un documento di testo.

Per fare ciò, crea un nuovo blocco tell per TextEdit in questo modo:

[AppleScript]
dire all'applicazione "Safari"

--variabili
imposta windowCount sul numero di finestre
imposta docText a ""

--Ripeti per ogni finestra
ripetere con x da 1 a windowCount
imposta tabcount sul numero di schede nella finestra x

--Ripeti per ogni scheda nella finestra corrente
ripetere con y da 1 a tabcount

--Ottieni nome scheda e URL
imposta tabName sul nome della scheda y della finestra x
imposta tabURL sull'URL della scheda y della finestra x

imposta docText su docText & "" & tabName & "" & linefeed come stringa
fine ripetizione

fine ripetizione
fine raccontare

--Scrivi il testo del documento
dì all'applicazione "TextEdit"
attivare
crea un nuovo documento
imposta il testo del documento frontale su docText
fine raccontare
[/ AppleScript]

All'interno del blocco di TextEdit ho fatto tre cose: prima ho detto all'applicazione di "attivare", che semplicemente lo porta in primo piano in modo da poter vedere i frutti del tuo lavoro.

Successivamente, ho detto a TextEdit di creare un nuovo documento. Infine, ho terminato lo script impostando il testo del nuovo documento sulla variabile che contiene il nostro elenco di collegamenti.


Provalo

Con ciò, il nostro copione è finito! Se ti sei impegnato così a lungo, congratulazioni, hai già scritto più AppleScript della stragrande maggioranza degli utenti Mac e puoi considerarti un membro elitario della comunità di nerd Mac.

Per provare lo script, assicurati di avere Safari aperto con diverse schede e diverse finestre impostate su vari siti web. Una volta che hai questa configurazione, premi semplicemente il pulsante di riproduzione in AppleScript per vedere come avviene la magia.

Mancia: Prova a salvare una versione come applicazione in modo da poterla eseguire rapidamente ogni volta che ne hai bisogno.


Risoluzione dei problemi

Inevitabilmente, molti di voi raggiungeranno questo punto e avranno un errore. Qualcosa è andato storto, ma cosa? Molto spesso, la risposta sarà qualcosa di semplice come un refuso. Sei sicuro di aver inserito lo script esattamente come appare sopra? In genere, AppleScript tenta di segnalare il problema specifico, seguire i suoi consigli e ridigitare la riga problematica.

In genere, AppleScript tenta di segnalare il problema specifico, seguire i suoi consigli e ridigitare la riga problematica.

Sfortunatamente, è del tutto possibile che tu abbia inserito tutto correttamente e stia ancora ricevendo un errore. Forse c'è un problema con la tua versione di Safari o forse allo script non piacciono le pagine web che hai scelto per qualche motivo sconosciuto. Prova a cambiare le cose e vedi se riesci a individuare il problema.

La gestione degli errori è un argomento abbastanza approfondito che tratterò in modo approfondito in un prossimo articolo, per ora dare un'occhiata al nostro articolo sulle tecniche avanzate di AppleScript per ulteriori informazioni su come è possibile modificare lo script per intraprendere azioni specifiche quando viene generato un errore.

Conclusione

Ti ho appena guidato attraverso l'intero processo di scrittura di un AppleScript per generare un elenco di link dalle tue schede aperte in Safari. Questo dovrebbe farti risparmiare molti problemi su quei grandi progetti di ricerca.

Si spera che lungo la strada abbiate imparato tantissime cose su AppleScript e come affrontare l'automatizzazione di compiti semplici ma ripetitivi. Se avete domande, sentitevi liberi di lasciare un commento qui sotto o di contattarci su Twitter.