AppleScript初体验,让你的mac实现自动化UI操作

AppleScript 简介

AppleScript是苹果公司开发的一种脚本语言,用于操作MacOS及其应用程序,在实现MacOS自动化工作方面非常给力。
我们可以使用AppleScript用来完成一些重复琐碎的工作,AppleScript具有简单自然的语法,另外系统也提供了语法查询字典,可以很方便的查询语法

官方说明文档:在 Mac 上使用 AppleScript 和“终端”自动执行任务 - 官方 Apple 支持 (中国)

概念图:

AppleScript 能做什么

1.能与用户交互,如响应用户输入、通知中心发送通知等。

2.能控制其他 app ,如果其他 app 提供了相关 AS 接口可以直接控制,如果没有提供相关接口则需要通过 AS 语法来获取界面上的按钮等操作元素进行操作。

3.能执行自动化任务如发送邮件、执行定时脚本、打开音乐播放器、锁屏、响应自定义的 URL Scheme 后执行脚本等。

基本语法

每行的前面加上 ---(三个短横线)或者 # 表示注释本行。

用 (*xxx*) (括号+星号)包裹的 xxx 表述块注释掉 xxx 的内容。

他的基本跟口头预类似,不过如果你对英文语法不自信,比如不清楚 besides against over 等在具体语境中的意思,建议还是老老实实使用基本语法。

AppleScript 的形式

AppleScript 常用的有两种形式,Script(脚本)、Application(应用),这里只介绍前两种,Script bundle 和 Text 我没用这里不展开。

注:这里需要说明一点的是,即使是相同的代码,保存成脚本运行和保存成应用运行,界面是不一样的。

脚本

脚本顾名思义就是像 js 一样的可执行文件,不同的是 as 是在 Mac 桌面环境执行,而 js 是在 Chrome 中执行的。双击即可运行。下图是脚本 process 显示进度的界面,通过点击脚本右上角的「运行」按钮运行:

应用

保存成 Application 的 AS 的后缀名跟普通的应用如 Safari、Chrome、微信等应用一样,会以 .app 结尾,也可以查看包内容。有多种运行方式如 URL Scheme 调用、双击、拖拽内容到 app 图标上,你需要写相关的事件函数来响应相关用户操作。下图是 应用process 显示进度的界面,通过双击 「xxx.app」运行:

其他

除了上述两者,其他的不常用,不过如果你需要将 script 保存成服务以在状态栏或者任意界面的右键的服务中能够调用该脚本,这需要上述两者之外的形式:

你可以选择将脚本保存成系统 Service,此时上述 process 代码运行的时候,进度条会显示在顶部状态栏:

常用操作代码

以下操作基于「应用」类型的 AS,下列的语法在终端中使用 osascript -e '语法内容' 可以快速验证。需要注意的是,类似于多行的表达如 process 进度条的显示,osascript 是没办法做到的,虽然你可以在很多多行命令如 tell 中使用多个 -e 参数来串联如 osascript -e ‘tell application “Finder”’ -e ‘end tell’ ,但是此语法对 process 进度条无效。

用户交互

在通知中心显示信息

display notification "通知内容" with title "通知 title" subtitle "通知副标题"

弹窗

display dialog "这是个通知"

获取用户输入

display dialog "What's your name?" default answer "" with icon note buttons {"取消", "确认"} default button "确认"

注:AS 没有办法生成类似表单一样的组件,只能生成上面这种对话框,类似网页中的 prompt

播放给定文本

say "What is your name?" using "Alex" speaking rate 140 pitch 42 modulation 60

其他

让用户选择文件夹、文件、颜色、从列表中选择一项等,暂时省略。

执行命令行

do shell script "echo $PATH"

注意,命令行中的 PATH 环境变量为 /usr/bin:/bin:/usr/sbin:/sbin ,因此无法在其中执行诸如 node 、nvm 等后来安装的命令,这些命令执行的时候需要手动指定命令所在位置。

执行 node 脚本: 

set node to "/Users/x/.nvm/versions/node/v14.19.1/bin/node"set appPath to "/Applications/Xhelper.app/Contents/Resources/Scripts/"do shell script node & " " & appPath & "index.js"

获取上一个语句的输出结果

直接在上一句语句后立即使用 result 表示结果即可:

do shell script "echo $PATH"display dialog result with title "通知"

