hammerspoon是MacOS系统下一款实现自动化的工具,通过lua脚本扩展系统功能。相比其他通过python脚本,nodejs脚本或原生的automator, hammerspoon更加简单,提示框界面美观。也可以使用python和pync库实现监控通知,nodejs和node-notifier组件实现通知的方案。毕竟工具的自动化是提高生产力的必要因素。

#配置

hammerspoon可以使用brew安装,也可以直接在官网下载二进制文件

1
2
3
4
5
#github下载页面
https://github.com/Hammerspoon/hammerspoon/releases

#brew安装
brew install hammerspoon

安装完成后,在启动台中可以看到已安装的hammerspoon图标, MacOS的菜单栏上会显示一个锤子图标。

hammerspoon默认配置文件是~/.hammerspoon/init.lua

配置文件目录

1
2
3
4
5
6
.hammerspoon
├── Spoons
├── init.lua
└── weather
└── weather.lua

#功能

在hammerspoon文档中,支持运行应用、电池管理、window窗口管理、对话框、网络管理等等功能;其中hammerspoon提供了一个hs.http库用来实现http相关请求功能。

天气功能为示例来了解hammerspoon使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
-- 编辑weather/weather.lua
-- 天气接口使用tianqiapi免费接口, 需要简单注册获取ID及密码
local urlApi = 'https://www.tianqiapi.com/api/?version=v1&appid=申请ID&appsecret=申请密码'
local menubar = hs.menubar.new()
local menuData = {}

-- 天气图标
local weaEmoji = {
lei = '⛈',
qing = '☀️',
shachen = '😷',
wu = '🌫',
xue = '❄️',
yu = '🌧',
yujiaxue = '🌨',
yun = '☁️',
zhenyu = '🌧',
yin = '⛅️',
default = ''
}

function updateMenubar()
menubar:setTooltip("天气预报")
menubar:setMenu(menuData)
end

function getWeather()
-- 请求API接口
hs.http.doAsyncRequest(urlApi, "GET", nil,nil, function(code, body, htable)
if code ~= 200 then
print('get weather error:'..code)
return
end
rawjson = hs.json.decode(body)
city = rawjson.city
menuData = {}
-- 处理数据,更新到菜单栏里
for k, v in pairs(rawjson.data) do
if k == 1 then
menubar:setTitle(weaEmoji[v.wea_img])
titlestr = string.format("%s %s %s 🌡️%s 💧%s 💨%s 🌬 %s %s", city,weaEmoji[v.wea_img],v.day, v.tem, v.humidity, v.air, v.win_speed, v.wea)
item = { title = titlestr }
table.insert(menuData, item)
table.insert(menuData, {title = '-'})
else
-- titlestr = string.format("%s %s %s %s", v.day, v.wea, v.tem, v.win_speed)
titlestr = string.format("%s %s %s 🌡️%s 🌬%s %s", city, weaEmoji[v.wea_img],v.day, v.tem, v.win_speed, v.wea)
item = { title = titlestr }
table.insert(menuData, item)
end
end
updateMenubar()
end)
end

menubar:setTitle('⌛')
getWeather()
updateMenubar()
-- 定时任务
hs.timer.doEvery(3600, getWeather)

示例二:定时获取股票行情

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
-- 相关代码已更新到Github

local XQAPI = ""
local menubar = hs.menubar.new()
local menuData = {}


local stockList = 'SH000001'

function updateMenubar()
menubar:setMenu(menuData)
end

function getStock(fisrt)
fisrt = fisrt or false

-- 请求服务
api = string.format("%s/?symbol=%s", XQAPI, stockList)
hs.http.doAsyncRequest(api, "GET", nil, headers, function(code, body, htable)
if code ~= 200 then
print('获取数据错误:'..code)
return
end
menuData = {}

rawjson = hs.json.decode(body)
for k, v in pairs(rawjson.data) do
-- 菜单样式
titles = string.format("🇨🇳%s ¥%s 🚀%s 👆%s 👇︎%s 🚗%s 💰%.3f/亿 🤝%s",
v.symbol, v.current, v.percent..'%', v.high, v.low, v.open, v.amount/100000000, v.turnover_rate..'%'
)
table.insert(menuData, {title = titles})
end
updateMenubar()
end)
end

menubar:setTitle('🚨')
getStock(true)
updateMenubar()
hs.timer.doEvery(600, getStock)

hammerspoon可以实现自动化功能还有很多,仅通过hs.httphs.timer功能就可以监控实时某些服务稳定性,怎么玩出花样还是依赖各位看官们的脑洞了 :)

#参考

hammerspoon官方文档
hammerspoon awsome项目
lua十分钟教程

评论