Alfred

        用Mac的人应该大多都知道这个,但是workflow工作流,应该是很多人没自己写过,得知支持Python脚本后,自己花了几个小时研究了一下如何把接口融合到Alfred快捷方式中,这里给大家提供一个模板,以这样的形式,无论是免费api还是自己封装的工具接口,均可集成到Alfred中!

效果图

在这里插入图片描述
在这里插入图片描述

申请接口

        市面上有很多免费接口,这里以聚合数据的头条新闻api为例,链接:https://www.juhe.cn/docs/api/id/235,在官网注册申请api即可,得到一个key,发送请求参数时带上key和其他参数即可。

Workflow

建立空白workflow

在这里插入图片描述
在这里插入图片描述
填上基本信息即可,也可以设置一个图标
再在里面空白处右键选择script filter
在这里插入图片描述
在这里插入图片描述

在script filter里面,我们去运行Python脚本,接受的参数就是”{query}”可以进行传参,这里采用了一个免费的头条新闻api,只要接口能测成功即可,不赘述:
在这里插入图片描述

Python代码,整体思路就是,定义好获取接口数据的方法,并将结果返回给workflow的具体字段即可:

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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# -*- coding: utf-8 -*-
"""
-------------------------------------------------
Project Name: alfredProjects
File Name: alfredTest.py
Author: apple
Create Date: 2021/6/28
-------------------------------------------------
"""
# coding: utf-8
from workflow import Workflow, web, ICON_WEB
import sys

reload(sys)

sys.setdefaultencoding('utf8')

query_map = dict(
inner=u"输入in搜索头条国内新闻",
outter='输入out搜索头条国际新闻',
top=u'输入top搜索热点新闻'
)


def get_recent_news(query):
if query == "in":
url = "http://v.juhe.cn/toutiao/index?"
params = {"key": "dd0fb509ac5407213bc6a0fddd48f234",
"type": "guonei"}
elif query == "out":
url = "http://v.juhe.cn/toutiao/index?"
params = {"key": "dd0fb509ac5407213bc6a0fddd48f234",
"type": "guoji"}
elif query == "top":
url = "http://v.juhe.cn/toutiao/index?"
params = {"key": "dd0fb509ac5407213bc6a0fddd48f234",
"type": "top"}

r = web.post(url, data=params)
print(r)
# throw an error if request failed, Workflow will catch this and show
# it to the user
r.raise_for_status()
# result = r.json()
return r.json()["result"]['data']


def main(wf):
query = wf.args[0]
if not query:
for key in ["inner", "outter", "top"]:
wf.add_item(
title=query_map[key],
valid=True,
)
else:
def wrapper():
return get_recent_news(query)

news = wf.cached_data(query, wrapper, max_age=300)
# news = get_recent_news(query)
for r in news:
wf.add_item(title=u"【{}】{}".format(r["author_name"], r['title']),
arg=r['url'],
valid=True,
icon=ICON_WEB)
# Send output to Alfred. You can only call this once.
# Well, you *can* call it multiple times, but Alfred won't be listening
# any more...
wf.send_feedback()


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

最后说一下脚本和相关库放在哪里:
在这里插入图片描述

点击后,会在finder显示该工作流的文件夹,将workflow库以及Python脚本放在此下即可:
在这里插入图片描述

跳转页面

        由于返回的json数据里面,每个新闻有个url,我们将url设为workflow的item args即可,代码片段:

1
2
3
4
wf.add_item(title=u"【{}】{}".format(r["author_name"], r['title']),
arg=r['url'],
valid=True,
icon=ICON_WEB)

再在script filter之后接一个url即可:
在这里插入图片描述