显示调试信息

直接使用 log 语句即可,然后在 Script Editor 下方的 Replies 中获取输出信息,可以在这里看到 shell script 命令执行的过程中,脚本向控制台输出的内容,如执行 js 脚本的时候的 console.log 等。

log do shell script "echo $PATH"

显示进度

显示进度用到 progress ,语句相对来说比较复杂,因为需要显示不同的状态进度,需要多行:

set progress total steps to 3set progress completed steps to 0set progress description to "处理中..."delay 1set progress completed steps to 1delay 1set progress completed steps to 2delay 1set progress completed steps to 3

相关的截图可以在上面看到。

延迟一段时间后执行

delay n

n 表示秒数,支持小数。一般用来模拟用户操作的时候的延迟操作,否则可能因为脚本操作过快页面还未来得及显示等。一些奇怪的问题也可以通过延迟执行来解决,此语句可以类比于 js 中的 setTimeout 大法。

调用其他应用

注意,此处会有系统警告,需要你确认才能执行:

确认后可以在设置-安全与隐私-隐私-自动化中确认:

可以调用其他应用来执行相应的操作,下面是唤起 Terminal 应用后,激活然后执行命令:

tell application "Terminal"if not (exists window 1) then reopenactivatedo script "echo $PATH" in window 1end tell

此语句做了一个判断,如果第一个打开的窗口存在,则激活之,然后在其内执行命令(do script );如果不存在的话则会新建一个窗口然后在其内执行命令。因为每个 do script 都会打开一个新的 Terminal 这个判断可以保证复用窗口。不过需要注意的是,如果 window 1 内已经有一个已经存在的进程(如 server 未中断),那么这个命令是不会执行的,还需要额外的判断,此处不展开。

响应 URL Scheme

有些时候你不想先找到 AS 脚本,然后双击运行;或者有时候你需要从另一个应用中调起你写的 AS 应用,这个时候就用到了 URL Scheme。

首先你需要修改 Info.plist 文件,可以在 Script Editor 的右侧,右键 「显示在 Finder」 中:

然后向上一级,可以看到该文件:

内容是一个类似 XML 的东西编辑之,在其内加入如下字段:

<array><dict><key>CFBundleURLName</key><string>Open File</string><key>CFBundleURLSchemes</key><array><string>xhelper</string></array></dict></array>

然后确认一下,用 XCode 打开该文件可以看到类似的条目:

表示添加成功。

这个操作的意思是,将该 AS 应用响应以 xhelper (可以任意修改成你想要的开头,不要与已有的重复即可)开头的 URL。

设置完成后,需要在 Script Editor 中保存一下,或者 cmd + L 一下或者运行一次(或者都做一遍),重新编译,然后才能生效。

然后,为了让 AS 响应该 URL,需要设置一个事件监听:

on open location this_URLdisplay dialog this_URLend open location

上述代码中,this_URL 即为以你 xhelper 打开的链接。

此时在浏览器中(截图是 Chrome)测试一个链接:

然后 AS 应用就会响应然后弹窗显示 xhelper://你好! ,注意这里是不用 encode 编码的。

我的使用

在这里放出我自己的 Craft build 代码,用的是上述的 URL Scheme,其中的 node 执行的 js 都是

​从之前的工作流改造的,没有什么新逻辑。另外 AS 的语法比较口语化,直接看就能看懂每句话是什么意思,这里就不一一解释了。

on open location this_URLtryset startOffset to offset of "://" in this_URLset the content to text from (startOffset + 3) to -1 of this_URLset node to "/Users/x/.nvm/versions/node/v14.19.1/bin/node"set appPath to "/Applications/Xhelper.app/Contents/Resources/Scripts/"--- 如果有两个参数表示需要发布到 wechat,如果只有一个参数则参数即为 base64 编码的内容set AppleScript's text item delimiters to "&"set arguments to every text item of the contentset AppleScript's text item delimiters to ""set listLength to the length of argumentsif listLength = 2 thenset realContent to item 2 of argumentsdo shell script "echo " & realContent & " > " & appPath & "content.base64.txt"tell application "Terminal"if not (exists window 1) then reopenactivateset alive to do script node & " " & appPath & "index.js" in window 1--- 等待上一个脚本执行完毕后再执行下一个脚本repeatdelay 0.1if not busy of alive then exit repeatend repeatbeepdo script node & " " & appPath & "wechat.js" in window 1end tellelsedo shell script "echo " & content & " > " & appPath & "content.base64.txt"tell application "Terminal"if not (exists window 1) then reopenactivatedo script node & " " & appPath & "index.js" in window 1end tellend ifon error error_messagedisplay dialog error_message buttons {"Cancel"} default button 1

