关于macos:用Applescript-实现自定义的动态壁纸

9次阅读

共计 4931 个字符,预计需要花费 13 分钟才能阅读完成。

用 Applescript 实现自定义的动静壁纸

1. 动静壁纸 Dynamic Wallpaper

讲到在苹果上整动静壁纸,就得先聊聊他自家的计划。最早苹果在 macOS Mojave 里引入了这个概念,基于每天的不同时段去变动桌面的壁纸。其所用的技术是在设置壁纸时,用一个带有工夫信息的 Heic 格局的图片去设置成壁纸,外面蕴含了多张的 tiff 图片及工夫信息。到了工夫就切换一下外面利用的图片。这个技术整挺好,又不占用资源又实用。有那么段时间你甚至能够自已做这样的图片去实现这样的性能,但当初,在 Big Sur 上是不可能的啦。因为壁纸目录在 /System/Library/Desktop\ Pictures 这里。整个系统目录是只读的,所以你是不能自已加的。

讲到这里,能实现这个性能的“官网渠道”就曾经“此路不通”了。得另想办法。

在查找材料前我就想着有没有可能用脚本去做这个事,毕竟 Mac 是 Unix 系的货色。有没有可能能够用 Bash 脚本 加一些事件勾子来实现动静壁纸呢。

经查找,能够是能够的,但和设想中的有一点点不一样。

能够应用 Applescript 来做,并用 Launchctl 来实现定时调用。实践上来说应该也能够用 Crontab+Bash 来实现调用,但在最新的零碎上 Cron 如同没啥作用。即便给了全盘文件的拜访权限也不行。暂预计是因为苹果的平安设计导致的。另外用 Lauchctl 有 Cron 所没有的益处。上面再具体说。如果你是 Linux 类的机器那预计是能够用 Crontab+Bash 实现这个成果的。但我没试🤔

2. Applescript

那么 Applescript 是什么?

AppleScript is a scripting language created by Apple. It allows users to directly control scriptable Macintosh applications, as well as parts of macOS itself. You can create scripts—sets of written instructions—to automate repetitive tasks, combine features from multiple scriptable applications, and create complex workflows.

下面是苹果开发官网的介绍。基本上能够了解成它就是苹果零碎下的一个专门为苹果量身定制的脚本语言。

在有写其余语言的根底下,Applescript 的学习老本倒是不高。而且它十分相似英语的自然语言。所以总体上说还挺好学的。就是没有 IDE 有点🌚 零碎自带有个 Applescript 编辑器(Script Editor),能够说根本没有 Windows 下的记事本好用就是了。我学根本语法的时候就有过脚本的高亮卡 Bug 了的状况,写着写着就不能写了。然而因为 Applescript 不能用 Vim 之类的编辑器关上所以也没啥抉择。

在开始前咱们须要筹备好壁纸文件。我的想法是 24 小时每个小时变一次。一天由 24 张不一样的壁纸组成。你能够自已在一个中央定机定时拍摄一组图片或者在网上寻找他人的作品来做。

这里我是把文件放在了家目录下的图片里:

# Display X 就是指给第 X 个显示器用的。# 图片名就是具体的小时数。~/Pictures/Wallpapers/Display1/01.jpg

像这样:

咱们要用到的脚本如下:

(*

Script By:
Puls Garney 08.11.2021

The Idea Came From:
https://github.com/pipwerks/OS-X-Wallpaper-Changer

Picture Locations:
~/Pictures/Wallpapers/Display1/01.jpg
~/Pictures/Wallpapers/Display2/03.jpg
~/Pictures/Wallpapers/Display3/24.jpg

*)

set useSameWallpaper to false

set wallpaperPath to "~/Pictures/Wallpapers/Display"

set currentPhoto to hours of (current date) as string

if ((the length of currentPhoto) < 2) then
    set currentPhoto to "0" & currentPhoto
end if

tell application "System Events"
    
    if (useSameWallpaper) then
        
        tell every desktop
            
            set wallpaper to wallpaperPath & "1/" & currentPhoto & ".jpg"
            
            set picture to POSIX file wallpaper
            
        end tell
        
    else
        
        set displays to a reference to every desktop
        
        repeat with counter from 1 to (count displays)
            
            try
                
                set wallpaper to (wallpaperPath & counter as string) & "/" & currentPhoto & ".jpg"
                
                set picture of item counter of displays to POSIX file wallpaper
                
            end try
            
        end repeat
        
    end if
    
end tell

上面我一段一段讲一下性能:

set useSameWallpaper to false

这句是个变量,如果你想在所有的显示器上都用同一组图片则能够改成 true. 我想要每个都不一样所以我用了 false.

set currentPhoto to hours of (current date) as string

if ((the length of currentPhoto) < 2) then
    set currentPhoto to "0" & currentPhoto
end if

