Advertisement
  1. Code
  2. Coding Fundamentals
  3. Workflow

Cómo generar una lista de pestañas abiertas de Safari con AppleScript

Scroll to top
Read Time: 15 min

() translation by (you can also view the original English article)

Tanto si eres un bloguero que trabaja en la elaboración de un resumen como si eres un estudiante que está investigando, probablemente te hayas encontrado con la necesidad de crear una lista de sitios web basada en las pestañas que tienes abiertas en Safari. Vamos a aprender a escribir un AppleScript que se encargue de este proceso por nosotros.

textedittextedittexteditUna muestra de lo que el script debería mostrar basándose en las pestañas abiertas en Safari.

Lo que vamos a aprender

El script que vamos a escribir es bastante sencillo, así que si te estás iniciando en el uso de AppleScript, este es el proyecto perfecto para empezar a trabajar.

Si necesitas o no una herramienta que cree una lista de pestañas de Safari es irrelevante. Lo importante aquí es aprender de cómo abordamos esta tarea.

Lo importante aquí es aprender de cómo abordamos esta tarea.

Vamos a tratar una serie de construcciones de AppleScript que son críticas en tu viaje para convertirte en un profesional de la automatización: variables, bucles "repetir con", trabajar con cadenas, caracteres de escape y mucho más.


Paso 1. Crea un algoritmo

Lo primero que hay que hacer cuando se trabaja con cualquier proyecto de programación es ver si se puede esbozar un algoritmo. Esa palabra suena bastante intimidante, pero en realidad es sólo una forma elegante de decir que tenemos que trabajar en los pasos de lo que vamos a hacer.

Es sólo una forma elegante de decir que tenemos que elaborar los pasos de lo que vamos a hacer.

Para crear un algoritmo para nuestro proyecto, tenemos que tener un conocimiento básico de dos cosas: nuestro objetivo final y los pasos necesarios para alcanzarlo. Esta última parte es un poco complicada porque requiere algunos conocimientos específicos sobre cómo abordar el problema desde el punto de vista de la programación, que pueden ser intuitivos o no dependiendo de cómo funcione tu cerebro.

El objetivo

Analicemos primero nuestro objetivo, ¿qué queremos conseguir? El resultado final que me gustaría conseguir es un documento TextEdit que contenga una lista de las pestañas abiertas en Safari. Cada pestaña debe tener el formato de un enlace HTML con el título de la pestaña establecido como texto del enlace, así:

1
<a href="www.siteurl.com">Tab Title Here</a>

El proceso

Con este objetivo en mente, podemos empezar a esbozar nuestro algoritmo pensando en los procesos que tienen que ocurrir para que logremos ese objetivo. En este punto, no te preocupes por la perfección. Refinaremos mentalmente este proceso a medida que nos encontremos con desafíos en el proceso de codificación, esto es simplemente para ayudarnos a tener una idea de cómo será nuestro script.

  1. Contar el número de ventanas de Safari
  2. Contar el número de pestañas de cada ventana
  3. Crear un bucle que vaya por todas las pestañas de cada ventana
  4. Obtener el nombre de la pestaña actual
  5. Obtener la URL de la pestaña actual
  6. Guardar el nombre de la pestaña, la URL y otro texto deseado en una variable
  7. Abrir TextEdit
  8. Crear un nuevo documento
  9. Establecer el texto del nuevo documento en la variable que contiene nuestra cadena de información

Paso 2. Crea un bloque tell para Safari

Ahora que tenemos nuestro esquema básico de los pasos que vamos a requerir, es el momento de comenzar a codificar. Los primeros pasos de nuestro algoritmo tienen que ver con Safari, así que lo primero que tenemos que hacer en nuestro script es crear un bloque tell para Safari.

[applescript] tell application "Safari" end tell [/applescript]

Los bloques Tell son la forma de dirigirnos a quién/qué estamos hablando en nuestro script, en este caso es la aplicación Safari.

Consejo: No olvides cerrar tus bloques tell con "end tell", tu script arrojará un error si no lo haces.


Paso 3. Crea las variables iniciales

Una de las primeras cosas que me gusta hacer en cualquier script es crear las variables que sé que voy a necesitar. Esto ayuda a establecer el escenario para el resto del script y mantiene las cosas organizadas.

