Получение информации об активном окне браузера в AppleScript - PullRequest
0 голосов
/ 24 апреля 2019

Цель: определить самое последнее окно браузера в macOS и получить URL-адрес и заголовок активной вкладки в виде ссылки на Markdown.

Он предназначен для рабочего процесса Альфреда, запускаемого из других приложений, но сейчас я просто отлаживаю его ядро ​​в редакторе сценариев. У меня открыты Safari и Chrome, а также ряд других приложений. Из отладки я вижу, что он правильно перечисляет все открытые окна, но он никогда не соответствует ни одному из условий if. В качестве еще одного доказательства, если я просто использую строки tell application изолированно, возвращаются правильные результаты. Я уверен, что это очень просто.

set output to ""
tell application "System Events"
    set appNames to name of every application process whose visible is true
    repeat with appName in appNames
        if (appName = "Google Chrome") then
            using terms from application "Google Chrome"
                tell application appName to set currentTabTitle to title of active tab of front window
                tell application appName to set currentTabUrl to URL of active tab of front window
            end using terms from
            set output to "[" & currentTabTitle & "](" & currentTabUrl & ")"
            exit repeat
        else if (appName = "Safari") then
            using terms from application "Safari"
                tell application appName to set currentTabTitle to name of front document
                tell application appName to set currentTabUrl to URL of front document
            end using terms from
            set output to "[" & currentTabTitle & "](" & currentTabUrl & ")"
            exit repeat
        end if
    end repeat
end tell
return output

1 Ответ

1 голос
/ 25 апреля 2019

Как уже говорилось в комментариях, ваш сценарий предполагает, что AppleScript вернет список процессов, упорядоченных приложением, которое в последний раз имело фокус, но это не так.

Однако выможно получить список имен приложений в этом порядке, используя команду оболочки lsappinfo metainfo.Передача этого через несколько дополнительных команд для выделения интересующей информации и очистки текста:

lsappinfo metainfo \
    | grep bringForwardOrder \
    | grep -E -o '"[^"]+"' \
    | tr -d "\""

создает хороший, читаемый, упорядоченный список приложений, где каждый элемент в последнем был последним активным в последнее время.ниже приведенного ниже:

Google Chrome
Script Editor
Atom
Messages
WhatsApp
Finder
Safari
Script Debugger
WebTorrent

При проверке этого, когда я переключаюсь на Редактор сценариев и затем снова запускаю команду оболочки, возвращается список:

Script Editor
Google Chrome
Atom
Messages
WhatsApp
Finder
Safari
Script Debugger
WebTorrent

Поскольку вы заинтересованы только в различении этого порядка между двумя конкретными приложениями, а именно Safari и Google Chrome , команду оболочки можно несколько упростить до:

lsappinfo metainfo | grep -E -o 'Safari|Google Chrome' | head -1

, который будет возвращать одно имя, которое является браузером, который в данный момент либо активен, либо совсем недавно имел фокус;или пустая строка, если, скажем, не запущен ни один браузер.

Включение этого в ваш AppleScript и очистка сценария до некоторой степени:

property nil : ""

set [currentTabTitle, currentTabUrl] to [nil, nil]

set cmd to "lsappinfo metainfo | grep -E -o 'Safari|Google Chrome' | head -1"
set frontmostBrowser to do shell script cmd

if the frontmostBrowser = "" then return nil

if the frontmostBrowser = "Google Chrome" then

    tell application "Google Chrome" to tell ¬
        (a reference to the front window) to tell ¬
        (a reference to its active tab)

        if not (it exists) then return nil
        set currentTabTitle to its title
        set currentTabUrl to its URL
    end tell

else if the frontmostBrowser = "Safari" then

    tell application "Safari" to tell ¬
        (a reference to the front document)

        if not (it exists) then return nil
        set currentTabTitle to its name
        set currentTabUrl to its URL
    end tell

end if

return "[" & currentTabTitle & "](" & currentTabUrl & ")"

Однако я бы предложил на самом деле составить сценарийкак сценарий оболочки.Я полагаю, что сценарий оболочки будет быстрее, чем AppleScript, потому что AppleScript потребует больше времени для запуска процесса оболочки и запуска сценария оболочки, чем оболочка для компиляции и запуска AppleScript (в данном случае - хотя, как правило, osascript обычно медленнее, чем собственный процесс AppleScript).Другое преимущество заключается в том, что с помощью подстановки переменных оболочки мы можем сделать результирующий сценарий намного более компактным, сведя два блока кода AppleScript браузера в единый текстовый скрипт двойного назначения, который osascript скомпилирует после того, как переменнаябыли сделаны замены (таким образом, избегая малярии времени выполнения / компиляции, о которой я упоминал в комментариях).

Сценарий оболочки (bash) выглядит следующим образом:

browser=$(lsappinfo metainfo | grep -E -o 'Safari|Google Chrome' | head -1)
[[ "$browser" = "Safari" ]] && syntax="current" || syntax="active"

script="tell app \"$browser\" to tell ¬
        (a reference to the front window) to tell ¬
        (a reference to its $syntax tab)

        if not (it exists) then return \"\"
        \"[\" & its name & \"](\" & its URL & \")\"
end tell"

[[ -n "$browser" ]] && osascript <<< "$script" || echo ""
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...