用 Python 写 Alfred3 workflow 插件,一个最小示例

以前一直在使用 Cerebro 作为效率工具(开源免费),但是 Cerebro 原作者似乎很久没有更新,今天抱着试一试的心态用了一把 Alfred 才发现,哎哟握草Alfred 优化了快速启动与搜索的功能,比 Cerebro 更加丝滑流畅,还引入了 Workflows 这个强大的扩展功能,用户可以用自己熟悉的语言比如 Python、JavaScript 和 Php 等来写 Wokflow。因此赋予了 Alfred 无限的可能性。

我查阅了一下 Alfred 的文档,发现添加一个 Workflow 插件竟是如此便捷。

背景

自己平时喜欢浏览 HackerNews,所以希望在 Alfred 里面快速浏览今天的热门新闻,搜了一下现成的 Alfred 的 HackerNews 插件,都十分老旧,好像都不能正常工作。照着 Alfred 官方文档,用 Python 简单写了个 Alfred-HackerNews,通过请求 API 获取 HackerNews 新闻。

使用截图

步骤

创建一个新 Workflow

  • 新建步骤推荐阅读: creating-a-new-workflow

  • http://www.deanishe.net/alfred-workflow/tutorial_1.html#creating-a-new-workflow

  • 设置关键词触发 Python 脚本,如图所示,当输入 hn 时,就可以执行 /usr/bin/python hn.py 这条 shell 指令,hn.py 就是需要编辑的 Python 文件。在这个 Workflow 中由于没有输入参数,所以我设置了 No Argument

使用 Alfred-Workflow 库

流程创建完毕后,就需要对代码进行编辑

  • 找到 Workflow 源码路径: 鼠标右键 Hacker-news,选择 Show in Finder,找到源码

  • 请求 api.hnpwa.com/v0 获取 HackerNews 数据

  • def get_top_news():
        base_url = 'https://api.hnpwa.com/v0/{name}/{page}.json'
        max_pages = 15
        name = 'news'
        result = []
        for page in range(1, max_pages):
            url = base_url.format(name=name, page=page)
            req = web.get(url)
            req.raise_for_status()
    
            if len(req.json()) == 0:
                break
            result = result + req.json()
        return result
    
  • 将数据封装成 xml 格式返回给 Alfred 进行显示

    def main(wf):
        posts = wf.cached_data('posts', get_top_news, max_age=60*60)
    
        # Loop through the returned posts and add an item for each to
        # the list of results for Alfred
        for post in posts:
            subtitle = "points: {points} | user: {user} | {time_ago} | comments:{comments_count} | {url}".format(
                points=post['points'],
                user=post['user'],
                time_ago=post['time_ago'],
                comments_count=post['comments_count'],
                url=post['url']
            )
            wf.add_item(title=post['title'],
                        subtitle=subtitle,
                        arg=post['url'],
                        valid=True,
                        icon='./icon.png')
    
        # Send the results to Alfred as XML
        wf.send_feedback()
  • 为了防止大量请求 API 造成服务器压力,也为了更快地显示结果,将数据进行缓存

    posts = wf.cached_data('posts', get_top_news, max_age=60*60)

导出 Workflow

右键 Hacker-news 将 workflow 导出为 hacker-news.alfredworkflow 格式,就可以发布出去啦

总结

  • 如果使用 Python 第三方库,需要 pip 安装到本地路径

  • 出于兼容性的考虑,Alfred-Workflow 暂时只支持 Python 2,有些小小遗憾;

示例代码和 Workflow 下载地址

  • https://github.com/wangshub/Alfred-HackerNews

  • MIT@神奇的战士

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值