Получение размеров изображения с использованием Javascript через AppleScript - PullRequest
1 голос
/ 09 июля 2019

Попытка сделать что-то, что я думал, будет легкой, то есть получить размеры изображения в Интернете с помощью javascript и затем вернуть эти значения обратно в AppleScript.

Проверьте этот исходный код, я думал, что он будет работать, но я полный нуб, когда дело доходит до Javascript.

set theVar to "https://i.ebayimg.com/images/g/M58AAMXQaBtRAPkA/s-l500.jpg"

set theScript to "var img = theVar;
var height = img.height;
var width = img.width;"

tell application "Safari"
do JavaScript theScript
end tell
set theResult to result

Я бы надеялся, что в результате будут возвращены размеры.

Ответы [ 4 ]

1 голос
/ 10 июля 2019

Получение свойств ширины и высоты первого изображения:

Учитывая, что в URL вашего вопроса есть одно изображение, рассмотрим следующую суть:

set theURL to "https://i.ebayimg.com/images/g/M58AAMXQaBtRAPkA/s-l500.jpg"

set js to "[].slice.call(document.querySelectorAll('img')).map(function(img) {return {src: img.src, width: img.width, height: img.height}});"

tell application "Safari"
  make new document with properties {URL:theURL}
  delay 4
  set imgProps to (do JavaScript js in current tab of window 1)

  if (length of imgProps > 0) then
    set {width:width} to item 1 of imgProps
    set {height:height} to item 1 of imgProps
    set {src:src} to item 1 of imgProps

    log width
    log height
    log src
  end if
end tell

Пояснение:

  1. Следующая строка JavaScript, которая назначена переменной AppleScript с именем js:

    [].slice.call(document.querySelectorAll('img')).map(function(img) {return {src: img.src, width: img.width, height: img.height}});
    
    • Использует метод document querySelectorAll() для получения NodeList каждого img элемента в DOM.
    • Часть [].slice.call(...) преобразует NodeList (которые как массив ) в массив - это позволяет нам использовать методы, предоставляемые массивом, такие как map().

      Примечание: Для современных версий Safari, которые поддерживают , вы можете заменить это методом Array.from(...). Однако [].slice.call(...) работает для версий Safari, которые поддерживают только ES5, и современных ES6 тоже.

    • Функция обратного вызова, предоставляемая map, то есть этой части;

      function(img) {return {src: img.src, width: img.width, height: img.height}}
      

      return s Объект со свойствами / значениями для src, width и height для каждого img элемента.

  2. Часть make new document with properties {URL:theURL} создает новый документ в Safari с заданным URL-адресом. По сути, он открывает / загружает URL.

  3. Часть delay 4 использует команду delay, чтобы приостановить выполнение скрипта (в этом примере 4 секунды), чтобы дать время загрузки веб-страницы перед продолжением выполнения JavaScript.

    Важно Возможно, вам придется увеличить / уменьшить эту продолжительность в зависимости от скорости загрузки страницы. Есть также другие решения для ожидания загрузки веб-страницы, которые вы, возможно, захотите попробовать, такие как этот пост и этот пост . По сути, AppleScript API Safari не предоставляет встроенную функцию для этого, поэтому любое решение, включая использование команды delay, представляет собой обходной путь / хак ¯\_(ツ)_/¯

  4. Часть set imgProps to do JavaScript js in current tab of window 1 выполняет JavaScript и присваивает результат (т. Е. Список AppleScript из record 's') переменной imgProps.

  5. Финальные части:

    set {width:width} to item 1 of imgProps
    set {height:height} to item 1 of imgProps
    set {src:src} to item 1 of imgProps
    
    log width
    log height
    log src
    

    присваивает значения каждому свойству (width, height и src) от первого record в list их собственным переменным, а именно; width, height и src.

    Наконец, мы записываем значение для каждой переменной.

    Примечание Эти последние части находятся в теле if (length of imgProps > 0) then, поэтому они запускаются только в том случае, если данная веб-страница содержит одно или несколько изображений


Получение свойств ширины и высоты для всех изображений:

Тот же код Javascript, что и выше, можно использовать для получения свойств всех элементов img на веб-странице. Заметное отличие в следующем примере:

  1. Предоставляется другой URL-адрес веб-страницы, который содержит более одного img элемента.
  2. Длительность delay увеличена (примечание: при необходимости измените это значение) .
  3. repeat используется для циклического перебора всех record в list и log свойствах.
set theURL to "https://en.wikipedia.org/wiki/Car"

set js to "[].slice.call(document.querySelectorAll('img')).map(function(img) {return {src: img.src, width: img.width, height: img.height}});"

tell application "Safari"
  make new document with properties {URL:theURL}
  delay 8
  set imgProps to do JavaScript js in current tab of window 1

  if (length of imgProps > 0) then
    repeat with img in items of imgProps
      log width of img
      log height of img
      log src of img
      log "-------"
    end repeat
  end if
