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
相关产品推荐
相关产品推荐

