6 votos

Assistive Access cuando script es lanzado por el agente

Problema

Applescript ejecutado por osascript no se permite Assistive Access cuando es lanzado por el agente ( ~/Library/LaunchAgents ). Aunque funciona cuando se ejecuta desde el editor de Applescript o la línea de comandos directamente (usando osascript).

Situación

El applescript realiza varias tareas de GUI para la impresión por lotes y se ejecuta dos veces al día. Por lo tanto, necesita permiso para acceder a los dispositivos de asistencia y es lanzado por un agente.

El script se ejecuta como se espera cuando se lanza desde:

  • Editor de Applescript
  • osascript commandline (no-sudo)

Cuando se lanza por el Agente vuelve:

/location/of/my.scpt: execution error: System Events got an error: osascript does not have access to assistive devices. (-25211)

(Mensaje traducido del holandés por mí.)

Esto me llevó a creer que el problema es con osascript, pero como he dicho anteriormente, funciona bien cuando se introduce directamente desde la línea de comandos utilizando: osascript /location/of/my.scpt .

Además, basándose en estos dos posts he editado el /Library/Application\ Support/com.apple.TCC/TCC.db Base de datos SQLite y cuando compruebo la tabla 'access' aparece:

$ sudo sqlite3 /Library/Application\ Support/com.apple.TCC/TCC.db "SELECT * FROM access"
Password:
kTCCServiceAccessibility|com.logitech.gaming|0|1|0|??

kTCCServiceAccessibility|com.valvesoftware.steam|0|1|0|??

kTCCServiceAccessibility|com.blizzard.starcraft2|0|0|1|
kTCCServiceAccessibility|com.apple.AccessibilityInspector|0|1|0|??

kTCCServiceAccessibility|com.apple.ScriptEditor2|0|1|0|??

kTCCServiceAccessibility|com.apple.Terminal|0|1|0|??

kTCCServiceAccessibility|/usr/bin/osascript|1|1|1|
kTCCServiceAccessibility|com.my.label|0|1|1|
kTCCServiceAccessibility|/osascript|1|0|1|

Como se puede ver osascript se permite el acceso y también he añadido el .plist de mi agente para una buena medida.

¿Posible causa?

Lo único que se me ocurre es que, por alguna razón, el script sea ejecutado por un "usuario diferente" cuando es lanzado por un Agente y, por lo tanto, tenga permitidos diferentes dispositivos de asistencia? Parece poco probable, sin embargo, ya que el TCC.db no parece ser específico del usuario y el agente se encuentra en ~/Library/LaunchAgents .

¿Ayuda, alguien?

6voto

Malik hassan Puntos 16

Una solución sencilla es guardar el script como un archivo de texto.

En la parte superior del script añade el osascript shebang

#!/usr/bin/osascript

ejemplo:

#!/usr/bin/osascript
say "hello"
tell application "Safari" to activate
tell application "System Events"

    delay 2
    keystroke "p" using command down
    tell application process "Safari"

        tell application "System Events"
            tell process "Safari"
                click menu button "PDF" of sheet 1 of window 1
                delay 1

                click menu item "Save PDF to Web Receipts Folder" of menu of menu button "PDF" of sheet 1 of window 1
            end tell
        end tell
    end tell

end tell

En el cuadro de diálogo para guardar, elija Texto como formato de archivo. El archivo se guardará como texto sin formato pero con el .applescript extensión.

En el terminal haga que el archivo de texto save script sea ejecutable.

He utilizado:

chmod +x /Users/UserName/Scripts/newTest1.applescript

En los argumentos del comando del LaunchAgent sólo hay que añadir la ruta del archivo.

No añadir el comando osascript a los argumentos. No es necesario.

El archivo de texto script guardado actuará como un shell ejecutable script.

Cuando cargue o ejecute por primera vez los LaunchAgents obtendrá un aviso para configurar el Acceso Asistencial en las Preferencias del Sistema. Si ya tiene abiertas las Preferencias del Sistema no lo hará, pero el archivo de texto script se añadirá a la lista.

