0 votos

Cómo llamar a la captura de pantalla de una página web en AppleScript

Como recién llegado a AppleScript, es muy posible que me esté olvidando de algo obvio, pero agradecería que me dieran su opinión. Mi intención es utilizar Safari para cargar una serie de imágenes de un número de The New Yorker y guardarlas como una secuencia de archivos png.

Aquí está mi intento (perdón por el aspecto extraño de esto, pero tuve problemas con el copiar/pegar en el 'cuerpo' de este mensaje debido a los comentarios en mi código) :

set i to 1
repeat 10 times
(*
format pagenumber to 11 characters
format outfile    to  7 characters *)
if i is less than 10 then
    set pagenumber to "page000000" & i & ".jpg"
    set outfile to "page00" & i & ".png"
else
    if i is less than 100 then
        set pagenumber to "page00000" & i & ".jpg"
        set outfile to "page0" & i & ".png"
    else
        set pagenumber to "page0000" & i & ".jpg"
        set outfile to "page" & i & ".png"

    end if
end if
(* generate URL *)
set html to "https://archives.newyorker.com/rvimageserver/Conde%20Nast/New%20Yorker/1967_09_02/" & pagenumber
tell application "Safari"
    if not (exists document 1) then reopen
    (* load URL *)
    tell current tab of window 1 to set URL to html
    (* get the id of that window        *)
    set window_id to id of window 1
    (* when web page has finally loaded, the resultant document will consist of the page number plus 2,048×2,797 pixels, or 2,048×2,881 pixels ie   "page0000002.jpg 2,048×2,797 pixels" or "page0000010.jpg 2,048×2,881 pixels"    *)
    set thename to pagenumber & " 2,048×2,797 pixels"
    set othename to pagenumber & " 2,048×2,881 pixels"
    (*   wait for page to load see  https://apple.stackexchange.com/questions/319986/applescript-help-wait-for-safari-page-to-load *)
    set myexit to "false"
    repeat while myexit = "false"
        if the document named (thename) exists then
            set myexit to "true"
        end if
        if the document named (othename) exists then
            set myexit to "true"
        end if
    end repeat
    delay 2
end tell
(* caputure the image element of window and save to outfile *)
do shell script ("screencapture -R 518,111,640,877 -l " & window_id & " " & outfile)
delay 2
(*  increment count *)
set i to i + 1 
end repeat

Todo parece funcionar como se espera hasta que intento capturar la pantalla a un archivo de salida cuando me encuentro con dos problemas:

~ no se crean archivos de salida (el mismo comando en el terminal funciona)

~ La opción -R de "captura de pantalla" para seleccionar parte de la ventana no funciona

Gracias, por cualquier consejo.

0 votos

Si sólo quieres obtener copias de las imágenes, puedes considerar llamar a curl en lugar de screencapture que puede descargar las imágenes y guardarlas para usted. Una llamada básica del Terminal la línea de comandos se vería así: cd ~/Pictures/NYTimesPhotos; curl --remote-name-all --url https://archives.newyorker.com/rvimageserver/Conde%20Nast/Ne‌​w%20Yorker/1967_09_0‌​2/page[00001-00010].‌​jpg que descargaría 10 imágenes jpeg. Sin embargo, tendrá que leer la página de manual ( man curl ) para aprender a enviar credenciales con curl para iniciar la sesión primero.

0 votos

Gracias por su (rápida) respuesta. La razón por la que he decidido utilizar el método AppleScript/Safari es porque el archivo de The New Yorker requiere un nombre de usuario/contraseña para acceder a estas páginas; pero entrando en el sitio desde una sesión de Safari antes de llamar al script puedo mostrar las páginas con éxito en una nueva pestaña de Safari. (En realidad, mi plan original era utilizar un script de perl, pero me he encontrado con el mismo problema que curl con los archivos descargados resultantes contienen "403 - Prohibido: Acceso denegado").

0 votos

Puede enviar credenciales con curl para autorizar su acceso. Está en la página man.

1voto

wch1zpink Puntos 11

Siempre que puedo suelo intentar usar sólo AppleScript y shell script pero de vez en cuando encuentro una joya escondida en Automator. Simplemente creé un nuevo flujo de trabajo de Automator y le añadí tres acciones... "Obtener la página web actual de Safari", "Obtener el contenido de las páginas web" y "Guardar las imágenes del contenido web".

A mí me funciona con la última versión de macOS Mojave.

enter image description here

Simplemente guarde el flujo de trabajo de Automator como una aplicación o como un servicio o comando de dictado...etc.

Para este proyecto, mi opción sería simplemente guardar el flujo de trabajo de Automator en la carpeta... /Usuarios/Su nombre corto/Librería/scripts/Aplicaciones/Safari (si la carpeta Safari no existe, puede simplemente crear la carpeta Safari durante el proceso de guardar su flujo de trabajo Automator) Guardar el archivo en esa ubicación, hará que en cualquier momento que esté usando Safari, pueda ejecutar el flujo de trabajo desde su barra de menú scripts.

enter image description here

Si el menú scripts no está ya en tu barra de menús, puedes activarlo en el menú de Preferencias Generales de scripts Editor.app

0 votos

Gracias por los comentarios, me gusta la idea de crear complementos para safari. Lamentablemente como estoy buscando un método para descargar automáticamente 100+ páginas de 52 revistas por año desde 1926 hasta la fecha en la cara de este método puede requerir demasiada intervención manual. En cuanto a mi script que he enumerado anteriormente, tengo una solución parcial a mis preguntas - en primer lugar es necesario proporcionar un directorio y nombre de archivo para la captura de pantalla, y yo uso un Perl script para extraer un área del archivo guardado.

0 votos

(Como nota) Como verás gracias a CJK, utilizo set thename to pagenumber & " 2,048×2,797 pixels" repeat while myexit = "false" if the document named (thename) exists then set myexit to "true" end if ....... end repeat Desgraciadamente, el nombre del documento en este sitio no es siempre el mismo y el valor antes de 'pixels' varía. ¿Hay alguna manera de incluir comodines, utilizar una expresión regular, o declaraciones como "incluye" o "contiene" en "si el documento llamado", en Applescript?

0 votos

@user13145 Sí, por supuesto, usted podría establecer una variable algo así como set partialText to "881 pixels" entonces su declaración condicional podría ser algo así como if document (whose name contains partialText) exists then set myexit to "true" . Yo uso ejemplos como ese en mi código AppleScript todo el tiempo.

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