0 votos

AppleScript lee y desencadena otro script en base a la notificación recibida

¿Hay alguna forma de leer la notificación de MacOS Catalina desde AppleScript?

parece que ya no se almacenan en ~/Library/Application Support/ , ni siquiera estoy seguro del nombre del proceso, "Notification Center" parece fallar

Me gustaría ejecutar un AppleScript que pueda detectar y leer una nueva notificación y luego activar otro script basado en la notificación

0voto

wch1zpink Puntos 11

El siguiente código AppleScript debería funcionar si lo guardas como una aplicación "stay open". Sólo hay que establecer los valores de las propiedades para scriptToRun y lookForThisText y debería ser bueno para ir.

No olvides conceder permisos en las Preferencias del Sistema para que tu nueva aplicación de permanencia abierta controle tu ordenador

property scriptToRun : (path to desktop as text) & "your.scpt" -- your path to .scpt file
property lookForThisText : "Search For This Text In Notification Windows" -- your search term
property theseTitles : {}

on idle
    getNotificationTitles()
    delay 0.1
    if theseTitles contains lookForThisText then
        ---------------------------------------------------------------
        delay 6 -- Gives Banner Time To Self Close
        --tell current application to beep 5 -- Just For Testing
        run script alias scriptToRun
        ---------------------------------------------------------------
    end if
    return 1 -- in seconds
end idle

on quit
    --  Executed when the script quits
    continue quit -- allows the script to quit
end quit

on getNotificationTitles()
    -- This Gets The Titles Of The Currently Displaying Notification Alerts And Banners
    tell application id "com.apple.SystemEvents"
        tell (the first process whose bundle identifier = "com.apple.notificationcenterui")
            set theseWindows to every window whose subrole is ¬
                "AXNotificationCenterAlert" or subrole is "AXNotificationCenterBanner"
            set theseTitles to {}
            repeat with thisWindow in theseWindows
                set titleText to the value of static text 1 of thisWindow
                set the end of theseTitles to titleText
                set subTitleText to the value of static text 1 of scroll area 1 of thisWindow
                set the end of theseTitles to subTitleText
                set notificationText to the value of static text 2 of scroll area 1 of thisWindow
                set the end of theseTitles to notificationText
            end repeat
        end tell
    end tell
end getNotificationTitles

Aquí hay una animación rápida que muestra el proceso en acción. He creado una aplicación AppleScript llamada Test Notification.app cuyo único propósito es mostrar una notificación display notification "Blah" with title "BLAH BLAH" subtitle "DUH” Luego, usando el código que utilicé como respuesta a este post, creé una "Aplicación Stay Open", cuyo único propósito es monitorear todas las ventanas de notificación entrantes para el texto que defino en la variable lookForThisText . Una vez identificado el texto, desencadena otro script "Merge Every Finder Window.scpt" que como su nombre indica fusiona todas las ventanas del Finder.

enter image description here

enter image description here

0 votos

Gracias, lo estoy mirando pero siempre me da error (-> error número -1728 del proceso "Centro de notificaciones") pero estoy casi seguro de que es algo que estoy haciendo mal.

0 votos

¿Por qué todos los try ¿bloqueos? Son innecesarios, es una pereza y es un mal ejemplo. Y ¡NO! a un infinito repeat bucle. Nunca, jamás. La cosa es que sé que sabes todo esto, así que eso hace que este script sea aún más peculiar. Espero que consideres revisar el script, particularmente el repeat bucle.

1 votos

@Kevin No, no lo estás haciendo mal. El script está mal. En el en_GB local, al menos, el nombre del proceso debe ser "Centro de Notificación" (que es una sola palabra). Sin embargo, esto variará según la localidad, y su mejor opción es hacer referencia al proceso así: tell app id "com.apple.SystemEvents" to tell the first process whose bundle identifier = "com.apple.notificationcenterui" to... . El identificador del paquete siempre será el mismo en todo el mundo, por lo que debería obtener la referencia de orientación correcta. Sin embargo, yo en su lugar no utilizaría este script (al menos hasta que se modifique).

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X