Alfred-Python-Tutorial
2016年05月23日

Alfred不再多说,试用一次之后,直接32欧上了Mega授权,杀器其实是Alfred Workflow,配置action,filter,可以有无限可能的操作。这里把deanishe上的Python写Afred Workflow的入门翻译一下放在这里,但是国内pinboard用的不多,这里用V2ex提供的最新主题列表的API,通过Alfred获取V2ex上的最新主题列表,来“本土化”翻译一下deanishe网站上的Python写workflow的入门。Alfred Workflow支持多种脚本语言编写,完全可以使用自己擅长的脚本来写。

Alfred Workflow支持多种脚本语言编写:bash,zsh,php,python,ruby,applescript,perl

下面按步用Python来做一个简单的的workflow。

创建一个新的Workflow

首先打开Alfred的首首选项(Preference), 切换到Workflow页签下。

如上图点击加号创建一个空白的workflow(Blank Workflow)。

为新创建的空白Workflow添加必要的描述

点击创建当弹出Workflow的信息面板时,这里就要给你要创建的Workflow添加名称Bundle Id,还有可选的对workflow的简要描述。

Bundle Id是必须要填写的,因为在Aldred 和 Alfred Workflow内部需要依赖这个Bundle Id来唯一区分你这个Alfred Workflow,没有这个Bundle Id,Alfred Workflow就不能正常运行了。

除了这些必要的信息,还可以拖拽一图片到左侧的Icon区域,这会让你的Workflow看起来更漂亮些(这个icon会在Alfred Workflow的每条结果中显示出来)。

加入Script Filter(脚本过滤器)组件

下一步就是加入一个Script Filter(翻译成”脚本过滤器”),Script Filter接收Alfred的输入内容(即用户输入的查询内容)并将结果列表返回给Alfred。这个Script Filter(内部代码实现)需要尽可能的快速执行,因为用户每在Alfred的搜索框内输入一个字符都会调用执行一次这个Script Filter:

接下来点击这个Script Filter组件,为其加入更详细的信息。(Escaping选项暂时不必理会,这个Workflow不会接收查询)

想一个关键词,这个Keyword(关键词)的作用就是在你打开Alfred搜索框输入这个关键词的时候就会激活这个Workflow,现这个Workflow不接收任何参数,这里填No Argument,这个PlaceHolder Title(占位标题)Subtext的作用就是在你输入Keyword(关键词)的过程中会显示出来(也就是用作提示的)。

“请稍等”这个提示是在你的Workflow工作的时候显示出来的(表明Workflow正在做相关的查询或者操作,这个例子里就是正在从网上的V2ex网站请求数据)。

非常重要的一点,设置Language(脚本语言)时,选择/bin/bash,并且在Script文本框里填写:

1
python v2ex_new.py

马上我们就会创建v2ex_new.py这个脚本文件,Escaping选项暂时不用管,这个例子里不会接收参数。

你也可以选择Language为/use/bin/python,并把实现的python代码粘贴到Script文本框里,但是这并不是最好的方法。

如果这样做(指粘贴Python代码到Script对应的文本框里),你就不能在终端里运行代码了,而且你也不能用一个顺手的编辑器,这样调试代码会非常困难。Python会告诉你哪一行代码出错,但是在Alfred的Script文本框里并没有行数标识,这样就凭空多出很多额外工作。

到这Alfred已经创建出来了Workflow,我们可以打开它并加入我们的脚本代码了,在左侧Workflow列表中右击你刚创建的Workflow,选择Open in Finder

打开目录会看到一个或者二个文件(取决于你之前是否拖拽了Icon图标)

此时需要从Github下载一个叫Afred-Workflow的包,拷贝解压到当前的Workflow目录

现在可以开始写代码了^_^

编写Python脚本

使用文本编辑器在当前的Workflow文件夹下创建v2ex_new.py并保存,向v2ex_new.py加下以下代码

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
# encoding: utf-8

import sys
from workflow import Workflow, ICON_WEB, web


def main(wf):
url = 'https://www.v2ex.com/api/topics/latest.json'
r = web.get(url, None)

# throw an error if request failed
# Workflow will catch this and show it to the user
r.raise_for_status()

# Parse the JSON returned by pinboard and extract the posts
result = r.json()

for post in result:
wf.add_item(title=post['title'],
subtitle=post['content'],
icon=None)

# Send the results to Alfred as XML
wf.send_feedback()


if __name__ == u"__main__":
wf = Workflow()
sys.exit(wf.run(main))

好,一切就绪,我们的Alfred Workflow应该可以工作了,打开Alfred搜索框,输入v2exnew并回车。你会看到如下界面:

可能会像下面这样发生错误

如果Alfred没有展示任何结果,那可能是Python脚本没有完全执行,在终端中打开Workflow的文件夹,使用如下命令运行Python脚本,应该会发现错误信息。

继续加入Workflow动作(action)

现在我们可以看到v2ex网站上的最新主题列表了,但是我们只能看,不能对每条结果做任何事情,现在我们就要让这些结果条目带上”动作”(比如,在某条结果上按回车就会发生一些事情,在这个例子中,我们就在浏览器中打开应最新主题的页面)。在v2ex_new.py文件加入下面高亮的二行。

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
# encoding: utf-8

import sys
from workflow import Workflow, ICON_WEB, web


def main(wf):
url = 'https://www.v2ex.com/api/topics/latest.json'
r = web.get(url, None)

# throw an error if request failed
# Workflow will catch this and show it to the user
r.raise_for_status()

# Parse the JSON returned by pinboard and extract the posts
result = r.json()

for post in result:
wf.add_item(title=post['title'],
subtitle=post['content'],
arg=post['url'], # 新加入这二行
valid=True,
icon=None)

# Send the results to Alfred as XML
wf.send_feedback()


if __name__ == u"__main__":
wf = Workflow()
sys.exit(wf.run(main))

“valid=True”的意思就是告知Alred这条结果上的动作和对应的value值要传递给下一个action(动作),在这个例子里,就是URL。

此时再回到Alfred Preference(首选项) 面板切到Workflow界面,像添加ScriptFilter一样在Actions条目中找到Open URL,添加这个action:

详情界面在URL项中填入{query}(即上一步动作中传入的value值,就是对应主题的URL),下面还可以选项打开链接的浏览器。

这时把鼠标放到ScriptFilter上时就会在这个组件的右侧出现一个小的”突起”。

点住这个”突起”拖拽连接至Open URL动作上。

现在再次在Alfred中运行你的Workflow,选中任一一个结果并点击回车,对应的新主题就会在指定的浏览器中打开了。