使用 AppleScript 制作自动脚本发布 Hexo

由于域名备案前,年轻地买了阿里云的云虚拟主机,然后想想换成云服务器 ECS 成本有点高啊(帮主大大梁杰同学安利了一波云服务器是如何自由度高、如何 ssh 上去操作、如何 cron 定时,然而说白了我穷啊=。=)。那就只能曲线救国,既然没有服务器也不能在服务器上设置定时任务,那就只能在本地搞一个自动脚本来降低每次操作的成本了,Mac OSX 上就来试试 AppleScript 咯。

半自动化的 Hexo 方案

  1. 由于阿里云的云虚拟主机只能用 FTP 上传网站,那就在本地开一个 FTP 定时上传 Hexo 网站的 public 文件夹到虚拟主机(LINUX 操作系统上传到 /htdocs 目录,Windows 操作系统上传到根目录)。

  2. Hexo 的添加文章以及发布操作可以使用 AppleScript 写的脚本来自动完成。

FTP 定时上传

找到一款开源的 FTP 工具:FTPbox

它有这些功能是我这边比较看中的:

  1. FTP 上传(最基本的功能了)

  2. FTP 选择性同步的功能(过滤一些 logreportreport 等对于 Hexo 无用的文件夹,且能避免因同步方向没设置对而导致同步错乱的情况)

  3. 可以设置同步的方向(我只需要将本地 public 文件夹里的所有文件上传即可,故选择 local to remote only 模式)

  4. 可以设置同步的周期(类似于服务器端的 cron 任务)

缺点很明显,还不算致命吧:

目前只有 Windows 版本!!!

Mac OSX Coming soon…

AppleScript 脚本

起因

AppleScript 是 Mac OS X 内置的一种功能强大的脚本语言,可以使用 AppleScript 把一些重复繁琐并且耗费时间的任务自动化,比如,我们需要创建一篇 Hexo 的新文章时,需要如下步骤:

  1. 在终端中将当前目录改变到 Hexo 所在的根目录
  2. 执行 hexo new "对应的文章名称" 创建对应的文章

又比如,我们写完文章后,需要发布 Hexo ,需要如下步骤:

  1. 在终端中将当前目录改变到 Hexo 所在的根目录
  2. 执行 hexo clean 清除缓存,避免有些小改动不能提交
  3. 执行 hexo d -g 这一组合命令,生成并部署 Hexo,此时静态的网站就在 public 文件夹里了。

从上面两个例子中,不难看出重复或者部分重复的部分。

经过

经过一番搜索,找到了一个用 AppleScript 脚本来新建 Hexo 文章的代码,在这里,它将 Octopress 版本的脚本转成 Hexo 的了。为我这个新手提供了一个很好的参考,方便我快速仿写 AppleScript 脚本。

我用系统自带的脚本编辑器把其中的路径和 MarkDown 软件替换成自己的,添加注释并暴力地去掉了一些判断,把代码贴在下面了,也把代码段放在我的 Github 上了,再次感谢修改者 林木木 的这篇博客

1
2
3
4
5
6
7
8
9
10
11
12
13
-- 告诉 "Finder" 做好准备
tell application "Finder"
-- 启动当前应用 activate
-- 显示 dialog ,提示信息:"填入文章标题" 默认填充:"title" display dialog "填入文章标题" default answer "title"
-- 将输入的文本赋值给 postTitle 作为标题并返回 set postTitle to text returned of result as text end tell -- 告诉 "Terminal" 做好准备 tell application "Terminal"
-- 启动当前应用 activate
-- 判断当前是否有窗口打开 if (count of windows) is 0 then
-- 没有的话,告诉 "System Events" 做好准备 tell application "System Events"
-- 模拟按键 Command + N 新建一个窗口 keystroke "n" using {command down} end tell else activate end if
-- 暴力设置第一个窗口作为接下来要执行操作的窗口 set win to window [0]
-- 设置当前的 Tab set currentTab to selected tab of win -- 在当前 Tab 中执行改变目录的操作(需修改到自己的 Hexo 所在路径) do script "cd /Users/linus/hexo" in currentTab
-- 执行创建新文章的操作,传入之前输入的标题作为参数 do script "hexo new " & postTitle in currentTab
-- 延迟一秒 delay 1 -- 设置用 MacDown 打开对应路径的 md 文件 do script "open -a MacDown source/_posts/" & postTitle & ".md" in currentTab end tell

接下来就是依样画葫芦的改成发布 Hexo 的功能,相比之前需要文章名的变量,现在的更加简单。思路就是之前描述的过程,把它写成 AppleScript 版本即可,直接上代码吧,导师快要找我讨论了。

1
2
3
4
5
6
7
8
9
-- 告诉 "Terminal" 做好准备
tell application "Terminal"
-- 启动当前应用 activate
-- 暴力设置第一个窗口作为接下来要执行操作的窗口 set win to window [0]
-- 设置当前的 Tab set currentTab to selected tab of win
-- 在当前 Tab 中执行改变目录的操作(需修改到自己的 Hexo 所在路径) do script "cd /Users/linus/hexo" in currentTab
-- 执行清除缓存的操作 do script "hexo clean " in currentTab
-- 延迟一秒 delay 1
-- 执行生成并发布 Hexo 的操作 do script "hexo d -g " in currentTab end tell

收尾

将每个 AppleScript 脚本保存成脚本文件格式,后缀为.scpt,也就是我上传到 Github 的版本,便于之后修改;再将文件保存为应用程序格式,后缀为.app,也就是可以执行的应用程序了。

PS:
另存为应用程序格式时,不要勾选运行处理程序后保持打开,不然下一次要执行脚本的时候还要关闭再打开,就让它执行完脚本自己关闭吧。

PSS:
另存为应用程序格式后,图标都是一样,看起来多不爽,马上去学习如何修改应用程序的图标,随意搞了两张图,难看是难看了点,至少从图标上区分功能了吧。随意感受下。

AppleScript示意图

更新

使用 AppleScript 脚本创建 md 文件时,发现输入带有空格的文件名会导致终端无法识别的问题,通用的解决方案是将空格替换成其他符号,如-

1
-- 将 postTitle 变量中的空格替换成 "-" 
set {tid, AppleScript's text item delimiters} to {AppleScript's text item delimiters, " "}
set temp to text items of postTitle
set AppleScript's text item delimiters to "-"
set postTitle to temp as text
set AppleScript's text item delimiters to tid

完整的脚本代码可以到我的 Github 上查看或下载。

文章目录
  1. 1. 半自动化的 Hexo 方案
  2. 2. FTP 定时上传
  3. 3. AppleScript 脚本
    1. 3.1. 起因
    2. 3.2. 经过
    3. 3.3. 收尾
    4. 3.4. 更新