效果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/820149.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【DM8】ET SQL性能分析工具

通过统计SQL每个操作符的时间花费&#xff0c;从而定位到有性能问题的操作&#xff0c;指导用户去优化。 开启ET工具 INI参数&#xff1a; ENABLE_MONITOR1 MONITOR_SQL_EXEC1 查看参数 select * FROM v$dm_ini WHERE PARA_NAMEMONITOR_SQL_EXEC;SELECT * FROM v$dm_ini WH…

系统学c#:1、基础准备(软件下载与安装)

一、Vs软件下载与安装 访问Visual Studio官方网站&#xff1a; https://visualstudio.microsoft.com/zh-hans/downloads 下载Visual Studio 运行exe文件&#xff0c;点击“继续” 初始文件安装完成后选择我们需要安装的项&#xff0c;并勾选好必要的单个组件&#xff0c;设…

【Java框架】Spring框架(二)——Spring基本核心(AOP)

目录 面向切面编程AOPAOP的目标&#xff1a;让我们可以“专心做事”专心做事专心做事解决方案1.0专心做事解决方案2.0蓝图 AOP应用场景AOP原理AOP相关术语术语理解 AOP案例实现前置/后置/异常/最终增强的配置实现1.依赖2.业务类3.日志类4.配置切入点表达式匹配规则举例 环绕增强…

[linux]进程控制——进程终止

一、main函数的返回值 我们在编写C语言的程序时&#xff0c;通常会这样写&#xff1a; int main() {return 0; } 那么我们为什么要返回&#xff08;return&#xff09;0 呢&#xff1f; 其实&#xff0c;main函数也是一个函数&#xff0c;它也会被调用&#xff0c;所以谁调…

牛客周赛 Round 39(A,B,C,D,E,F,G)

比赛链接 官方题解&#xff08;视频&#xff09; B题是个贪心。CD用同余最短路&#xff0c;预处理的完全背包&#xff0c;多重背包都能做&#xff0c;比较典型。E是个诈骗&#xff0c;暴力就完事了。F是个线段树。G是个分类大讨论&#xff0c;出题人钦定的本年度最佳最粪 题目…

RT-Thread学习

RT-Thread三个版本——标准版本 RT-Thread&#xff0c;全称是Real Time-Thread&#xff0c;顾名思义&#xff0c;它是一个嵌入式实时多线程操作系统&#xff0c;基本属性之一是支持多任务&#xff1a;一个处理器核心在某一时刻只能运行一个任务&#xff0c;由于每次对一个任务…

HCIP【ospf综合实验】

目录 实验要求&#xff1a; 实验拓扑图&#xff1a; 实验思路&#xff1a; 实验步骤&#xff1a; 一、划分网段 二、配置IP地址 三、搞通私网和公网 &#xff08;1&#xff09;先搞通私网&#xff08;基于OSPF协议&#xff0c;在各个路由器上进行网段的宣告&#xff0c…

实现智能水控 | 基于ACM32 MCU的分体式水控方案

分体式水控概述 分体式水控是一种常见的水控系统&#xff0c;它的工作原理是通过水的流动来控制水的供应和排放&#xff0c;该系统一般由两部分组成&#xff1a;控制器和水阀。控制器负责监测水的流量和压力&#xff0c;根据设定的参数来控制水阀的开和关&#xff0c;从而实现水…

2024认证杯数学建模A题保暖纤维保暖能力原创论文讲解(含完整python代码)

大家好呀&#xff0c;从发布赛题一直到现在&#xff0c;总算完成了认证杯数学中国数学建模网络挑战赛第一阶段A题目保暖纤维的保暖能力完整的成品论文。 本论文可以保证原创&#xff0c;保证高质量。绝不是随便引用一大堆模型和代码复制粘贴进来完全没有应用糊弄人的垃圾半成品…

windows下vscode调试虚拟机linux c++工程的三种方法

