在AppleScript中获取活动的浏览器窗口详细信息

时间:2019-04-24 10:29:19

标签: applescript

目标:识别macOS中最新的浏览器窗口,并获取其活动标签的URL和标题作为Markdown链接。

它注定是由其他应用程序触发的Alfred工作流,但是现在我仅在脚本编辑器中调试它的核心。我同时打开了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 个答案:

答案 0 :(得分:1)

正如评论中所讨论的那样,您的脚本所做的假设是AppleScript将返回应用程序订购的最近关注的进程列表,但事实并非如此。

但是,您可以使用Shell命令lsappinfo metainfo以此顺序检索应用程序名称列表。通过一些其他命令来对此进行分类,以隔离感兴趣的信息并清理文本:

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

产生一个漂亮的,可读的,有序的应用程序列表,其中最后一个项的最新活动比其下一个项的活动最近:

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

对此进行测试,当我切换到脚本编辑器,然后再次运行shell命令时,返回的列表是:

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

由于您只想了解两个特定应用程序( Safari Google Chrome )之间的顺序,因此可以将shell命令简化为:

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 & ")"

但是,我建议实际上将该脚本编写为Shell脚本。我相信Shell脚本会比AppleScript快,因为与编译和运行AppleScript相比,AppleScript花费更多的时间来生成Shell进程并运行Shell脚本(在这种情况下,尽管通常,{ {1}}通常比本地AppleScript进程慢。另一个好处是,通过使用shell变量替换,我们可以使生成的脚本更加紧凑​​,将两个浏览器AppleScript代码块压缩为一个单一的,双重用途的文本脚本,osascript可以编译一次已经进行了变量替换(从而避免了我在评论中提到的运行时/编译时恶意)。

shell(bash)脚本如下所示:

osascript