如何去写一个第三方的 workflow
学习一下 Mac 下的 workflow 开发流程。地址在这里。
更新
- workflow for Gank 获取 Gank 当日开发干货
- workflow for YouDao 获取中文对应的英文翻译
- workflow for V2ex 获取 V2ex 当日最热 10 条帖子
准备
- 购买了 Powerpack 的 Alfred 或者破解版的 Alfred workflow
- 利用 Python 编写脚本的教程:Alfred-Workflow
- 会 Python 编程
说明
我们跟随上面提供的教程可以进行一个初步的学习,并且上述的教程图片和流程都挺清晰的,可是教程却选择了一个付费的示例,使得不能继续跟下去学习,所以在了解了大概开发流程之后,并没有选择教程所提供的示例练习。
想起来之前一个潇大写过 Gank 的 workflow,就下载下来,使用了一下,发现确实可以用,但是有可能接口平台的原因,数据有时候能显示,有时候却不能。但是由于道理是相通的,所以作为入门级教程,我们首先就模拟一下 Gank 的 workflow 的开发过程。潇大的 workflow 地址在这里:Gank-workflow。学习成果的 workflow 在这里:Vino-workflow
开始
如下图所示选择到指定位置,点击 Help 按钮:
选择 Blank Workflow,并填写好相关信息:
点击 Create 之后,如下图所示,右击添加一个 workflow object:
右击之后选择 Input 选项中的 Script Filter 选项:
然后我们继续在下图填写相关信息,keyword 为搜索触发词,接下来三个选项就不是很重要了,一些描述性内容。接着选择 Language 选项,我们选择 /bin/bash,故名思议,能够执行脚本性语言,接着在同一行,我们选择 with input as {query}。这里我猜想是需要输入查询关键词所需要的选项吧。在 Script 中输入 pythongank.py "{query}"
:
完成上述步骤后,如下图所示,右击,选择在 Finder 中打开:
会发现默认情况下存在 info.plist 文件。接着我们创建 gank.py 文件,没错,这个就是前面输入的名称,一定要确保一致性。然后,我们在 Alfred-workflow 这个页面下载最新的文件,解压复制其中的 workflow 文件夹到并且粘贴到下面的目录中,另外为了让 workflow 更好看,可以自定义图片 Icon,当然可以随着 Item类型不同选择多种类型的 Item Icon:
紧接着,我们就编写 gank.py 文件了。这个在最后的步骤贴出。
为了能够在 workflow 的 list 中,跳转到指定 Item 所对应的 URL 页面中,我们还需要给 script 添加一个Actions URL,如下所示,选择 Open URL。当然在这一步,我们有更为丰富的选择,如,我们可以选择复制 Item 的内容到剪贴板,就可以选择 Outputs 中的相应的选项:
添加之后,默认配置如下即可,点击 Save :
接下来,我们就要连接工作流啦,如下图所示,用一条线连接 Script Filter 和 Open URL :
如上,基本整个流程就完毕了,双击 command 打开 Alfred ,输入触发词,即可:
代码
如下即为 Gank workflow 的核心代码,我们分段解读一下:
def search(query):
# search the ganks from gank.io
url = 'http://gankio.herokuapp.com/search'
# query 即为查询关键词,指定 API 接口返回 Json 数据
params = dict(keyword=query)
r = web.post(url, params)
# throw an error if request failed, Workflow will catch this and show it to the user
r.raise_for_status()
return r.json()
程序的主函数如下所示:
def main(wf):
# 获取查询关键字
query = wf.args[0]
# Search ganks or load from cached data, 10 mins
def wrapper():
return search(query)
# 对于搜索接口存在缓存时间
ganks = wf.cached_data(query, wrapper, max_age=600)
# Parse the JSON returned by pinboard and extract the ganks
for gank in ganks:
wf.add_item(title=gank['title'],
subtitle=gank['source'],
arg=gank['url'],
valid=True,
icon=ICON_DEFAULT)
# 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()
对于 Python 文件的编写,在我们引入了 Python 相应的类库之后,就变得模式很固定化了,甚至可以说,只是去解析一些 Json 数据,填写一些 Item 而已。
进阶
如上作者的版本已经得到证明接口不稳定了,而 Gank 官方也提供了更好的 API 接口,我们就来磨磨刀,练练手吧。
- 选择 Gank 的今日干货接口 http://gank.io/api/day/2015/08/07 点击查看一下 Json 数据,熟悉下格式;
- 此处跟上面的搜索 wf 不一样,这里只需要触发词:gt 即可。我们在 keyword 之后选择:No Argument 。这样在 wf 输入框内输入:gt 之后即可列出今日 gank 的干货列表:
其余创建流程都跟上面一样的,重点还是 Gank.py 文件的编写;
请求数据以及解析的函数如下所示:
# 加载今天的干货列表 def today(): ganks = [] url = 'http://gank.io/api/day/' + datetime.datetime.now().strftime("%Y/%m/%d") r = web.get(url) # 错误提示 r.raise_for_status() # 返回 json 数据 data = r.json() # 解析数据 results = data['results'] categories = data['category'] results = data['results'] for category in categories: for gank in results[category]: ganks.append(gank) return ganks
Main 函数如下所示:
def main(wf): # 请求数据 ganks = wf.cached_data('today', today, max_age=60) # 请求时机不对 if len(ganks) <= 0: wf.add_item(title=u'今天还没发干货', valid=True, icon=ICON_DEFAULT) # 添加 item 到 workflow 列表 for gank in ganks: sub = gank['type'] wf.add_item(title=gank['desc'], subtitle=sub, # 注释一 arg=gank['url'], valid=True, icon=ICON_DEFAULT) # feedback wf.send_feedback()
使用方式,如下图所示,输入触发词 gt,即可获取当天的 Gank 干货列表:
为了能跳转到指定干货页面,我们再添加一个 workflow 连线以及结合上述代码注释一处:
好了,以上就是开发一个 workflow 的大概流程,我们选择的语言是 Python,当然其他语言也是可以的,我在网上看了看,我写的这篇文章应该是比较全面的中文开发 workflow 的教程。虽然过程很简单,嘿嘿。
Thanks for reading !!!
Ps:有没有人要收实习啊?