Applescript: marque todas las pestañas en TODAS LAS VENTANAS en Safari

Safari, tenga la función Marcar todas las pestañas en el menú Bookmarks-> Add Bookmarks for these N tabs. Estoy buscando una manera de hacer esto automáticamente con applescript en todas las ventanas abiertas de Safari.

En otras palabras, quiero

  1. elija alguna carpeta de marcadores, digamos "Favoritos -> Sesiones"
  2. recorrer todas las ventanas de Safari
  3. si la ventana tiene solo una PESTAÑA, simplemente márquela en la carpeta anterior
  4. de lo contrario
    • llamar al elemento de menú Bookmarks->Add Bookmarks for these N tabs
    • llenar la ventana emergente automáticamente (por ejemplo Saved Tabs window1, Saved Tabs window2... etc.)
  5. repetir desde 2

Aquí https://gist.github.com/kshiteesh/b72e93d31d65008fcd11 hay un buen applescript (también esto podría ser un buen punto de partida para el desarrollo, pero preguntando primero aquí, tal vez alguien ya lo haya hecho). :)

¿Alguna ayuda, por favor?

Ps: motivación: la nueva política de Apple (que bloquea la compatibilidad con las extensiones heredadas de Safari), desafortunadamente provocó que una de las extensiones de Safari "imprescindibles" - Sessions - dejara de funcionar en Safari 12. Por lo tanto, busqué alguna funcionalidad propia.

Solo por curiosidad, ¿por qué querrías marcar tantas páginas? ¿Y por qué mantendría muchas ventanas abiertas en lugar de una con varias pestañas?
@MateusRibeiro: solo quiero páginas de marcadores cuando salgo del navegador. ¿Una ventana? Lol, solo por diversión, ahora he abierto 9 ventanas en 4 escritorios y cada ventana tiene de 1 a 9 pestañas abiertas... Simplemente trabajando (navegando) simultáneamente en más temas... Por ejemplo, tengo 1 ventana (2 pestañas) para stackexchange (stackoverflow y this), 1 ventana de youtube: solo 1 pestaña, 1 ventana de arduino (9 pestañas), 2 ventanas sobre World of Warcraft 3 y 6 pestañas), 2 ventanas para la intranet de la empresa (1x libro mayor), 1x para administrar a mis empleados , y 2 ventanas más para otras cosas no especificadas... :) :) Estoy bastante ocupado... :)
Firefox ha vuelto a abrir todas las ventanas y pestañas como una opción al reiniciar. ¿Safari no tiene lo mismo?
@historystamp Definamos la sesión como una lista de todas las pestañas en todas las ventanas. Luego, abrir la última sesión (como dijiste) es algo muy diferente, ya que tiene la posibilidad de almacenar y recuperar un historial de sesiones. Simplemente haga clic en la página de complementos eliminados para ver de qué estoy hablando. Los marcadores no son la solución óptima, pero mejor que nada...
Gracias por mencionar las sesiones. Estoy recopilando demasiadas ventanas de pestañas en estos días.
Sería un poco pesimista en hacer que esta función funcione en la última versión de Safari. "Las sesiones no se instalarán en Safari 12 o posterior, ya que Apple ha desaprobado oficialmente las Extensiones de Safari" en la página que vinculó. Si el autor de la sesión no puede averiguar cómo hacer la función, ¿por qué alguien más debería poder hacerlo? Recientemente, busqué escribir algo de javascript para Safari. Parece que Apple eliminó la aplicación gratuita de inserción de JavaScript. Tendría que pagar $100 para obtener una licencia de desarrollador. Estoy en Yosemite.
Tienes que considerar cambiar a otro navegador. Apple se ha vuelto antagonista del bricolaje. Encontré este guión de cuatro años que parece hacer algo en la línea que quieres. Vea si puede instalarlo y hacerlo funcionar. apple.stackexchange.com/questions/212132/… ​​Si es así, alguien debería poder modificarlo para hacer exactamente lo que quieres. Publique sus resultados. Podría intentar que haga lo que necesita, si puede hacerlo funcionar. No hace falta decir que tendría que poder inyectar javascript en Safari de forma gratuita.
Estoy usando Waterfox en estos días. Es un clon de Firefox. Admite extensiones heredadas de Firefox. Parece ser una tendencia suprimir los esfuerzos de bricolaje en los navegadores web. Chrome es otra posibilidad, pero tiene la misma restricción en el Firefox moderno.
@historystamp Sí, también hablé con el autor de las "Sesiones" y le ofrecí una donación, pero desafortunadamente dice que no es posible continuar debido a la política de asesinatos de Apple. Entonces, ahora estoy usando un flujo de trabajo automatizado (applescript y perl) para guardar las URL en archivos (por fecha). No lo publiqué como respuesta, todavía, porque está medio escrito en perl instalado personalizado y usa algunos módulos perl, por ejemplo, está lejos de la usabilidad del usuario promedio de Mac.