En este punto, sé que tendré que configurar tres variables diferentes: una para el recuento de ventanas, otra para el recuento de pestañas y otra para el texto resultante del documento.

La variable de recuento de pestañas debe actualizarse a medida que recorremos las ventanas, por lo que tendrá que anidarse en un bucle, pero de las demás podemos ocuparnos ahora.

[applescript] tell application "Safari"

--Variables set windowCount to number of windows set docText to ""

end tell [/applescript]

Establecimiento del recuento de ventanas

Después del comentario, la primera línea de código crea una variable llamada "windowCount". Fíjate que esto es muy descriptivo, no algo genérico como "myVariable". Intenta siempre nombrar tus variables con algo adecuado para que la legibilidad de tus scripts sea alta. Intenta siempre nombrar tus variables con algo adecuado para que la legibilidad de tus scripts sea alta.

Los comandos de AppleScript suelen ser muy parecidos al inglés sencillo, por lo que es un lenguaje muy fácil de aprender para los principiantes.

La sintaxis para contar las ventanas es súper sencilla: establecer (variable) al número de ventanas. Los comandos de AppleScript suelen ser muy parecidos al inglés sencillo, lo que lo convierte en un lenguaje realmente fácil de aprender para los principiantes.

La variable docText

La parte extraña del código anterior es que he creado una variable de cadena vacía, ¿por qué haría esto? La razón será más clara más adelante, pero básicamente nuestra repetición pasará y añadirá algo cada vez y simplemente necesitábamos un lugar para empezar. ¡No puedes añadir algo a una variable que no existe!


Paso 4. Primer bloque de repetición

Para lograr nuestro objetivo, vamos a necesitar dos bloques de repetición. La lógica detrás de esto es más fácil de entender si se trabaja de adentro hacia afuera.

La lógica detrás de esto es más fácil de entender si se trabaja de adentro hacia afuera.

Nuestro objetivo es obtener el título y la URL de una pestaña, y luego repetir eso para cada pestaña (bloque de repetición). Sin embargo, el truco es que puede haber más de una ventana abierta, por lo que tenemos que repetir el proceso para cada ventana (bloque de repetición).

Una vez más, este proceso de pensamiento está al revés de cómo tenemos que trabajar, así que vamos a empezar con el bloque de repetición "every window".

[applescript] tell application "Safari"

--Variables set windowCount to number of windows set docText to ""

--Repeat for Every Window repeat with x from 1 to windowCount set tabCount to number of tabs in window x end repeat end tell [/applescript]

Repetir con

Un bloque de repetición simple podría decir algo como "repeat 5 times", pero aquí hemos hecho algo un poco más complicado. La construcción "repeat with" nos permite establecer una variable intencionadamente genérica (x) que se incrementará cada vez que se ejecute el bloque de repetición.

Para que esto funcione, tenemos que decirle a nuestro script el punto de partida y de parada para x a medida que recorre sus iteraciones. Lo que he hecho es decirle a AppleScript que empiece x en 1, y que luego lo incremente hasta que llegue a un valor igual al número de ventanas abiertas, expresado como la variable que establecimos antes.

Utilicé esta construcción porque hace que nuestro bloque de repetición sea extremadamente versátil.

Utilicé esta construcción porque hace que nuestro bloque de repetición sea extremadamente versátil. Si el script cuenta cuatro ventanas, el bloque de repetición se ejecutará cuatro veces, si cuenta cincuenta, el bloque se ejecutará cincuenta veces.

Conteo de las pestañas

A continuación, básicamente repetí el proceso que usamos antes para el conteo de ventanas a fin de establecer una variable para el número de pestañas en la ventana actual.

Sin embargo, para lograr esto, tuve que usar la variable x. Recuerda que esta variable se incrementará cada vez que se ejecute el bloque de repetición. Así que la primera vez, contaremos el número de pestañas en la ventana uno, la segunda vez, contaremos el número de pestañas en la ventana dos, etc.


Paso 5. Segundo bloque de repetición

Ahora que tenemos un bloque de repetición configurado que pasará por todas las ventanas, necesitamos insertar otro bloque de repetición dentro de este para ver cada pestaña. Los dos juntos serán capaces de eliminar cada pestaña de cada ventana.

Ya que estamos aquí, también configuraremos algunas variables para el siguiente paso.

[applescript] tell application "Safari"

--Variables set windowCount to number of windows set docText to ""

