简介

Alfred作为Mac下排名第一的应用,功能极其强大,可以快速的搜索本地程序、使用搜索引擎搜索、查询词典、发送邮件、查找文件、剪贴板 管理、音乐控制等等功能。特别是V2版本新增了Workflow功能,全球各地的开发者为其创造了数百个workflow插件,更是极大地扩展和丰富了它的威力。

基础篇

Alfred可以用来做什么,可以直接替换掉系统自带的Spotlight吗?继续阅读之前,建议先看看这篇介绍文章

好了,看完Alfred的基础功能介绍,是不是瞬间那些Windows上的那些应用快速启动程序弱爆了?那下面就让我们看看有了Workflow之后还可以做什么?

进阶篇

deanisheAlfred Workflow添加了Python框架库支持,自定义Workflow仅需要通过Python完成输入和输出的转换,最后输出到Alfred即可。

我想写的第一个自定义Alfred Workflow是支持在Alfred中直接进行关键词搜索并直接展示搜索结果,那需要怎么完成呢?简单起见,第一个版本仅支持百度搜索。那么,就需要先通过Python语言完成百度搜索的关键词请求,对返回结果进行解析(包括搜索结果页标题、描述和链接),然后再通过以上的Python框架库将结果输出到Alfred中即可。

百度搜索解析

【1】首先,进行百度关键词搜索并解析结果格式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<div class="result c-container " id="2" srcid="1599" tpl="se_com_default"
data-click="{'rsv_bdr':'0' ,'rsv_cd':'pt:40520'}">
<h3 class="t">
<a class="favurl" style="background-image:url(http://t11.baidu.com/it/u=1884976882,3278791703&fm=58)"
fav-url="http://t11.baidu.com/it/u=1884976882,3278791703&fm=58" data-click="{
'F':'778317EA',
'F1':'9D73F1C4',
'F2':'4CA6DD6B',
'F3':'54E5A43F',
'T':'1408714037',
'y':'FBF3F4B7'
}" href="//www.baidu.com/link?url=KcDt3TeRrK8URziCD1sFtajJ9oLJSq-j5_WYXqhN0oa" target="_blank">
百度<em>新闻</em>搜索——全球最大的中文<em>新闻</em>平台
</a>
</h3>
<div class="c-abstract">
百度<em>新闻</em>是包含海量资讯的<em>新闻</em>服务平台,真实反映每时每刻的<em>新闻</em>热点。您可以搜索<em>新闻</em>事件、热点话题、人物动态、产品资讯等,快速了解它们的最新进展。
</div>
...

【2】接着就可以根据搜索结果尝试编码:

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
# encoding: utf-8
import requests
from BeautifulSoup import *
def search(key):
# 百度搜索网址,可能需要加入搜索请求来源混淆,避免百度屏蔽
search_url = 'http://www.baidu.com/s?wd=key'
# 获取搜索结果
req = requests.get(search_url.replace('key', key))
soup = BeautifulSoup(req.content)
# 解析搜索结果
tables = soup.findAll('div', {'class': 'result c-container '})
results = []
for table in tables:
part1 = table.find(attrs={'class': 't'})
title = removeTag(part1.a.renderContents(), '<em>')
url = part1.a['href']
part2 = table.find('div', {'class': 'c-abstract'})
desc = removeTag(part2.renderContents(), '<em>')
results.append((title, url, desc))
print '标题:{0}\n描述:{1}\n链接:{2}\n'.format(title, desc, url)
return results
def removeTag(text, tag):
'''去除搜索结果的标签符号,比如强调符号em'''
return text.replace(tag, '').replace(tag[0:1] + '/' + tag[1:], '')
if __name__=='__main__':
search('新闻')

整合Workflow流程

【1】新建空白Workflow

【2】编辑Workflow描述信息

【3】创建Script输入

【4】编辑Script信息

【5】基于Workflow Python框架进行编码:

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
# encoding: utf-8
from workflow import Workflow, ICON_WEB, web
from BeautifulSoup import *
import sys
def request_baidu_search(query):
url = u'http://www.baidu.com/s'
r = web.get(url, {'wd': query})
r.raise_for_status()
return parse_baidu_results(BeautifulSoup(r.content))
def parse_baidu_results(soup):
tables = soup.findAll('div', {'class': 'result c-container '})
results = []
for table in tables:
part1 = table.find(attrs={'class': 't'})
title = part1.a.renderContents()
title = wf.decode(removeTag(title, 'em'))
# 使用wf.logger或者print(text, file=sys.stderr)来打印log,否则会打乱从标准输出获取的XML内容
wf.logger.debug(title)
url = u'http:' + wf.decode(part1.a['href'])
part2 = table.find('div', {'class': 'c-abstract'})
desc = part2.renderContents()
desc = wf.decode(removeTag(desc, 'em'))
results.append((title, desc, url))
return results
def removeTag(text, tag):
'''去除搜索结果的标签符号,比如强调符号em'''
startTag = '<' + tag + '>'
endTag = '</' + tag + '>'
return text.replace(startTag, '').replace(endTag, '')
def main(wf):
query = wf.args[0]
def wrapper():
return request_baidu_search(query)
results = wf.cached_data(u'results' + query, wrapper, max_age=60)
for result in results:
wf.add_item(
title = result[0],
subtitle = result[1],
arg = result[2],
valid = True,
icon = ICON_WEB)
wf.send_feedback()
if __name__ == '__main__':
wf = Workflow()
sys.exit(wf.run(main))

【6】运行测试,如果出错可以选择Debug

测试结果如图:

【7】为搜索结果添加打开网页动作,这样点击搜索结果项就可以跳到链接详情:

于是,第一个Alfred Workflow就完成了,后续再进行进一步的优化吧,待续~~

附Workflow参考链接

Alfred Workflow Libraries and Helpers
Alfred Workflow List
Alfred Forum

留言