而后咱们获取到以后的零碎工夫的小时数,如果小时数的全长不到 2 位数就补全成 2 位,比方是两点钟就会是“02”,而不是“2”。

而后接下来咱们用零碎事件的形式,给播送不同的设置图片的事件。

tell every desktop

    set wallpaper to wallpaperPath & "1/" & currentPhoto & ".jpg"

    set picture to POSIX file wallpaper

end tell

如果是要全副显示器都显示同一组图片的。这里会全副采纳第一组图片。

set displays to a reference to every desktop

repeat with counter from 1 to (count displays)
    
    try
        
        set wallpaper to (wallpaperPath & counter as string) & "/" & currentPhoto & ".jpg"
        
        set picture of item counter of displays to POSIX file wallpaper
        
    end try
    
end repeat

这里咱们获取到所有的显示器实例。并按先前筹备好的图片门路对每个不同的显示器设置不同的图片。

大抵上,到这脚本就筹备好了。如果有图片资源就能够试着手动跑一下了。在 Applescript 编辑器外面间接运行就能够了。自带的编辑器叫 Script Editor. 用 Spotlight 就能找到。

或者你曾经保留了脚本的话,也能够间接在命令行里用命令运行。

osascript ~/Pictures/Wallpapers/Wallpaper.scpt

如果运行有问题能够加个 log xxx 就能够打印日志调试。

当初咱们有了图片和脚本。接下来就是要让他自已动起来。总不能咱们人工地隔一段时间就开个编辑器运行一下吧🤣🤣

3. Launchctl

那么 Lauchctl 是什么呢?

Launchctl 是 Mac OS X 10.4 当前引进的一个对立的服务治理框架,能够启动、进行和治理守护过程、应用程序、过程和脚本等。他是通过 plist 配置文件来指定执行周期和工作的。

次要的搁置 plist 的中央有:

~/Library/LaunchAgents           # 以后用户定义的工作
 /Library/LaunchAgents           # 系统管理员定义的工作
 /Library/LaunchDaemons          # 管理员定义的零碎守护过程工作
 /System/Library/LaunchAgents    # 苹果定义的工作
 /System/Library/LaunchDaemons   # 苹果定义的零碎守护过程工作 

如果你相熟 Crontab, 那总体上它们就是相似的。plist 文件的可设置内容很多,用的是 xml 语言。如果有趣味能够自行理解更多,上面我只讲下咱们在这个例子中须要用到的设置项。

咱们到 ~/Library/LaunchAgents 下新建一个文件:

<!-- ~/Library/LaunchAgents/me.dynamic.wallpaper.plist -->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <!-- Label 惟一的标识 -->
    <key>Label</key>
    <string>me.dynamic.wallpaper.plist</string>

    <!-- 指定要运行的脚本 -->
    <key>ProgramArguments</key>
    <array>
        <string>/usr/bin/osascript</string>
        <string>/Users/pulsgarney/Pictures/Wallpapers/Wallpaper.scpt</string>
    </array>

    <!-- 指定运行的工夫 -->
    <key>StartCalendarInterval</key>
    <dict>
        <key>Minute</key>
        <integer>0</integer>
    </dict>
</dict>
</plist>

下面咱们这个文件定义了咱们用 osascript 去跑咱们后面写好的脚本。每个小时的第 1 分钟开始时就跑一次,也就是一天 24 次。如果你的脚本有问题不能失常运行能够加上上面这两句打下日志以不便调试。

    <!-- 规范输入文件 -->
    <key>StandardOutPath</key>
    <string>/Users/pulsgarney/Pictures/Wallpapers/log/output.log</string>

    <!-- 规范谬误输入文件,谬误日志 -->
    <key>StandardErrorPath</key>
    <string>/Users/pulsgarney/Pictures/Wallpapers/log/error.log</string>

如果你想要它刷新的频率更高,能够加上这句让它定时刷新,单位为秒:

    <!-- 工夫距离 -->
    <key>StartInterval</key>
    <integer>300</integer>

接下来,咱们就能够在命令行下加载这个工作了。

# 加载工作
launchctl load me.dynamic.wallpaper.plist
# 卸载工作
launchctl unload me.dynamic.wallpaper.plist

# 不论文件的工夫设置,马上运行一次工作
launchctl start me.dynamic.wallpaper.plist

如果一切正常,那么在 load 完后,每个小时都会主动更换壁纸。而且,用 Lauchctl 比 Crontab 有劣势的一点就是:在你电脑没有在工作时所触发的工作它会在你从新运行电脑后整合成一个工作跑一次。

这个利用场景次要是比方我用完了电脑合上了屏幕,下次我关上它时,无论什么工夫,只有我屏幕一打开它就会更新我的壁纸,能够防止你中午凌晨关上电脑后果你壁纸显示的是下午两三点大太阳的壁纸一亮屏就把人给送走了的懊恼。

明天就聊到这,掰~

正文完
 0