因为 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'`;

参考