Applescript ejecutado por osascript no tiene permitido el acceso de asistencia cuando lo ejecuta un agente ( ~/Library/LaunchAgents
). Aunque funciona cuando se ejecuta desde el editor de Applescript o la línea de comandos directamente (usando osascript).
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 Dispositivos de asistencia y lo inicia un agente.
El script se ejecuta como se esperaba cuando se inicia desde:
Cuando es lanzado por Agent, devuelve:
/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 dije anteriormente, funciona bien cuando se ingresa directamente desde la línea de comandos usando: osascript /location/of/my.scpt
.
Además, en base a estas dos publicaciones, edité la /Library/Application\ Support/com.apple.TCC/TCC.db
base de datos SQLite y cuando reviso la tabla de 'acceso', muestra:
$ 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 puede ver, se permite el acceso a osascript y también agregué el .plist de mi agente por si acaso.
Lo único que se me ocurre es que, por alguna razón, el script lo ejecuta un 'usuario diferente' cuando lo inicia un Agente y, por lo tanto, tiene diferentes dispositivos de asistencia permitidos. Sin embargo, parece poco probable, ya que TCC.db no parece ser específico del usuario y el agente se encuentra en ~/Library/LaunchAgents
.
¿Ayuda, alguien?
Una solución simple es guardar el script como un archivo de texto.
En la parte superior del guión, agregue 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 Guardar, elija Texto como formato de archivo. El archivo se guardará como texto sin formato pero con la .applescript
extensión.
En la terminal, haga que el archivo de texto del script de guardado sea ejecutable.
Solía:
chmod +x /Users/UserName/Scripts/newTest1.applescript
En los argumentos de comando de LaunchAgent simplemente agregue la ruta al archivo.
No agregue el comando osascript a los argumentos. No lo necesitas.
El archivo de texto del script guardado actuará como un script de shell ejecutable.
Cuando cargue o ejecute LaunchAgents por primera vez, recibirá un mensaje para configurar el Acceso de asistencia en las Preferencias del sistema. Si ya tiene abiertas las Preferencias del sistema, no lo hará, pero el archivo de texto Script se agregará a la lista.
Ahora solo tiene que marcar su casilla de verificación para permitirlo.
Volvería a cargar el LaunchAgent para que se active de inmediato.
He verificado esto dos veces con el script anterior y todo funciona como se esperaba.
Si bien he aceptado la pregunta de @markhunte porque funciona en el caso general, no funcionó para mí. Es por eso que publico mi propia solución como alternativa.
Al hacer que el agente de ejecución ejecute un script de shell que simplemente llame al script de apple (.scpt), se debe permitir que el script de shell acceda a los dispositivos de asistencia una vez y el agente de ejecución puede ejecutarlo para, a su vez, llamar al script de apple.
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á shellscript.sh
dos veces al día según lo especificado por la StartCalendarInterval
clave. También tenga en cuenta las teclas StandardErrorPath
y StandardOutPath
que fueron útiles durante la depuración.
El shellscript.sh es extremadamente simple:
#!/bin/sh
osascript /Users/mnmt/Documents/InCuffs/Orders/PrepareShipping/print-shipping-labels.scpt
Como puede ver, una simple línea shebang para especificar que de hecho es un shellscript seguido de una sola llamada al applescript que originalmente había estado llamando directamente desde LaunchAgent.
Martín
Martín
/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 cambiar el applescript a texto?swrobel
execution error: System Events got an error: osascript is not allowed assistive access. (-1719)
en mi archivo de registro y no me pregunta Preferencias del sistema en 10.12.6