Alfred Workflow 豆瓣插件开发
背景:
Alfred的介绍和使用不过多介绍,作为mac上的神器,他的workflow支持外部扩展,也可以自己开发,支持多种开发语言,其实远不止他显示的这几种,因为支持bash,只要本地能运行的程序理论上都支持。
作为豆瓣的轻度依赖者,我基本上使用豆瓣来查看书籍和电影的评分,主要用于判断是否值得投入时间来看。之前用的插件是 GitHub - xinhangliu/alfred-workflow,他依赖了豆瓣提供的api。现在豆瓣应该不提供api了,导致基本不可用了,我只能用他来快速跳转到豆瓣,没办法直接查看相关的评分和信息。调研了一下,发现可以通过解析网页的方式来获取相应的信息。加上原来的插件是用python2写的,也算是自己熟悉的语言,于是想着改造应该也不困难。 改造之后的代码:GitHub - ykdsg/workflow-douban: alfred workflow for douban. Use python3 and lxml.
workflow相关概念:
首先开发workflow,需要对他的核心组件有一定的了解,像Trigger、Inputs、Actions、Utilities、Outputs 分别代表什么意思。最便捷的方式是通过查看别人的workflow,以及官方的示例。
还有就是查看官方文档了 Workflows - Alfred Help and Support。
这里直接引用这篇文章里面的介绍:使用Python写一个Alfred Workflow - 执子之手
Triggers: Activate Alfred from a hotkey, another Alfred feature or an external source. 简单的说Triggers的用途就是通过热键或者其他方式启动Alfred,进而启动Workflow。
Inputs: Keyword-based objects used to perform an action, on its own or followed by a query. Inputs通过一个定义的关键字对象来执行一个action,这个关键字可以带查询参数也可以不带。例如你定义关键字mc,那么在Alfred搜索框中输入mc就可以启动这个功能。
Actions: The objects that do most of the work in your workflows; opening or revealing files and web searches, running scripts and performing commands. Actions对象在workflows中负责完成绝大多数的工作,例如可以打开文件,打开搜索,执行脚本等等。
Utilities: Utilities give you control over how your objects are connected together and how the arguments output by the previous object is passed on to the next object. Utilities可以让你控制你的对象如何连接在一起工作,控制参数如何在对象之间传递。这个对象我用的不多。
Outputs: Collect the information from the earlier objects in your workflow to pop up a Notification Centre message, show output in Large Type, copy to clipboard or run a script containing the result of your workflow. Outputs对象负责从你的Workflow中的前一个对象中收集信息,然后真正输出到系统中,这个输出可能是:弹出一个通托盘通知,拷贝到剪贴板,写一个文件,播放一个声音等等。
这是几个大类,每个大类下有很多具体的组件,实际用不上这么多,刚开始对大类有个印象就行了。
这里直接用网上的一张图来说明各个部分的大概作用。上面是有道翻译的workflow,可以比较清晰的看到各个部分的作用。
插件开发:
因为在原来的插件基础上开发,所以先看下原来插件的情况
双击第一个script filter
可以看到就是在alfred中输入“douban”会唤起这个插件,并调用selection.py 这个脚本,点击右下角的方块可以打开workflow的本地目录,就能看到相应文件。看了下selection.py这个文件,逻辑还是比较简单的 ,想要达到的效果就是:
对于 script filter 输出结果需要满足Alfred的要求,可以具体参考 : Script Filter JSON Format - Workflow Input Objects - Alfred Help and Support。
是一个json格式,类似:
{"items":[{"title":"Search Douban for 'test'","icon":{"path":"image/douban.png"},"arg":"test","variables":{"selection":"douban"}},{"title":"Book","icon":{"path":"image/book.png"},"arg":"test","variables":{"selection":"book"}},{"title":"Movie","icon":{"path":"image/movie.png"},"arg":"test","variables":{"selection":"movie"}},{"title":"Settings","icon":{"path":"image/settings.png"},"arg":"test","variables":{"selection":"settings"}}]
}
比较重要的是arg和variables,arg会作为参数传递到后面的组件,variables中的变量用于区分我们选择了book还是movie。
接着继续查看后面的组件
可以看到根据上面variables中的变量selection用于判断相应的流程,但是这里的形式已经变成了{var:selection} 。
接着再往下看下一个Script Filter,这个就是这个插件最核心的部分。
其中{query} 就是上一步 操作选中item的arg。很多时候我们也需要selection,但是在这里是不能用{var:selection}来传递的,这个在后面我自己维护的时候发现是个坑。貌似{var:selection}只能用于workflow自己组件内部,在bash里面没有传入,但是可以通过环境变量来获取,神不神奇。
selection = os.getenv('selection')
查看core.py,整体逻辑就是通过访问douban api,然后输出json,格式跟上面的items一样。 清楚之后改造就简单了,利用python的lxml库能够比较方便的解析html结构,获取相应的信息组装成items就行了。源码在 GitHub - ykdsg/workflow-douban: alfred workflow for douban. Use python3 and lxml.。
Debug:
在开发的过程中,通常是本地测试好之后,在workflow中跑起来,实际还是会有一些问题,这个时候就需要debug。
点击右上角就能够开启debug模式,会输出相应的日志,注意这里只会输出标出错误的信息,就是普通的log.info 是不会输出的,只有log.error 才会输出。
需要特别注意的地方:
- 虽然支持bash,zsh 但是跟本地终端还是不一样的,会发现他很多命令找不到,但是本地终端上是明确可以运行的。这个是Alfred 的默认保护机制,他只加载少数特定的目录,类似/usr/bin ,/usr/local/bin ,其他不会加载。所以如果你要用的命令找不到的话,就需要使用绝对路径。
- variables 在程序中只能通过环境变量获取,在bash 中通过{var:selection} 是传递不了的。
关于go 版本
python 的开发还是比较简单的,因为动态语言的特性,加上丰富的三方库,特别适合干这类杂活。但是存在一个问题是如果要把插件分享出去,就需要对应的同学有相应的环境:python的版本以及依赖的lxml,这个实在太不友好了,目前也没找到特别好的解决方案(可以把lxml拷贝到当前workflow的目录下,但是python3环境不一定所有人都有)。刚好最近在学习go ,就想着能不能用go重写这个插件,因为可以打包成可执行文件,就不存在环境依赖的问题。所以用go 重新写了这个插件 ,https://github.com/ykdsg/my_go/releases/tag/douban-workflow-1.0 。
源码在:https://github.com/ykdsg/my_go/tree/master/douban
这里吐槽下go的开发:
- 大小写决定是否private,所谓简单的原则,在很多时候造成的是麻烦,比如alfred 规定了items的json格式,而且是大小写敏感的,那就非常坑了,必须用下面这种格式来标记序列化之后的字段
Title string `json:"title"`
- log.Panicln 会导致整个程序退出,我天,简直刷新三观了。我打印一下日志,你就理所当然的帮我exit了,go标榜的简单哲学是不是太过了。说好的只做一件事呢,这么干确定不会增加程序员的心智负担吗。
最后看一下这个版本的效果:
选择book之后(略微有一丢慢,这个是douban网站的速度决定的):
Alfred Workflow 豆瓣插件开发相关推荐
- 用 Node.js 把玩一番 Alfred Workflow
插件地址(集成Github.掘金.知乎.淘宝等搜索) 作为 Mac 上常年位居神器榜第一位的软件来说,Alfred 给我们带来的便利是不言而喻的,其中 workflow(工作流) 功不可没,在它上面可 ...
- Alfred workflow 开发指南
小帽子alfred是mac上最为传奇的效率作品, 今天,我们一起来探索alfred workflow 的世界吧! 1. alfred 简介 小帽子是 Mac 平台上最为传奇的效率作品,誉为神兵利器毫不 ...
- python workflow_如何用 Python 写 Alfred Workflow
原标题:如何用 Python 写 Alfred Workflow 用 Mac 的同学应该都听过 Alfred,号称效率神器.但是,你有没有想过可以用 Python 自己写一个 Workflow 呢? ...
- 基于 Alfred Workflow 的开发效率小工具
前几天搞了一个效率小工具,基于 Alfred Workflow 制作,提高开发效率.目前只实现了基础的一些需求,后面会继续更新完善? 一些使用场景,比如 数据库时间字段记录的时间戳,排查问题可读性差, ...
- Mac 词典工具推荐:Youdao Alfred Workflow(可同步单词本)
想必大家都有用过 Mac 下常见的几款词典工具: 特性 系统 Dictionary 欧路词典 Mac 版 有道词典 Mac 版 在线搜索 ✗ ✔ ✔ 屏幕取词 ☆☆☆ ★★☆ ★☆☆ 划词搜索 ★★★ ...
- python workflow_Python新手也会写的Alfred Workflow
Alfred的是公认的MacBook效率神器,入坑Mac这么久用了很多别人写的workflow觉着真心不错.学了一点python终于可以写个简单的workflow了,先上效果图: 先上效果图 关于Al ...
- Mac 常用快捷键(Alfred+workflow+IDEA)
一.Sublime 篇 快捷键 描述 option+command + f 然后 正则替换所有的 \n 所有行合并成一行 option+command + f 然后 正则选择所有行首或行尾 (行首:^ ...
- 用python写一个alfred workflow百度翻译插件
用python写一个workflow百度翻译插件 最近在学习python,同事看到了说他有经常翻译多国语言的需求,看我能不能帮他写一个支持多国语言翻译的workflow插件,这就有了它. 功能介绍 打 ...
- Alfred Workflow 入门指南
Workflow 简介 Workflow 是一款典型的效率应用.2015 年,Workflow 被评为"App Store 最佳应用",2017 年,Workflow 被苹果公司收 ...
最新文章
- 51NOD 1773:A国的贸易——题解
- JZOJ 4238. 【五校联考5day2】纪念碑
- C# 9.0 终于来了, Top-level programs 和 Partial Methods 两大新特性探究
- AS(Autonomous System)
- Flask mysql
- 虚拟Python环境可以这样创建
- 话题:什么是前端工程化?
- excel 图表制作--趋势线误差线
- android foobar wifi,foobar2000安卓
- word文件转pdf转换器注册码
- Android 发短信功能实现
- 武汉理工大学计算机学院转专业细则,计算机学院武汉理工大学2009年各学院转专业工作实施细则.doc...
- 领导力21法则-- 要点总结
- linux搭建帝国CMS网站,帝国CMS CentOS7 服务器搭建
- 造梦师的梦想是什么样的?
- 【点云处理技术之PCL】range image——提取深度图像的边界并可视化
- Cocos2dx游戏教程(十五):“见缝插针”,愿你走出半生,归来仍是少年
- java中如何添加画板背景图,在AI中怎么把已知图片在新建画板时候作为画板的背景来建立画板啊!...
- IBIS模型:利用IBIS模型研究信号完整性问题
- TCP与UDP的区别!
热门文章
- 新浪微博第三方登录,显示重定向错误问题
- 传奇自定义技能栏技术分享-GEE
- 工业RFID低频读卡器|AGV车载地标识读器L8820配套标签与配件选型注意事项
- Clickhouse(5)---Clickhouse语法
- 英语年份怎么读(2008怎么读)
- 【英语阅读】纽约时报 | 乔布斯是对的:手机和iPad杀死了个人电脑
- 聊聊工程师的专业职级晋升之道
- chrome使用脚本修改组策略_允许新版本 Chrome 安装第三方网站的脚本以及扩展的方法...
- [m0leCon beginner 2022] 部分
- steam 平台 饥荒 联机版 Linux云服务器 搭建教程