Spotlight 替代 Alfred
因为 alfred 脚本的维护比较麻烦,输入输出虽然也是 stdin 和 stdout ,但总体开发和维护体验并不友好,还需要做 alfred 特定的格式化输出,所以决定使用 spotlight 替代 alfred,并用标准 shell 脚本来解决维护成本的问题。
可行性
spotlight 搜索可行性和他的边界问题。目前 spotlight 仅支持文件级别的搜索,不支持参数输入,所以,需要迁移到 shell 中进行输入。
spotlight 唤起 shell 的方式,可参考 how-to-run-a-shell-script-using-spotlight
新建一个 shell 脚本,并以 .command
结尾即可,例如:
#!/usr/bin/env sh
echo "hello spotlight"
配合 zx 脚本
因为工作目录的问题,参考 how-to-get-absolute-path-name-of-shell-script-on-macos,获取当前路径,并使用 zx 来执行脚本逻辑。
#!/usr/bin/env sh
echo "hello spotlight"
# ABSPATH=$(cd "$(dirname "$0")"; pwd -P)
# zx $ABSPATH/hello.mjs
cd "$(dirname "$0")"
PATH=$PATH:./node_modules/.bin
zx ./hello.mjs
# 需要立即关闭当前窗口的,执行下述代码,不需要的,则注释即可
osascript -e 'tell application "Terminal" to close (every window whose name contains "cli-hello.command")' &
编写 zx 脚本逻辑
#!/usr/bin/env zx
const res = await fetch('https://httpbin.org/get').then(d => d.json());
$`echo '${JSON.stringify(res)}'`
fetch with local cookies
import request from 'request'
import chrome from 'chrome-cookies-secure'
function fetchWithLocalCookie (url) {
const urlObj = new URL(url)
return new Promise(resolve => {
chrome.getCookies(urlObj.origin, 'jar', function (err, jar) {
request(
{
url,
jar: jar
},
function (err, response, body) {
if (err) {
return reject(err)
}
resolve(body)
}
)
})
})
}
chrome 相关操作
// 当前页面地址
const url = String(
await $`osascript -e 'tell application "Google Chrome" to return URL of active tab of front window'`
);
// 当前页面源码
const source = String(
await $`osascript -e 'tell application "Google Chrome"' -e 'tell active tab of window 1' -e 'set sourcehtml to execute javascript "document.body.parentNode.outerHTML"' -e 'end tell' -e 'end tell'`
);
// 执行脚本
await $`sleep 1 && osascript -e 'tell application "Google Chrome"' -e 'tell active tab of window 1' -e 'set sourcehtml to execute javascript "document.forms[0].orderId.value = \\"${orderId.value}\\";document.forms[0].submit();"' -e 'end tell' -e 'end tell'`
// 登录操作提示
// 未登录处理
await $`open https://xxx.com`;
await $`sleep 3`;
await $`osascript -e 'tell application "Google Chrome"' -e 'tell active tab of window 1' -e 'set sourcehtml to execute javascript "alert(\\"重新登录 xxx 后,请重新执行脚本\\")"' -e 'end tell' -e 'end tell'`;
参考
- 获取 chrome 信息:https://github.com/prasmussen/chrome-cli
- 登录态请求:https://github.com/bertrandom/chrome-cookies-secure
- zx nodejs 脚本:https://github.com/google/zx
- cli 搜索:https://github.com/mokkabonna/inquirer-autocomplete-prompt
- prompts: https://github.com/terkelg/prompts
- spinner: https://github.com/sindresorhus/ora
- cli-spinner: https://github.com/sindresorhus/cli-spinners