end tell
1 голос
/ 09 июля 2019

Это не решение JavaScript.Однако следующий код AppleScript загрузит все изображения с URL-адресов изображений, которые вы определили в первой строке кода.Далее он запишет в файл имя изображения и его размеры.Конец кода предоставляет команду для удаления загруженных изображений и покажет текстовый файл в Finder, содержащий имена изображений и их размеры.

Пути к папкам и файлам не заданы жестко, поэтому все, что вам нужнодля этого нужно ввести URL-адреса изображений для переменной в первой строке этого AppleScript.

Этот код AppleScript работает для меня с использованием последней версии macOS Mojave.

set imageURL to {"https://i.ebayimg.com/images/g/M58AAMXQaBtRAPkA/s-l500.jpg", "https://i.imgur.com/gQQHPBn.png"} -- Can Enter Multiples

-- Downloads The Images (Defined Above) To The Folder (Defined Below)
set downloadedImagesFolder to ((path to downloads folder as text) & "Images For Dimensions") as text
set quotedFormOfDownloadedImagesFolder to quoted form of POSIX path of downloadedImagesFolder
-- Writes Name Of Image And It's Dimensions To The File (Defined Below)
set imageDimensionsFile to ((path to downloads folder as text) & "File_Dimensions.txt") as text
set quotedFormOfImageDimensionsFile to quoted form of POSIX path of imageDimensionsFile

tell application "Finder"
    if not (exists of folder downloadedImagesFolder) then
        make new folder at (path to downloads folder) ¬
            with properties {name:"Images For Dimensions"}
    end if
end tell

repeat with i in imageURL
    set imageURLText to i
    set text item delimiters to "https" -- shell script "lwp-download " errors with "https"
    set tempURL to text items of imageURLText
    set text item delimiters to "http" -- replaces "https" with "http"
    set finalImgeURL to tempURL as text
    set text item delimiters to ""
    try
        do shell script "lwp-download " & quoted form of finalImgeURL & " " & quotedFormOfDownloadedImagesFolder
    end try
end repeat

tell application "Finder"
    set imageFiles to files of folder downloadedImagesFolder as alias list
    set quotedFormOfImageFiles to {}
    repeat with i in imageFiles
        set end of quotedFormOfImageFiles to quoted form of POSIX path of i
    end repeat
end tell

repeat with thisItem in quotedFormOfImageFiles
    delay 2 -- May Need To Increase Value If Returning Null Value Results
    -- replace " >> " with " > " Below... If You Prefer To Overwrite The File Instead Of Append
    do shell script "mdls -name kMDItemFSName -name kMDItemPixelHeight -name kMDItemPixelWidth " & thisItem & " >> " & quotedFormOfImageDimensionsFile
end repeat

tell application "Finder" to reveal imageDimensionsFile

(* Comment Out Or Remove The Following Line If You Don't Want To
Delete The Downloaded Images *)
tell application "Finder" to delete folder downloadedImagesFolder
1 голос
/ 10 июля 2019

Файлы должны быть загружены для работы с изображениями, но вам не обязательно их сохранять. Вы можете использовать AppleScript или JXA , чтобы получить содержимое URL-адреса в NSImage , где вы можете получить его свойство size - например:

AppleScript:

use AppleScript version "2.4" -- Yosemite (10.10) or later
use framework "Foundation"

set theURL to current application's NSURL's URLWithString:"https://i.ebayimg.com/images/g/M58AAMXQaBtRAPkA/s-l500.jpg"
set theImage to current application's NSImage's alloc's initByReferencingURL:theURL
theImage's |size| as record

EDIT:

Еще раз посмотрев на комментарии, если используется URL, который не изображение, оба редактора сценария аварийно завершают работу при использовании initWithContentsOfURL (osascript также выдает ошибки). Использование initByReferencingURL работает нормально (вы также можете использовать свойство valid для проверки изображения).

JXA:

ObjC.import('Cocoa')
theURL = $.NSURL.URLWithString('https://i.ebayimg.com/images/g/M58AAMXQaBtRAPkA/s-l500.jpg')
theImage = $.NSImage.alloc.initWithContentsOfURL(theURL)
theImage.size
0 голосов
/ 09 июля 2019

Вы можете попробовать хакерский метод:

set theURL to "https://i.ebayimg.com/images/g/M58AAMXQaBtRAPkA/s-l500.jpg"

tell application "Safari"

    set URL of document 1 to theURL

    delay 1 --> lazy way to let image load; also see below

    tell window 1

        tell tab 1

            do JavaScript ("window.location.reload();") -- refresh window; otherwise you might get "Untitled"

        end tell

    end tell

    return name of document 1 --> "s-l500.jpg 500×301 pixels" -- from here you can parse to get dimensions
end tell
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...