0%

如何在Alfred里使用python创建Script Filter

图源:官方文档

我首次购买的来自大厂的效率应用即是Alfred。它的社区十分成熟,围绕它开发的资源数不胜数,我几乎不用自己研究,直接从网上就能找到符合我需求的workflow。

若干年之后我购买了Keyboard Maestro,这个KM也有个类似Alfred的“搜索框”(见下图),且对我而言更重要的是,在KM里编辑Macro要比Alfred里编辑workflow要直观、容易得多,主要有以下几点原因:

  • 首先,它的Maco编辑是类似iOS/iPadOS中快捷指令式的模块组合,非常直观
  • 其次,KM具有更详细的说明文档,以及一个十分活跃的forum
  • 此外,KM对变量的管理非常容易理解,在偏好设置里有个专门分区进行各种变量的储存
  • Last but not least,它支持我最钟情AppleScript语言的语法高亮(在Alfred里编辑AppleScript可太难受了,既没有自动缩进也没有语法高亮)

于是,我开始思考,除了UI比较讨喜并且可以自定义之外,Alfred的优势究竟在哪里?直到最近我才发现——Script Filter即是答案。

KM的搜索框

首先我们要知道,Alfred是一种选单结构,选单里的每个条目,都能显示一定的信息(主副标题、图标等),当然还有你看不到的选中之后的供下一步操作的输出值(Alfred里叫做query)。

于是,如果简单描述,Script Filter可以让你利用一些脚本语言自定义一系列选单条目:包括它的显示内容及每个条目的query。所谓自定义,我比较熟悉的做法是用python脚本输出json格式的条目信息,这是本文希望向读者阐述清楚的内容。

官方Script Filter示例

步骤

首先,新建一个空的workflow,并右键空白处→Inputs→Script Filter新建一个Script Filter模块

然后,右键点击左栏中的workflow,选择Open in Finder,

这样会打开这个workflow所在的根目录,在该目录中建立myscript.py文件,文件内容如下:

这个results变量是一个dict,其中只有一个键值对,"items"的值是一系列会显示在Alfred选单里的条目,条目的数据类型为dict,其中不同的键对应着条目的不同属性。你需要用json.dumps将其转换成json格式,再print出来,相应的内容就会像下图那样显示在Alfred的结果里了。

上面涉及到的titlesubtitlearg是最基本的几个键,你可以在这个页面下找到官方支持的所有键。这三个键的前两个是主副标题,最后一个arg则是会进入workflow下一步操作的输出值query。在这个例子中,两个条目的输出值都是一个网址,如果我把这个Script Filter连接上一个Open URL的操作(见下图),并指定URL为{query}。那么当我选中一个条目,就会打开对应的网址。

以此类推,如果你是位python大神,可以很容易通过Script Filter让Alfred显示出更加复杂多样的内容。

我利用Script Filter做了啥?

对我而言,Script Filter配合python最佳用法自然就是爬虫了。我的工作需要频繁访问一个网页端数据库,其中有1000多个条目。

利用Script Filter我可以在不打开浏览器的情况下搜索并直接打开其中一个条目。