• 日常搜索
  • 百度一下
  • Google
  • 在线工具
  • 搜转载

使用AppleScript生成打开的Safari选项卡列表

无论您是撰写综述的博主还是进行一些研究的学生,您可能都需要根据当前打开的 safari 标签创建网站列表。让我们学习如何编写一个 AppleScript 来为我们处理这个过程。

使用AppleScript生成打开的Safari选项卡列表  第1张
基于 Safari 中打开的选项卡脚本应输出的示例。

我们要学什么

我们要编写的脚本实际上是相当简单的,所以如果您刚刚开始使用 AppleScript,那么这是一个完美的项目。

您是否真的需要一个可以创建 Safari 标签列表的工具是无关紧要的。这里重要的是从我们如何处理这项任务中学习。

这里重要的是从我们如何处理这项任务中学习。

我们将介绍一些对您成为自动化专家至关重要的 AppleScript 结构:变量、“重复”循环、处理字符串、esc api ng字符等等。

步骤 1.创建算法

在处理任何编程项目时,你要做的第一件事就是看看你是否能勾勒出一个算法。这个词听起来很吓人,但实际上它只是一种花哨的方式来说明我们需要制定出我们将要做什么的步骤。

这只是一种奇特的方式来说明我们需要制定出我们将要做的事情的步骤。

要为我们的项目创建算法,我们必须对两件事有基本的了解:我们的最终目标和实现目标所需的步骤。后一部分有点棘手,因为它确实需要一些关于如何从编程角度解决问题的特定知识,这可能会也可能不会直观,具体取决于您的大脑如何工作。

目标

我们先分析一下我们的目标,我们要完成什么?我想要拍摄的最终结果是一个 TextEdit 文档,其中包含 Safari 中打开的选项卡列表。每个选项卡都应格式化为html链接,并将选项卡的标题设置为链接文本,如下所示:

<a href="www.siteurl.com">此处的标签标题</a>

过程

考虑到这个目标,我们可以通过思考为实现该目标而需要发生的过程来开始勾勒出我们的算法。在这一点上,不要担心完美。当我们在编码过程中遇到挑战时,我们会在精神上完善这个过程,这只是为了帮助我们了解我们的脚本会是什么样子。

  1. 计算 Safari 窗口的数量

  2. 计算每个窗口中的选项卡数

  3. 创建一个遍历每个窗口的每个选项卡的循环

  4. 获取当前选项卡的名称

  5. 获取当前选项卡的 URL

  6. 将选项卡名称、URL 和其他所需文本存储在变量中

  7. 打开文本编辑

  8. 创建一个新文档

  9. 将新文档的文本设置为包含我们的信息字符串的变量

第 2 步。创建一个 Safari Tell 块

现在我们已经大致了解了我们需要的步骤,是时候开始编码了。我们算法的前几个步骤都与 Safari 有关,所以我们需要在脚本中做的第一件事是为 Safari 创建一个告诉块。

[applescript]
tell application "Safari"
end tell
[/applescript]

告诉块是我们如何在脚本中定位我们正在与谁/什么交谈,在这种情况下,它是应用程序 Safari。

提示:不要忘记用“end tell”关闭你的tell块,如果没有这个,你的脚本会抛出错误。

步骤 3.创建初始变量

我喜欢在任何脚本中做的第一件事就是创建我知道我需要的任何变量。这有助于为脚本的其余部分奠定基础,并使事情井井有条。

此时,我知道我需要设置三个不同的变量:一个用于窗口计数,一个用于选项卡计数,一个用于生成的文档文本。

当我们在窗口中循环时,tab count 变量需要更新,所以它需要嵌套在一个循环中,但我们现在可以处理其他的。

[applescript]
tell application "Safari"

--Variables
set windowCount to number of windows
set docText to ""

end tell
[/applescript]

设置窗口计数

在注释之后,第一行代码创建了一个名为“windowCount”的变量。请注意,这是非常具有描述性的,而不是像“myVariable”这样的通用名称。始终尝试将变量命名为有用的名称,以使脚本的可读性保持较高。

AppleScript 的命令通常非常接近于简单的英语,使其成为一种非常容易让初学者快速上手的语言。

计算窗口的语法非常简单:将(变量)设置为窗口数。AppleScript 的命令通常非常接近于简单的英语,使其成为一种非常容易让初学者快速上手的语言。

docText 变量

关于上面代码的奇怪部分是我创建了一个空字符串变量,我为什么要这样做?原因稍后会更清楚,但基本上我们的重复将通过并每次添加一些内容,我们只需要一个开始的地方。您不能向不存在的变量添加内容!

第 4 步。第一个重复块

为了实现我们的目标,我们需要两个重复块。如果你从内到外工作,这背后的逻辑就更容易理解。

如果你从内到外工作,这背后的逻辑就更容易理解。

我们的目标是从标签中获取标题和 URL,然后为每个标签重复(重复块)。诀窍是虽然可能有多个打开的窗口,所以我们需要为每个窗口重复该过程(重复块)。