Ahora sólo tienes que marcar su casilla para permitirlo.

Yo recargaría el LaunchAgent para que lo coja directamente.

He vuelto a comprobarlo con el script anterior y todo funciona como se esperaba.

0 votos

¡Gracias! Probaré esto en casa esta noche y lo aceptaré cuando funcione. ¿Alguna idea de por qué mi método no funciona? Tengo curiosidad.

0 votos

He estado trasteando con esto y tengo otro error que no puedo eliminar. El applescript abre un archivo en otra aplicación (P-touch Editor v5.1, para ser exactos). Me da este error: /path/to/script.applescript:1226:1292: execution error: LSOpenURLsWithRole() failed with error -10810 for the file /path/to/templatefile.lbx. (1) . Los bits de ejecución se han establecido en los archivos .applescript y .lbx. Supongo que esto tiene algo que ver con el cambio de applescript a texto.

0 votos

Sólo tengo execution error: System Events got an error: osascript is not allowed assistive access. (-1719) en mi archivo de registro y no me lo pide Preferencias del Sistema en 10.12.6

2voto

Martin Puntos 23

Aunque he aceptado la pregunta de @markhunte porque funciona en el caso general, a mí no me ha funcionado. Por eso publico mi propia solución como alternativa.

Crear un shellscript que lance el applescript

Haciendo que el launchagent ejecute un shellscript que simplemente llame al applescript (.scpt) el shellscript necesita tener acceso a los dispositivos de asistencia una vez y puede ser ejecutado por el launchagent para, a su vez, llamar al applescript.

En mi caso, terminé con el siguiente LaunchAgent .plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.mylabel.some-awesome-utility</string>
    <key>Program</key>
    <string>/Users/username/absolute/path/to/shellscript.sh</string>
    <key>StandardErrorPath</key>
    <string>/tmp/com.mylabel.some-awesome-utility.err</string>
    <key>StandardOutPath</key>
    <string>/tmp/com.mylabel.some-awesome-utility.out</string>
    <key>StartCalendarInterval</key>
    <array>
        <dict>
            <key>Hour</key>
            <integer>06</integer>
            <key>Minute</key>
            <integer>05</integer>
        </dict>
        <dict>
            <key>Hour</key>
            <integer>20</integer>
            <key>Minute</key>
            <integer>05</integer>
        </dict>
    </array>
</dict>
</plist>

Este LaunchAgent llamará al shellscript.sh dos veces al día según lo especificado por el StartCalendarInterval clave. También hay que tener en cuenta la StandardErrorPath y StandardOutPath teclas que fueron útiles durante la depuración.

El shellscript.sh es extremadamente sencillo:

#!/bin/sh
osascript /Users/mnmt/Documents/InCuffs/Orders/PrepareShipping/print-shipping-labels.scpt

Como puedes ver, una simple línea shebang para especificar que es efectivamente un shellscript seguido de una única llamada al applescript que originalmente había estado llamando directamente desde el LaunchAgent.

0 votos

¡Hola! Estoy tratando de hacer algo similar - aunque quiero ejecutar un Python script que llama a AppleScript para hacer algunas cosas específicas de la Apple. Usted menciona - "el shellscript necesita tener acceso a los dispositivos de asistencia". ¿Cómo le diste acceso a los dispositivos de asistencia a un shell script - esa interfaz parece que sólo permite añadir archivos .app. Gracias.

0 votos

@jim70 Al menos en MacOS 10.14, no hay que hacer nada especial en el script. Cuando se ejecute la primera vez, el SO pedirá al usuario que conceda al script acceso asistido, y si lo acepta, le llevará al panel correspondiente en Preferencias del Sistema. El script se añadirá automáticamente a la lista pero no se habilitará. Entonces, el usuario tendrá que cambiar el acceso del script manualmente.

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