vscode去远程调试方法有很多种&#xff0c;不同的插件对应了不同的调试方法&#xff0c;比如&#xff1a; 1.C/C插件进行GDB调试(编写launch.json文件) 2.C/C Runner插件 3.CMake Tools插件&#xff08;只针对CMake工程&#xff0c;需要搭配C/C插件一起使用&#xff0c;但无…

Gin框架小结

Gin 简介 Gin是一个轻量级的Web框架&#xff0c;用于构建高性能的Go语言Web应用程序。提供了路由管理、中间件支持、参数绑定和验证、错误处理、静态文件服务等功能。 Gin框架解决了什么问题和痛点 1.golang http 标准库本身提供了比较简单的路由注册能力&#xff0c;只支持…

记录一次内存溢出

1、查看catalina相关日志&#xff0c;确定关键字相关行号 文件&#xff1a;catalina.out命令1&#xff1a;cat -n catalina.out |grep -a OutOfMemoryError与内存溢出相关的如上&#xff0c;每一个行号其实都对应到具体时间点。可以发现&#xff0c;这个范围相符合&#xff1…

清明三天,用Python赚了4万?

每年4月&#xff0c;是Python圈子里接私活的旺季&#xff0c;特别是在节假日这种数据暴增的时间段&#xff0c;爬虫采集、逆向破解类的私活订单会集中爆发&#xff0c;量大价高。几乎所有的圈内人都在趁着旺季接私活。 正好&#xff0c;我昨天就做了一单爬虫逆向私活&#xff…

引领软件供应链安全 比瓴科技位居安全牛全景图第一

近日&#xff0c;安全牛第十一版《中国网络安全行业全景图》正式发布&#xff0c;比瓴科技入选全景图软件供应链安全赛道中开发流程安全管理、DevSecOps和软件成分分析三个重要细分领域&#xff0c;并位居开发流程安全管控领域第一。 安全牛本次全景图研究工作于23年正式启动&a…

什么是云安全?云安全包含哪些方面?

云计算彻底改变了数据存储的世界&#xff0c;它使企业可以远程存储数据并随时随地从任何位置访问数据。存和取变得简单&#xff0c;也使得云上数据极易造成泄露或者被篡改&#xff0c;所以云安全就显得非常重要了。那么什么是云安全&#xff1f;云安全的工作原理是什么&#xf…

做一个好的程序员难吗?只需要这10个习惯

在这个世界上&#xff0c;有数以百万计的人对软件开发充满热情&#xff0c;他们有很多名字&#xff0c;如软件工程师、程序员、编码员、开发人员。一段时间后&#xff0c;这些人可能会成为一名优秀的编码员&#xff0c;并且他们将非常熟悉如何使用计算机语言完成工作。但是&…

EasyRecovery激活秘钥2024最好用的电脑数据恢复软件下载

EasyRecovery数据恢复软件是一款专业且功能强大的数据恢复工具&#xff0c;它旨在帮助用户从各种存储设备中恢复由于各种原因&#xff08;如误删除、格式化、病毒攻击、系统崩溃等&#xff09;导致丢失的数据。这款软件支持多种存储介质&#xff0c;包括但不限于硬盘驱动器、U盘…

0.5W 3KVDC 隔离 单输出 DC/DC 电源模块 ——TPR-W5 系列

TPR-W5系列是一款需要隔离和电压转换的产品&#xff0c;工业级环境温度&#xff0c;温度范围从–40℃到105℃&#xff0c;用于PCB安装的国际标准结构。此系列产品小巧&#xff0c;效率高&#xff0c;低输出纹波及提供3000V以上的直流电压隔离&#xff0c;用于需要隔离的场合&am…

【Spring系列】- Spring事务底层原理

实验准备 配置文件 首先在配置文件中配置jdbcTemplate和事务管理器&#xff0c;并且需要开启事务的注解EnableTransactionManagement以及Configuration注解 ComponentScan("com.lyd") EnableTransactionManagement Configuration public class ApplicationConfig …

[入门]测试原则-ApiHug准备-测试篇-002

&#x1f917; ApiHug {Postman|Swagger|Api...} 快↑ 准√ 省↓ GitHub - apihug/apihug.com: All abou the Apihug apihug.com: 有爱&#xff0c;有温度&#xff0c;有质量&#xff0c;有信任ApiHug - API design Copilot - IntelliJ IDEs Plugin | Marketplace 写在前面…