同样,这个思考过程是我们需要如何工作的由内而外,所以我们将从“每个窗口”重复块开始。

[applescript]
tell application "Safari"

--Variables
set windowCount to number of windows
set docText to ""

--Repeat for Every Window
repeat with x from 1 to windowCount
set tabCount to number of tabs in window x
end repeat
end tell
[/applescript]

重复

一个简单的重复块可能会说“重复 5 次”,但我们在这里做了一些更复杂的事情。“repeat with”构造允许我们设置一个有意的通用变量 (x),该变量将在每次运行重复块时递增。

为此,我们需要告诉我们的脚本 x 在其迭代中循环的起点和终点。我所做的是告诉 AppleScript 从 1 开始 x,然后增加它直到它达到等于打开窗口数的值,表示为我们之前设置的变量。

我使用了这个结构,因为它使我们的重复块非常通用。

我使用了这个结构,因为它使我们的重复块非常通用。如果脚本计数四个窗口,则重复块将运行四次,如果计数为五十,则该块将运行五十次。

计算标签

接下来,我基本上重复了我们之前用于窗口计数的过程,将变量设置为当前窗口中的选项卡数。

不过,为了实现这一目标,我不得不引入 x 变量。请记住,每次运行重复块时,此变量都会增加。所以第一次通过,我们将计算窗口一中的选项卡数量,第二次通过,我们将计算窗口二中的选项卡数量,等等。

步骤 5.第二个重复块

现在我们已经设置了一个将通过每个窗口的重复块,我们需要在其中插入另一个重复块来查看每个选项卡。两者一起将能够敲出每个窗口的每个选项卡。

当我们在这里时,我们还将为下一步设置一些变量。

[applescript]
tell application "Safari"

--Variables
set windowCount to number of windows
set docText to ""

--Repeat for Every Window
repeat with x from 1 to windowCount
set tabCount to number of tabs in window x

--Repeat for Every Tab in Current Window
repeat with y from 1 to tabCount
--Get Tab Name & URL
set tabName to name of tab y of window x
set tabURL to URL of tab y of window x
end repeat

end repeat
end tell
[/applescript]

对当前窗口中的每个选项卡重复

如您所见,此重复块使用与我们之前看到的相似的语法。我们已经在上一步中计算了选项卡的数量,因此我们使用通用递增变量 y 将重复块设置为从 1 到 tabCount。

抓取标签名称和 URL

为了完成这一步,我们启动了两个变量。它们的语法几乎相同,只有一个获取当前选项卡的名称,另一个获取 URL。我在 Safari AppleScript 字典中找到了这些命令的特定语法。

请注意,要获取当前选项卡的名称和 URL,我们只需使用每次运行重复块时递增的 x 和 y 变量。因此,我们第一次获取窗口一的选项卡的名称和 URL,然后是窗口一的选项卡二,然后可能是窗口二的选项卡一,等等。

步骤 6.填写 docText 字符串

还记得我们之前创建的空 docText 变量吗?现在我们要为列表中的每个条目填充我们想要的文本。每次重复块运行时,当前选项卡的标题和 URL 将使用我们上面概述的 HTML 格式添加到变量中。

代码是迄今为止我们遇到的最复杂的语法,请看下面,然后我将带您了解它是如何工作的。

[applescript]
tell application "Safari"

--Variables
set windowCount to number of windows
set docText to ""

--Repeat for Every Window
repeat with x from 1 to windowCount
set tabCount to number of tabs in window x

--Repeat for Every Tab in Current Window
repeat with y from 1 to tabCount

--Get Tab Name & URL
set tabName to name of tab y of window x
set tabURL to URL of tab y of window x

set docText to docText & ¬
"<a href=" & "\"" & ¬
tabURL & "\">" & ¬
tabName & ¬
"</a>" & ¬
linefeed as string
end repeat

end repeat
end tell
[/applescript]

级联

您需要在这里了解的第一件事是 AppleScript 中的连接(将东西放在一起)是通过 & 符号处理的。在上面的示例中,我想每次都向变量添加一堆不同的东西,所以我使用 & 符号将所有部分连接在一起。

添加到变量

请注意,我将 docText 变量设置为“docText &…”以及一堆其他内容。为什么我要为自己设置一个变量?这样做是告诉 AppleScript 我想将 docText 变量设置为已存储的所有内容以及其他一些内容。

最后,这个变量将包含将插入到我们的 TextEdit 文档中的全部内容。

这样,每次重复块再次运行时,我都会添加到这个变量并让它增长而不是替换它的内容。最后,这个变量将包含将插入到我们的 TextEdit 文档中的全部内容。

换行符和换行符

上面的代码中有两种不同形式的换行符。第一个是我在代码中插入的一系列表面换行符,以使其更具可读性。我想明确一点,几个不同的部分被分别添加到变量中。

“¬”符号可以在 AppleScript 中使用Option+Return输入,并表示换行符只是一种视觉效果,不应影响代码的运行方式。

但实际上,所有这些都是一行代码,我通常会写如下:

[applescript]
set docText to docText & "<a href=" & "\"" & tabURL & "\">" & tabName & "</a>" & linefeed as string
[/applescript]