--Repeat for Every Window repeat with x from 1 to windowCount set tabCount to number of tabs in window x

--Repeat for Every Tab in Current Window repeat with y from 1 to tabCount --Get Tab Name & URL 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]

Repetición para cada pestaña de la ventana actual

Como puedes ver, este bloque de repetición utiliza una sintaxis similar a la que vimos antes. Ya contamos el número de pestañas en el paso anterior, así que configuramos el bloque de repetición para que vaya de 1 a tabCount, utilizando la variable genérica de incremento y.

Toma el nombre de la pestaña y la URL

Para terminar este paso, iniciamos dos variables. La sintaxis de éstas es casi idéntica, sólo que una toma el nombre de la pestaña actual y la otra toma la URL. Encontré la sintaxis específica para estos comandos en el diccionario de AppleScript de Safari.

Fíjate en que, para obtener el nombre y la URL de la pestaña actual, simplemente estamos utilizando las variables x e y que se incrementan cada vez que se ejecuta el bloque de repetición. Así que la primera vez tomamos el nombre y la URL de la pestaña uno de la ventana uno, luego la pestaña dos de la ventana uno, luego quizás la pestaña uno de la ventana dos, etc.


Paso 6: Relleno de la cadena docText

¿Recuerdas la variable vacía docText que creamos antes? Ahora vamos a llenarla con el texto que queremos para cada entrada de nuestra lista. Cada vez que se ejecute el bloque de repetición, el título y la URL de la pestaña actual se añadirán a la variable utilizando el formato HTML que hemos descrito anteriormente.

El código para esto es la sintaxis más complicada que vimos hasta ahora, echa un vistazo abajo y luego te guiaré sobre cómo funciona todo.

[applescript] tell application "Safari"

--Variables set windowCount to number of windows set docText to ""

--Repeat for Every Window repeat with x from 1 to windowCount set tabCount to number of tabs in window x

--Repeat for Every Tab in Current Window repeat with y from 1 to tabCount

--Get Tab Name & URL 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]

Concatenación

Lo primero que tienes que saber es que la concatenación (juntar las cosas) en AppleScript se maneja a través del ampersand. En el ejemplo anterior, quiero añadir un montón de cosas diferentes a la variable cada vez, así que uso el ampersand para conectar todas las piezas.

Añadir a la variable

Fíjate que establecí la variable docText como "docText &..." un montón de cosas más. ¿Por qué iba a establecer una variable a sí misma? Lo que esto hace es decirle a AppleScript que quiero establecer la variable docText a todo lo que ya está almacenado más algunas otras cosas.

Al final, esta variable contendrá todo el contenido de lo que se insertará en nuestro documento TextEdit.

De esta manera, cada vez que el bloque de repetición se ejecuta de nuevo, estoy añadiendo a esta variable y dejándola crecer en lugar de reemplazar su contenido. Al final, esta variable contendrá todo el contenido de lo que se insertará en nuestro documento de TextEdit.

Nuevas líneas y saltos de línea

Hay dos formas diferentes de realizar nuevas líneas en el código anterior. La primera es una serie de saltos de línea superficiales que inserté en mi código en un intento de hacerlo un poco más legible. Quería dejar claro que se están añadiendo varias piezas diferentes a la variable de forma individual.

El símbolo "¬" se puede escribir en AppleScript con Opción+Retorno e indica que el salto de línea es meramente visual y no debe influir en la ejecución del código.

Sin embargo, en realidad, todo esto es una sola línea de código, que normalmente escribiría así:

[applescript] set docText to docText & "<a href=" & "\"" & tabURL & "\">" & tabName & "</a>" & linefeed as string [/applescript]

Fíjate que cerca del final de esta línea de código está la palabra "linefeed". A diferencia de los saltos de línea superficiales anteriores, este representa algo que realmente quiero añadir a la variable. Al final de cada elemento de línea, inserto un salto de línea para que el siguiente elemento de la lista comience en una nueva línea. Al final de cada línea, inserto un salto de línea para que el siguiente elemento de la lista comience en una nueva línea.

Cadenas y caracteres de escape

Lo extraño del texto HTML que intentamos insertar es que contiene comillas, que en realidad son usadas por AppleScript para indicar el comienzo y el final de una cadena como ésta:

[applescript] set myString to "Ladle rat rotten hut" [/applescript]

