Alfred Workflow 开发实战指南
Executive Summary
核心观点(金字塔原理)
结论先行: Alfred Workflow是macOS上极具价值的效率提升工具,通过Python脚本可快速开发自定义工作流,将日常重复操作从多步骤简化为一次键盘触发。
支撑论点:
- 低门槛开发:支持Bash/Python等多种脚本语言,alfred-workflow库提供完整的开发框架
- 高度可定制:可对接任意HTTP API、读取本地文件、调用系统命令
- 即时反馈:内置缓存机制和调试日志,开发调试效率高
SWOT 分析
| 维度 | 分析 |
|---|---|
| S 优势 | 键盘驱动零鼠标操作、支持多种脚本语言、丰富的社区Workflow资源 |
| W 劣势 | 付费软件(Powerpack)、仅限macOS平台、Python 2.7兼容性问题 |
| O 机会 | 可集成内部API/工具链、统一团队工作流、替代重复性GUI操作 |
| T 威胁 | macOS系统更新可能影响兼容性、Python 2.7已停止维护 |
适用场景
- API快速查询:配置中心、文档系统、内部工具的快速检索与跳转
- 项目快速打开:一键搜索并用IDE打开指定目录下的项目
- 日常效率提升:翻译、计算、格式转换等高频操作
Alfred 简介
Alfred是macOS平台上的效率启动器工具,核心特点:
- 收费软件(Powerpack授权解锁Workflow功能)
- 支持自定义Workflow提高工作效率
- Workflow支持多种脚本语言:
/bin/bash、/usr/bin/python等
Workflow 开发流程
步骤一:创建脚本过滤器
- 打开Alfred Preferences → Workflows
- 点击
+创建新Workflow - 添加 Script Filter:
- Language:
/bin/bash或/usr/bin/python with input as {query}
- Language:
步骤二:配置Python环境
在Script中填写:
/usr/bin/python your_script.py "{query}"
步骤三:项目目录结构
选中Workflow右键 → 在Finder中打开,目录结构如下:
Your Workflow/
├── info.plist # Workflow配置文件
├── icon.png # Workflow图标
├── workflow/ # alfred-workflow库
│ ├── __init__.py
│ ├── background.py
│ ├── notify.py
│ ├── web.py
│ ├── workflow.py
│ └── workflow3.py
└── yourscript.py # 自定义脚本
步骤四:安装依赖
在Workflow目录中执行:
pip install --target=. Alfred-Workflow
pip install --target=. requests browsercookie
步骤五:开发脚本
步骤六:配置Action
右键空白处 → Actions → Open URL,配置 {query} 作为跳转链接
实战案例一:API查询工作流
通过HTTP接口查询配置信息,解析为Alfred下拉选项:
#!/usr/bin/env python
# coding:utf-8
import requests
import json
import browsercookie
import sys
from workflow import Workflow
url = 'https://xxx.xxx.com/api/xxx?_search='
cookies = browsercookie.chrome()
icon = '/item.ico'
def send_request(query):
"""发送HTTP请求获取数据"""
params = {"key": query}
r = requests.get(url=url, cookies=cookies, params=params)
return json.loads(r.text)
def main(wf):
"""主函数:获取输入、查询接口、返回结果"""
query = wf.args[0] if len(wf.args) else None
# 使用缓存加速,60秒过期
result = wf.cached_data(query, lambda: send_request(query), max_age=60)
wf.logger.info(result)
for item in result['data']:
name = item['key']
path = str(name).replace(".", "/")
linkUrl = 'https://xxx.xxx.com/' + path
wf.add_item(title=name, icon=icon, arg=linkUrl, valid=True)
wf.send_feedback()
if __name__ == '__main__':
wf = Workflow()
sys.exit(wf.run(main))
核心API说明:
| 方法 | 说明 |
|---|---|
wf.args |
获取用户输入参数 |
wf.cached_data() |
缓存数据,避免重复请求 |
wf.add_item() |
添加下拉选项 |
wf.send_feedback() |
返回结果给Alfred |
wf.logger.info() |
输出调试日志 |
实战案例二:IDEA项目快速打开
快速搜索指定目录下的项目并用IDE打开:
配置步骤
- 创建Script Filter,Language:
/usr/bin/python - 配置环境变量:点击右上角
{X}→ Environment Variablesidea_workspace_path=/User/xxx/project(支持逗号分隔多目录)
- 添加Action:Launch Apps/Files,选择IDEA
脚本代码
#!/usr/bin/python
# -*- coding: utf-8 -*-
import json
import os
import re
def search(paths, name):
"""查询指定目录下所有匹配的文件夹"""
data = []
for path in paths:
files = os.listdir(path)
for file_name in files:
# 忽略大小写匹配,排除文件(含.的项)
if re.search(name, file_name, re.I) and file_name.find(".") == -1:
file_path = path + "/" + file_name
data.append({
"uid": file_name,
"title": file_name,
"subtitle": file_path,
"arg": file_path
})
print json.dumps({"items": data})
# 读取配置的工作空间路径
path = os.getenv("idea_workspace_path")
if not path:
print json.dumps({"items": [{"title": "未设置idea工作空间:idea_workspace_path"}]})
else:
search(path.split(","), '{query}')
常见问题与解决方案
| 问题 | 原因 | 解决方案 |
|---|---|---|
| Python版本不兼容 | Alfred Workflow依赖Python 2.7 | 使用系统自带Python或安装pyenv管理版本 |
| 依赖包找不到 | 未安装到Workflow目录 | 使用 pip install --target=. 安装 |
| Cookie获取失败 | browsercookie首次需要授权 | 输入系统密码,点击”始终允许” |
| 调试脚本 | 需要查看运行日志 | 打开Alfred Debug Console查看 |
参考资料
- Alfred官网:https://www.alfredapp.com/
- alfred-workflow文档:https://github.com/deanishe/alfred-workflow
- Workflow资源库:https://www.alfredworkflows.store/
- Google翻译Workflow:https://github.com/xfslove/alfred-google-translate
- Workflow配置指南:https://www.alfredapp.com/help/workflows/workflow-configuration/