Respuestas (1)

Como dije en el comentario anterior, ahora estoy usando una aplicación de flujo de trabajo de automatización de desarrollo propio.

Soy un perldesarrollador de idiomas, por lo que en el flujo de trabajo utilizo un intérprete perl instalado a medida y también muchos módulos perl; definitivamente NO es una solución para un usuario promedio (común) de mac.

Pero publicarlo, principalmente como referencia y tal vez alguien podría piratearlo para encontrar una mejor solución. Cómo funciona - cómo usarlo:

  • desafortunadamente, debe ejecutarse manualmente; no puedo averiguar cómo ejecutar algún flujo de trabajo de automatización (servicio o aplicación) cuando Safari recibe el quitevento. :(

  • El script del automatizador (servicio) tiene dos acciones:

    • ejecute javascript (no lo sé applescript, Javascriptpero el javascript es más comprensible para mí): simplemente recopila todas las URL de todas las pestañas y ventanas y crea una estructura JSON, que se pasa a la siguiente
    • ejecute un script de shell, que ejecuta mi script perl con un intérprete perl instalado personalizado.
  • cuando se ejecuta la aplicación, guarda un HTMLarchivo en la carpeta Sessionsen mi archivo Desktop.
  • El nombre del archivo es como, s20190107-164908.htmlpor ejemplo, la cadena de fecha y hora actual.
  • es fácil usar la función de búsqueda rápida (barra espaciadora) del Finder para verificar rápidamente el contenido del archivo.

Está mucho más allá del Sessionscomplemento original, pero es utilizable para mí.

ingrese la descripción de la imagen aquí

El contenido completo de las acciones anteriores son:

1.) el JavaScript

function run(input, parameters) {
    var tablist = [];
    var Safari = Application('Safari');
    Safari.includeStandardAdditions = true;
    Safari.activate();
    var windows = Safari.windows();
    for(let iw=0, wsize=windows.length; iw<wsize; iw++) {
        var wintabs = [];
        var tabs = windows[iw].tabs();
        if (!tabs) continue;
        for(let it=0, tsize=tabs.length; it<tsize; it++) {
            if( tabs[it].url() ) {
                wintabs.push( {"name": tabs[it].name(), "url": tabs[it].url()} );
            }
        }
        if( wintabs.length ) {
            tablist.push(wintabs);
        }
    }
    return JSON.stringify(tablist);
}

y el script de shell

export ANYENV_ROOT=/opt/anyenv
export PATH="$ANYENV_ROOT/bin:$PATH"
eval "$(anyenv init -)"

perl -MJSON -MPath::Tiny -MTime::Piece -M5.014 -w -E '
    my $jsonstr = do { local $/; <STDIN> };
    my $j = decode_json($jsonstr);
    my @lines;
    lsay("<ol>");
    for my $w (@$j) {
        lsay("<li><ul>");
        for my $t (@$w) {
            my $astr = "<li><a href=\"$t->{url}\">$t->{name}</a></li>";
            lsay($astr);
        }
        lsay("</ul></li>");
    }
    lsay("</ol>");
    my $sessdir=path( $ENV{HOME}, "Desktop/Sessions");
    $sessdir->mkpath;
    my $sessfile=$sessdir->child(localtime->strftime("s%Y%m%d-%H%M%S.html"));
    $sessfile->spew_utf8(@lines);;
    sub lsay { push @lines, $_ for @_ }
'

Ejemplo de lo que ve en el vistazo rápido:

ingrese la descripción de la imagen aquí

Como ya dije, NO es una solución para un usuario común. Solo lo pueden usar los desarrolladores... :(

Aplicación interesante, no para ti: fireeye.com/blog/threat-research/2017/03/…
Tal vez podría instalar un keylogger como Keyboard maestro y atrapar los eventos de salida, ejecutar sus scripts y luego reiniciar la salida. muy frágil Sin duda, podría atrapar comando + q no estoy seguro sobre el mouseing alrededor.
He desarrollado un programa javascript para Waterfox. Intercepta al usuario escribiendo command+s. Puede escribir un javascript para interceptar lo que está haciendo el usuario e invocar su aplicación cuando el usuario sale. discusiones.apple.com/docs/DOC-250000368
@historystamp El principal problema es que el javascript del automatizador no se ejecuta dentro de Safari. Es un entorno Applescript -javascript, no un navegador javascript = entorno diferente, por ejemplo, sin eventos de carga de página y similares. Su secuencia de comandos en el pastebin captura la pulsación de tecla en un javascript que se ejecuta dentro de un navegador. Además, como dije, mi conocimiento de Javascript es terrible. Gracias de todos modos.