如何在 Mac 上使用 Automator 重复截图
使用 Take Screenshot 和 Loop 构建 Automator 截图工作流,需要有序文件时改用 shell 操作。
9 分钟阅读效率作者:Temposhot Team
Automator 随 macOS 提供,无需额外软件即可连续截图。由两到三个操作组成的工作流可以完成截取、等待和重复。本文以两种方式构建该工作流,将其保存为应用,并列出专用截取工具比它更省力的情况。
检查 Automator 的屏幕录制权限
macOS 将屏幕截取视为受保护的权限。工作流第一次截取屏幕时,macOS 会询问是否允许 Automator 录制屏幕。如果拒绝,或提示从未出现,保存的文件就只会显示壁纸和菜单栏。
打开 System Settings,进入 Privacy and Security,找到屏幕录制列表。不同 macOS 版本中该项目的名称有所不同。在列表中开启 Automator,退出 Automator,然后重新打开。
保存为应用的工作流在该列表中是一个单独的条目。即使 Automator 已有访问权限,该应用首次运行时仍需要自己的权限。
为什么只得到壁纸的结果
没有屏幕录制权限时,截取仍会成功,但 macOS 只返回该进程被允许看到的内容:桌面图片和菜单栏。过程中不会出现明显的错误。因此第一次测试时,应打开并检查文件,而不能只统计数量。如果预期几 MB 的文件只有几百 KB,通常说明应用窗口缺失。
移动或重命名保存的应用
macOS 将权限条目与应用绑定。如果重新构建工作流、以新名称重新保存,或将其移到其他文件夹,系统可能将其视为新应用并再次询问,或在删除旧条目并添加新条目之前默默拒绝访问。应在第一次正式运行前确定最终名称和位置。
选择原生操作或 shell 操作
Automator 提供两种方式实现相同的结果:
- 原生操作。 “Take Screenshot”操作加上“Loop”操作。无需编写代码,但对文件名和截取区域的控制有限。
- shell 操作。 “Run Shell Script”操作调用
screencapture命令。需要几行 shell 代码,但可以精确控制文件名、格式和区域。
快速测试时先使用原生操作。当文件相互覆盖,或需要固定区域时,改用 shell 操作。
先在终端中测试命令
将 shell 命令粘贴到 Automator 之前,先在终端中运行一次。screencapture -x ~/Desktop/test.png 应在桌面上生成一个文件,且没有声音。如果生成的只是壁纸图片,说明终端缺少屏幕录制权限,这是与 Automator 分开的权限条目。命令在终端中正常运行后,Automator 内部剩余的问题只与 Automator 本身的权限或路径有关,两者都更容易定位。
方式一:使用 Take Screenshot 和 Loop
创建工作流
从 Applications 打开 Automator,新建一个 Workflow 文档。
添加 Take Screenshot
在资源库中搜索 “screenshot”,将 Take Screenshot 拖入工作流。选择全屏截取,并选择仅用于此任务的文件夹作为保存位置。可用选项因 macOS 版本而异。
添加暂停
添加 Pause 操作,并设置等待时间,例如 3 秒。
添加循环
在末尾添加 Loop。选择自动循环,并按次数停止(例如 10 次),或按分钟数停止。
运行短测试
将次数设为 3,选择 Run,然后打开文件夹。
测试后检查文件名。如果操作在每次执行时写入相同的文件名,每次截取都会替换前一个文件,最终只剩下一个文件。添加一个在文件名后追加日期和时间的 Finder 重命名操作会有所帮助,但序号更便于排序。方式二直接解决了这个问题。
循环实际需要的时间
Pause 操作只设定了循环的一部分。每次循环还需要花费时间写入图片,在 5K 显示器上,一张全屏 PNG 可能需要占用明显的一部分秒数。10 次循环、每次暂停 3 秒,仅等待时间就有 30 秒,实际运行时间会略长一些。对于对时间敏感的任务,例如每次翻页截取一个画面,应用秒表测量一次运行的时间,然后调整暂停时间,而不是依赖名义值。
使用 Rename Finder Items 生成连续文件名
如果希望继续使用原生操作,Rename Finder Items 操作有一个可以生成连续文件名的模式。它只处理传入它的文件,因此工作流需要在每次循环中将新截图传给它。实际上,这在循环中很难处理。更简洁的做法是:将原生循环运行到空文件夹中,文件名使用日期和时间,然后再运行一个一次性的工作流,按文件名顺序对文件夹中的所有文件进行连续重命名。
方式二:将 Run Shell Script 与 Automator 的 Loop 组合使用
用 Run Shell Script 替换 Take Screenshot,并保留 Pause 和 Loop 操作。将以下代码粘贴到该操作中,shell 设为 zsh:
dir=~/Captures/automator
mkdir -p "$dir"
n=$(ls "$dir" | wc -l | tr -d ' ')
screencapture -x -t png "$dir/frame-$(printf %04d $((n + 1))).png"
每次循环都会统计文件夹中已有的文件数,并写入下一个编号,因此画面会按截取顺序排列:frame-0001.png、frame-0002.png,依此类推。-x 参数会关闭快门声音。在文件名前添加 -R 0,0,1440,900,可以截取固定区域,而不是整个屏幕。
每次新任务开始前,应清空文件夹,或修改 dir。否则编号会从上次运行的结果继续。
固定区域的坐标
-R 后的数值依次为 x、y、宽度和高度,单位为点,以主显示器的左上角为原点。在 Retina 显示屏上,保存的图片在每个方向上的像素数都是两倍,因此 -R 0,0,1440,900 会生成 2880 × 1800 的图片。要获取这些数值,按 Shift+Command+4,十字光标旁边会显示指针坐标。记下区域的左上角和右下角,按 Escape 取消,然后相减得到宽度和高度。将这四个数字记下来,并确保每次运行时目标窗口的位置都不变。
在画面之间添加翻页
要截取一系列幻灯片或页面,工作流必须在每个画面之后按一次键。在 shell 操作之后添加 Run AppleScript 操作:
on run {input, parameters}
tell application "System Events" to key code 124
return input
end run
Key code 124 对应 Right Arrow。按键会发送给当前位于最前的应用,因此在开始前应将目标应用置于最前,并且在运行期间不要操作 Mac。保存的应用需要辅助功能权限,System Events 才能发送按键。
每分钟截取一帧的任务
对于较慢的任务,例如在 2 小时的部署期间观察仪表盘,将 Pause 设为 60 秒,并将 Loop 设为 120 分钟后停止。循环会在两次循环之间检查时间限制,因此运行会在超过限制后的第一次循环结束,大约生成 120 个画面。每个画面都是全屏图片,因此应先检查可用的磁盘空间。运行期间,Automator 窗口或保存的应用会被占用。提前停止会结束工作流,但已保存的画面会保留在文件夹中。
多个显示器
只指定一个文件名时,screencapture 只截取主显示器。使用 -D 2 可以截取第二个显示器,并且可以在一次循环中传入两个文件名,同时保存两个显示器的画面。显示器编号遵循 System Settings 中的排列方式,重新连接显示器后编号可能发生变化,因此在长时间运行前,应检查每个显示器的一张画面。
保存可重复使用的 Automator 应用
选择 File,然后选择 Save,并将文件格式选为 Application。应将应用保存在稳定的位置,例如 Applications 文件夹。双击应用即可运行工作流,无需打开 Automator。
保存的应用首次运行时会触发其自身的屏幕录制提示。如果工作流通过 AppleScript 发送按键,该应用还需要辅助功能权限。
通过键盘快捷键运行
Automator 的 Quick Action 可以绑定键盘快捷键。新建一个 Quick Action 类型的文档,将其设为不接收任何应用中的输入,添加相同的操作,然后保存。接着打开 System Settings 中的键盘快捷键部分,在 Services 下找到该操作,并为其指定快捷键。快捷键可以在任何应用中启动循环,对于需要目标应用保持在最前的翻页任务非常方便。
排查工作流问题
| 现象 | 可能原因 | 处理方法 |
|---|---|---|
| 图片只显示壁纸 | 缺少屏幕录制权限 | 允许 Automator 或保存的应用,然后重新打开 |
| 循环多次后只有一个文件 | 固定文件名在每次循环中被覆盖 | 使用方式二,或添加重命名步骤 |
| 循环只运行一次 | Loop 设为每次询问 | 改为自动循环 |
| 缺少第二个显示器 | 只在一个显示器上进行全屏截取 | 分别使用 -D 1 和 -D 2 截取每个显示器 |
| 画面全黑 | 运行期间显示器进入睡眠 | 在整个运行期间保持 Mac 唤醒 |
查看工作流日志
运行提前停止时,Automator 窗口中的日志会显示哪个操作失败以及错误信息。以错误退出的 shell 操作会使循环停止。常见原因之一是路径中包含未加引号的空格,例如 ~/My Captures。应保留上面脚本中 "$dir/..." 的引号。另一个原因是保存的应用运行时,外置硬盘上的文件夹尚未挂载。
保持 Mac 唤醒
长时间的循环可能会超过显示器睡眠的计时器。caffeinate 命令会在另一个命令运行期间保持 Mac 唤醒,caffeinate -d 可以阻止显示器睡眠。最简单的做法是在运行前于终端中启动它,运行结束后用 Control+C 停止。或者,也可以在 System Settings 中临时延长显示器的睡眠时间。
Automator 不够用的情况
Automator 能够按固定次数、以固定节奏完成截取。以下几种常见需求需要额外的工作:
- 画面之间需要按键。 翻页需要一个 AppleScript 步骤,通过 System Events 发送按键,并且需要辅助功能权限。
- 在某个时钟时间停止。 Loop 操作按次数或分钟数计算。若要在 18:30 停止,需要在脚本中加入日期逻辑。
- 暂停和继续。 提前停止会结束整个工作流。
- 可搜索的输出。 Automator 可以将图片合并为 PDF,但没有 OCR 的 PDF 没有文本层。
Temposhot 的 Auto Capture 将这些需求作为设置提供。每个循环都会保存一张截图,发送可选的 Key press,然后等待间隔时间。停止条件包括 Screenshots、Duration 和 End time,浮动工具栏可以暂停、继续或结束运行。导出内容包括可搜索的 PDF 和 MP4。按键自动化、Duration、End time 以及每个会话不限数量的截图都需要 Temposhot Pro。
同一任务的 Auto Capture 设置
上面的翻页工作流包含 40 个画面,使用 Right Arrow,并且每次暂停 2 秒,可以对应到四个字段。倒计时是唯一在 Automator 中没有对应项的字段。其选项为 None、3 秒(默认值)、5 秒和 10 秒,用于在第一个画面保存之前让阅读器有时间切换到第一页。将 Stop condition 设为 Screenshots 并填入 40,Interval 设为 2 秒,Key press 设为 Right Arrow,Countdown 设为 3 秒,然后在 Windows 标签页中选择窗口。Temposhot 会在运行开始时将该窗口置于最前,因此按键能够送达。如果经常运行此任务,可以使用 Save Current Setup 将这四个数值保存为预设。
若运行必须在 18:30 停止,将 Stop condition 设为 End time 并输入该本地时间。暂停不会改变结束时间,因此暂停 20 分钟仍会在 18:30 结束运行。Automator 的方式则需要一个读取时钟并结束循环的脚本。
300 个画面的页面任务所需的工作量
假设你获准截取一份文档的 300 页,每页截取一个画面,页面之间使用 Right Arrow 翻页。在 Automator 中,该任务需要带编号文件名的 shell 操作、一个 AppleScript 按键步骤、为保存的应用授予辅助功能权限、用十字光标测量的区域,以及一个单独的步骤来生成 PDF,而该 PDF 仍然没有文本层。任何中断都会结束运行,重新开始则需要调整数量和起始编号。在 Auto Capture 中,同样的任务只需要四个字段和一个窗口选择,运行可以通过浮动工具栏暂停和继续,PDF 导出包含 OCR 文本。两者的差别不在截取质量,而在截取之外需要的衔接工作。
Automator 仍然适用的情况
当任务必须在无法安装应用的 Mac 上运行、输出只需要原始图片文件,或截取只是更大工作流中的一步(该工作流还需要移动文件、调整图片尺寸或发送邮件)时,Automator 仍然是合适的选择。在这些情况下,方式二中带编号文件名的 shell 操作是最可靠的构建块。
40 个画面任务的时间检查
倒计时为 3 秒、间隔为 2 秒时,40 个画面的任务总共等待约 83 秒:第一个画面前 3 秒,加上 80 秒的间隔,不包括每次截取本身所需的时间。Automator 版本还会在每次循环中加入保存时间,因此实际运行时间比仅看暂停设置更长。启动 Temposhot 运行,结束后统计画面数,并确认数量为 40。如果数量不同,应在下次运行前检查停止条件。
排查 Temposhot 运行问题
| 现象 | 可能原因 | 处理方法 |
|---|---|---|
| 按键没有效果 | 未授予辅助功能,或 macOS 全局处理了该按键 | 授予辅助功能,然后用该按键运行一次短测试 |
| 目标窗口不在最前 | 未授予辅助功能 | 授予权限;如果 macOS 仍然阻止焦点切换,在 Temposhot 提示时点击该窗口 |
| 画面重复 | 按键在页面渲染完成之前到达 | 提高间隔,例如从 2 秒提高到 3 秒 |
| 第一个画面显示了错误的页面 | 倒计时太短,无法切换窗口 | 将倒计时设为 5 或 10 秒 |
| 运行在 40 个画面之前停止 | 停止条件为 Duration 或 End time | 将停止条件设为 Screenshots,数量为 40 |
常见问题
Automator 仍然随 macOS 提供吗?
是的。在当前的 macOS 版本中,Automator 位于 Applications 文件夹中,与 Shortcuts 应用并列。
Automator 能只截取单个窗口吗?
Take Screenshot 操作无法按名称指定窗口。screencapture -l 参数接受窗口 ID,但 macOS 没有内置命令可以输出窗口 ID。
为什么我的 Automator 截图相互覆盖?
原生操作可能在每次循环中写入相同的文件名。应使用方式二中的 shell 操作,它会为每个画面编号。
Automator 能将截图生成 PDF 吗?
Automator 包含一个将图片合并为 PDF 的操作。结果没有文本层,因此它不是可搜索的 PDF。
之后能为 Automator 生成的 PDF 添加文本层吗?
可以,需要单独的步骤。Screenshot to Searchable PDF 在浏览器中对截图进行文字识别,并返回一个可搜索、可复制文字的 PDF。
截图能包含指针吗?
screencapture 命令默认不包含指针。添加 -C 参数后会包含指针,这在画面需要记录某人点击的位置时很有帮助。原生的 Take Screenshot 操作在各个 macOS 版本中都不提供相同的控制。
为什么我的循环只运行一次?
Loop 操作很可能设置为在继续前询问。将其改为自动循环,并设置次数或分钟数。同时检查是否有更早的操作失败;日志会显示错误信息。
Automator 能在设定的时间启动循环吗?
Automator 没有自己的调度器。launchd 代理或基于日历的触发器可以在指定时间打开保存的应用,但每种方式都需要额外设置。对于应在某个时钟时间结束的运行,Temposhot 的 End time 停止条件只需作为一个设置即可实现。
将可重复的截图转化为成品
如需带按键、停止条件以及 PDF 或 MP4 导出的定时运行,请阅读自动截取指南或参阅Mac 截图自动化。如果想在不使用 Automator 的情况下实现相同的循环,请阅读通过命令行自动截图。
automatorscreenshot-automationmacosworkflows
本文使用的术语: screenshot workflow
把重复性截图整理为成品
Temposhot 可按定时或每次点击进行截图,并将结果导出为 PDF、图片、ZIP 或 MP4。
相关文章
- 如何通过命令行在 Mac 上自动截图使用 macOS screencapture 循环进行全屏、固定区域和翻页截图,包含安全的文件命名和故障排查。
- 在 Mac 上使用 Shortcuts 应用自动截图在 Mac 上使用 Shortcuts 定时截图,在设定时间或应用打开时运行快捷指令,并解决脚本和屏幕录制权限问题。
- 如何用 Mac 内置工具自动截图用 screencapture、Automator 或快捷指令在 Mac 上自动截图,包括权限设置、安全的循环方式和故障排查。
- Mac 截图方法:系统内置工具与第三方应用对比什么情况下第三方截图软件比 Mac 内置工具更合适,什么情况下 Cmd+Shift 快捷键就够用。对比 CleanShot X、Snagit 和 Temposhot。