Aquí iniciamos una variable y la rellenamos con algún texto. El texto está rodeado de comillas y le indica a AppleScript que la variable es de tipo cadena.

Entonces, si AppleScript utiliza las comillas para rodear las cadenas, ¿cómo almacenamos las comillas como parte de una cadena? La respuesta es "escapar" las comillas con una barra invertida, así:

[applescript] set myString to "/"Ladle rat rotten hut/"" [/applescript]

En el primer ejemplo, el contenido de la variable era el siguiente: Ladle rat rotten hut (almacenada sin comillas). En el segundo ejemplo, la variable contenía en realidad un conjunto de comillas: "Ladle rat rotten hut".

Engranaje de todo

Dada toda la información que acabamos de aprender, aquí están las piezas individuales que se insertan en nuestra variable y se unen.

  • <a href="
  • tabURL
  • ">
  • tabName
  • </a>
  • linefeed

Cuando todos estos elementos se juntan y el script se repite para cada pestaña de cada ventana, deberíamos tener una lista con el mismo formato que el objetivo que establecimos al principio.

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>

Paso 7. Crea el documento de texto

Ahora que tenemos toda esta información almacenada en una cómoda variable, es el momento de hacer algo con ella. En nuestro caso, queremos introducirla en un documento de texto.

Para ello, crea un nuevo bloque tell para TextEdit de esta manera:

[applescript] tell application "Safari"

--Variables set windowCount to number of windows set docText to ""

--Repeat for Every Window repeat with x from 1 to windowCount set tabcount to number of tabs in window x

--Repeat for Every Tab in Current Window repeat with y from 1 to tabcount

--Get Tab Name & URL 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

--Write Document Text tell application "TextEdit" activate make new document set the text of the front document to docText end tell [/applescript]

Dentro del bloque tell de TextEdit he hecho tres cosas: primero, le he dicho a la aplicación "activate", lo que simplemente la trae al primer plano de manera que puedas ver los frutos de tu trabajo.

Luego, le dije a TextEdit que creara un nuevo documento. Por último, terminé el script estableciendo el texto del nuevo documento a la variable que contiene nuestra lista de enlaces.


Pruébalo

Con esto, ¡nuestro script está terminado! Si has aguantado tanto, enhorabuena, ya has escrito más AppleScript que la gran mayoría de los usuarios de Mac y puedes considerarte un miembro de élite de la comunidad de nerds de Mac.

Para probar el script, asegúrate de que tienes Safari abierto con varias pestañas y varias ventanas establecidas en varios sitios web. Una vez que hayas preparado todo esto, simplemente pulsa el botón de reproducción en AppleScript para ver cómo se produce la magia.

Consejo: Intenta guardar una versión como aplicación para poder ejecutarla rápidamente cuando la necesites.


Solución de problemas

Inevitablemente, muchos de ustedes llegarán a este punto y darán con un error. Algo ha salido mal, pero ¿qué? La mayoría de las veces, la respuesta será algo tan simple como un error tipográfico. ¿Estás seguro de que has introducido el script exactamente como aparece arriba? AppleScript suele intentar indicarte el problema específico, sigue sus consejos y vuelve a escribir la línea problemática.

AppleScript suele intentar indicarte el problema específico, sigue sus consejos y vuelve a escribir la línea problemática.

Desgraciadamente, es muy posible que hayas introducido todo correctamente y sigas recibiendo un error. Quizá haya un problema con tu versión de Safari o quizá al script no le gusten las páginas web que has elegido por alguna razón desconocida. Intenta cambiar las cosas y ver si puedes localizar el problema.

El manejo de errores es un tema bastante extenso que cubriré en profundidad en un futuro artículo, por ahora échale un vistazo a nuestro artículo sobre Técnicas avanzadas de AppleScript para obtener más información sobre cómo puedes modificar el script para tomar acciones específicas cuando se produce un error.

Conclusión

Acabo de guiarte a través del proceso completo de escribir un AppleScript para generar una lista de enlaces desde tus pestañas abiertas en Safari. Esto debería ahorrarte muchos problemas en esos grandes proyectos de investigación.

Espero que a lo largo del proceso hayas aprendido muchas cosas buenas sobre AppleScript y cómo abordar la automatización de tareas simples pero repetitivas. Si tienes alguna pregunta, no dudes en dejar un comentario a continuación o en contactarnos en Twitter.

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.