每天要在 Skype 准时发送消息,有没有什么方法可以让设备自动去执行定时发布消息呢?

大概思路:

  1. 打开 Skype 指定用户的对话界面。
  2. 发送指定内容。
  3. 定时发送。

在微软的官网上查到一个关于 Skype URI API 的介绍。简单的看了一下,使用以下方法调用 Skype 打开指定用户的对话界面。代码如下:

skype:用户ID?chat

接下来要解决的是发送指定内容的问题。这里我打算使用 AppleScript + Shell 来实现这个功能。
大概思路:复制指定内容到剪切板,打开 Skype 指定用户对话框,粘贴,发送。在 Mac 中 pbcopy 命令负责将内容复制到剪切板。

echo "自定义内容" | pbcopy

不过在 AppleScript 需要调用 Terminal 来运行,将内容复制到剪切板后再关闭 Terminal。

tell application "Terminal"
     do script "echo \"自定义内容\" | pbcopy"
     do script "killall Terminal"
end tell

这里解释一下 \",因为在 AppleScript 中 do script 已经使用了",那么在引号里面使用引号需要使用转义字符。然后再打开指定用户的对话界面,使用 open 命令来打开链接,然后就会跳转到 Skype 应用程序内了。

do shell script "skype:用户ID?chat"

do shell script 和 do script 有些不同,do shell script 不需要调用 Terminal 即可运行,但是 do script 就需要调用 Terminal 后运行,这里就不过多细说了。最后再使用 keystroke 模拟键盘操作粘贴和回车键。这里需要调用 System Events,然后使用 keystroke "v" using command down,模拟 Command + V 操作,最后使用 key code 36 模拟回车键操作。代码如下:

tell application "System Events"
     delay 0.3
     keystroke "v" using command down
     delay 0.3
     key code 36
end tell

这里解释一下 delay,需要设置延时,如果操作太快,界面还没跳转过来,就进行下面的操作,这样整个流程就会出现问题。

最后要解决定时发送的问题。可以做一个守护进程,设置好时间,然后用 launchctl 启用即可。

<key>StartCalendarInterval</key>
    <dict>
        <key>Minute</key>
        <integer>分钟</integer>
        <key>Hour</key>
        <integer>小时</integer>
    </dict>

这里有个地方需要注意一下,需要调用 AppleScript 输出程序的路径,如果单单调用 AppleScript 是无法直接使用的,需要把 AppleScript 输出为应用程序后再使用。完整代码 --> Github