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的具体字段即可:
# -*- 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即可,代码片段:
wf.add_item(title=u"【{}】{}".format(r["author_name"], r['title']),
arg=r['url'],
valid=True,
icon=ICON_WEB)
再在script filter之后接一个url即可: