You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

macOS Mojave下如何用AppleScript获取Safari书签并转为对象?

在macOS Mojave中用AppleScript访问Safari书签的正确姿势

嘿,我太懂你这个困扰了——Mojave的隐私安全更新确实把直接读取bookmarks.plist的路子彻底封死了,毕竟那个文件现在受系统权限保护,就算手动改权限也容易出问题。不过别慌,我们可以直接用Safari官方提供的AppleScript接口来获取书签,完全合规还稳定!

下面是替代你旧代码的实现,能把书签栏、书签菜单和阅读列表的内容转成包含标题和URL的数组对象:

-- 初始化存储书签的数组
set bookmarkRecords to {}

tell application "Safari"
    -- 获取书签栏的所有书签
    repeat with bookmarkItem in bookmarks of bookmark bar folder
        try
            set end of bookmarkRecords to {tURL:URL of bookmarkItem, tTitle:name of bookmarkItem}
        end try
    end repeat

    -- 获取书签菜单的所有书签
    repeat with bookmarkItem in bookmarks of bookmark menu folder
        try
            set end of bookmarkRecords to {tURL:URL of bookmarkItem, tTitle:name of bookmarkItem}
        end try
    end repeat

    -- 获取阅读列表的条目
    repeat with readingListItem in reading list items
        try
            set end of bookmarkRecords to {tURL:URL of readingListItem, tTitle:title of readingListItem}
        end try
    end repeat
end tell

-- 现在bookmarkRecords就是你需要的对象数组啦,比如可以打印看看
log bookmarkRecords

几个关键说明:

  • 这个方法直接调用Safari的AppleScript API,不需要碰bookmarks.plist,完全避开了Mojave的权限限制。
  • 第一次运行脚本时,系统会弹出对话框请求权限,只要允许你的脚本访问Safari就行,授权一次之后就不会再弹了。
  • 代码里的try块是为了跳过那些可能没有URL的特殊条目(比如文件夹或者无效书签),避免脚本报错。
  • 和你旧代码的结构对应,分别处理了书签栏、书签菜单和阅读列表,最终的bookmarkRecords数组和你之前的myRecord结构一致,都是包含tURL和tTitle的字典。

如果你需要处理书签文件夹里的子书签(比如书签栏里的嵌套文件夹),可以加个递归遍历的逻辑,比如:

-- 递归遍历书签文件夹的函数
on processBookmarkFolder(folderItem)
    set folderRecords to {}
    tell application "Safari"
        repeat with itemInFolder in bookmarks of folderItem
            try
                if class of itemInFolder is bookmark folder then
                    -- 如果是文件夹,递归处理
                    set folderRecords to folderRecords & my processBookmarkFolder(itemInFolder)
                else
                    -- 如果是书签,添加到数组
                    set end of folderRecords to {tURL:URL of itemInFolder, tTitle:name of itemInFolder}
                end if
            end try
        end repeat
    end tell
    return folderRecords
end processBookmarkFolder

-- 使用示例:处理书签栏里的所有嵌套内容
tell application "Safari"
    set bookmarkBarContents to my processBookmarkFolder(bookmark bar folder)
end tell
log bookmarkBarContents

这样不管书签嵌套多少层,都能全部捞出来啦!

内容的提问来源于stack exchange,提问作者HR123

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:22:09