请注意,这行代码的末尾附近是“换行”一词。与上面的表面换行不同,这代表了我实际上想要添加到变量中的东西。在每个行项的末尾,我插入一个换行符,以便下一个列表项从新行开始。

字符串和转义字符

我们试图插入的 HTML 文本的奇怪之处在于它包含引号,AppleScript 实际使用引号来指示字符串的开头和结尾,如下所示:

[applescript]
set myString to "Ladle rat rotten hut"
[/applescript]

在这里,我们启动了一个变量并用一些文本填充它。文本用引号括起来,告诉 AppleScript 变量是字符串类型。

那么如果 AppleScript 使用引号来包围字符串,我们如何将引号存储为字符串的一部分呢?答案是用反斜杠“转义”引号字符,如下所示:

[applescript]
set myString to "/"Ladle rat rotten hut/""
[/applescript]

在第一个示例中,变量的内容如下:Ladle rat rotten hut(不带引号存储)。在第二个示例中,变量实际上包含一组引号:“Ladle rat rotten hut”。

把它们放在一起

鉴于我们刚刚学到的所有信息,这里是被插入到我们的变量中并粘在一起的各个部分。

<a href="

tabURL

">

tabName

</a>

linefeed

当所有这些项目放在一起并为每个窗口中的每个选项卡重复脚本时,我们应该有一个列表,其格式与我们在开始时设定的目标完全相同。

<a href="www.siteurlone.com">Tab One Title Here</a>
<a href="www.siteurltwo.com">Tab Two Title Here</a>
<a href="www.siteurlthree.com">Tab Three Title Here</a>

第 7 步。创建文本文档

现在我们已经将所有这些信息存储到一个方便的变量中,是时候用它做点什么了。在我们的例子中,我们想把它扔到一个文本文档中。

为此,请为 TextEdit 创建一个新的 tell 块,如下所示:

[applescript]
tell application "Safari"

--Variables
set windowCount to number of windows
set docText to ""

--Repeat for Every Window
repeat with x from 1 to windowCount
set tabcount to number of tabs in window x

--Repeat for Every Tab in Current Window
repeat with y from 1 to tabcount

--Get Tab Name & URL
set tabName to name of tab y of window x
set tabURL to URL of tab y of window x

set docText to docText & "<a href=" & "\"" & tabURL & "\">" & tabName & "</a>" & linefeed as string
end repeat

end repeat
end tell

--Write Document Text
tell application "TextEdit"
activate
make new document
set the text of the front document to docText
end tell
[/applescript]

在 TextEdit tell 块中,我做了三件事:首先,我告诉应用程序“激活”,这只是将它带到前台,这样您就可以看到您的劳动成果。

接下来,我告诉 TextEdit 创建一个新文档。最后,我通过将新文档的文本设置为保存链接列表的变量来结束脚本。

试试看

至此,我们的脚本就完成了!如果您坚持了这么久,那么恭喜您,您已经编写了比绝大多数mac用户更多的 AppleScript,并且可以认为自己是Mac nerd 社区的精英成员。

要试用该脚本,请确保您已打开 Safari,其中有多个选项卡和多个设置为不同网站的窗口。设置完成后,只需点击 AppleScript 中的播放按钮即可观看魔术的发生。

提示:尝试将版本保存为应用程序,以便您可以在需要时快速运行它。

故障排除

不可避免地,你们中的许多人会达到这一点并遇到错误。出了点问题,但是什么?大多数情况下,答案很简单,比如打错字。您确定您输入的脚本与上面显示的完全一样吗?AppleScript 通常会尝试向您指出具体问题,遵循其建议并重新键入有问题的行。

AppleScript 通常会尝试向您指出具体问题,遵循其建议并重新键入有问题的行。

不幸的是,您完全有可能正确输入了所有内容,但仍然收到错误消息。也许您的 Safari 版本存在问题,或者脚本不喜欢您选择的网页,原因不明。试着改变一下,看看你是否能找出问题所在。

错误处理是一个相当深入的话题,我将在以后的文章中深入讨论,现在请查看我们关于高级 AppleScript 技术的文章,了解有关如何修改脚本以在引发错误时采取特定操作的更多信息.

结论

我刚刚向您介绍了编写 AppleScript 以从 Safari 中打开的选项卡生成链接列表的完整过程。这应该可以为您在那些大型研究项目上省去很多麻烦。


文章目录
  • 我们要学什么
  • 步骤 1.创建算法
    • 目标
    • 过程
  • 第 2 步。创建一个 Safari Tell 块
  • 步骤 3.创建初始变量
    • 设置窗口计数
    • docText 变量
  • 第 4 步。第一个重复块
    • 重复
    • 计算标签
  • 步骤 5.第二个重复块
    • 抓取标签名称和 URL
  • 步骤 6.填写 docText 字符串
    • 级联
    • 添加到变量
    • 换行符和换行符
    • 字符串和转义字符
    • 把它们放在一起
  • 第 7 步。创建文本文档
  • 试试看
  • 故障排除
  • 结论