昨天折腾了一下,让 AI 帮我写了个 SwiftBar 插件,实现了简单的代理切换和服务状态监控的功能。
SwiftBar 介绍
SwiftBar 是一款 macOS 平台上的菜单栏插件工具,我们可以用简单的脚本语言创建自定义菜单栏项目。比如想在 Mac 菜单栏显示一些个性化信息(如服务器状态、GitHub 动态、系统监控等)。这本来是一个针对开发者打造的工具,现在在 AI 编程的帮助下,不会编程也可以打造自己的菜单。

值得关注的几点
- 兼容 BitBar 生态:如果你之前用过类似的 BitBar,SwiftBar 完全兼容 BitBar 插件格式,也就是说 BitBar 多年积累的社区插件拿来即用
- 内置插件仓库:SwiftBar 也内置了插件库,可直接在应用内寻找和安装各类插件
- 轻量高性能:常规状态下内存占用不到 50MB,也几乎不消耗 CPU
- 开源免费无订阅:完全免费,代码开源,不用花一分钱就能用

实际上我很早就知道这款工具,但我之前以为只支持用 bash 来写插件,为了一个小功能去学习一门语言,动力真的不足。现在借助 AI,可以很容易实现,就算不会编程,只要将需求准确地描述出来,这种插件功能是很容易实现的,这也是我使用过后,迫不及待想写一篇文章向大家推荐。
话不多说,下面来看看我怎么用来实现一个代理服务功能的状态栏菜单。
Mac 菜单栏代理小插件实现教程
软件安装
首先肯定是要安装 SwiftBar,直接从官网点击图标,下载最新版的软件包,截止我写文章时,最新版是 v2.0.1。这里要注意,系统要求 macOS Catalina (10.15) 及以上版本,老版本不支持。
重要:选择插件文件夹
首次启动时,SwiftBar 会要求设置插件文件夹,这是所有插件的存放位置,每一个脚本文件代表一个功能菜单。我们只有把写好的脚本文件拖进这个文件夹,就会自行执行显示在菜单上。
生成插件脚本文件
我的需求是有个工作项目要连接第三方提供的 SAAS 工具,而他们的工具是搭在内网,我们要访问的话只能报备一个固定 IP 来访问,但现在的宽带不太可能给固定 IP,于是用一台中转服务器做代理转发,本地电脑只需要将连接的 WIFI 网络的代理设置为中转服务器,就可以连接 SAAS 工具来。

于是我给 AI 描述了需求,就直接生成了脚本代码:
#!/bin/bash
# SwiftBar 插件: Proxy Manager
# 刷新频率: 2s
USER_HOME="$HOME"
NETWORK_SERVICE="Wi-Fi"
PROXY_HOST="xxx.xxx.xxx.xxx"
PROXY_PORT="1088"
MANAGE_SCRIPT="${USER_HOME}/docker-manage.sh"
# 检查系统网络代理状态
get_proxy_status() {
local output
output=$(networksetup -getwebproxy "$NETWORK_SERVICE" 2>/dev/null)
[[ "$output" == *"Enabled: Yes"* ]]
}
# 检查服务状态(返回两行:第一行布尔值,第二行详情)
get_service_status() {
local output=""
local running="false"
local detail="未安装或脚本错误"
# 取消注释以下行以启用实际检查:
output=$("$MANAGE_SCRIPT" --status 2>&1)
if [[ -n "$output" ]]; then
if [[ "$output" == *"Service is running"* ]]; then
running="true"
# 提取包含 running 或 Node= 的行
detail=$(echo "$output" | grep -E 'running|Node=' | head -5)
[[ -z "$detail" ]] && detail="$output"
fi
fi
echo "$running"
echo "$detail"
}
# 主逻辑
proxy_enabled=false
get_proxy_status && proxy_enabled=true
# 读取服务状态(第一行是布尔值,其余是详情)
{
read -r service_running
read -r -d '' service_detail || true
} < <(get_service_status)
# --- 菜单栏图标 ---
if [[ "$proxy_enabled" == true && "$service_running" == true ]]; then
echo "🌐 | color=#00b894" # 绿色
elif [[ "$service_running" == true ]]; then
echo "🔶 | color=#fdcb6e" # 黄色
else
echo "⚪ | color=#b2bec3" # 灰色
fi
# --- 下拉菜单 ---
echo "---"
# 代理开关
if [[ "$proxy_enabled" == true ]]; then
echo "🟢 代理已开启"
echo "关闭代理 | shell=networksetup param1=-setwebproxy param2=\"$NETWORK_SERVICE\" param3=none terminal=false refresh=true"
else
echo "⚪ 代理已关闭"
echo "开启代理 | shell=networksetup param1=-setwebproxy param2=\"$NETWORK_SERVICE\" param3=\"$PROXY_HOST\" param4=\"$PROXY_PORT\" terminal=false refresh=true"
fi
echo "---"
# 服务状态
echo "📊 服务正常"
if [[ -n "$service_detail" ]]; then
# 多行详情需要逐行输出,并添加 disabled 属性
echo "$service_detail" | while IFS= read -r line; do
echo "$line | color=gray disabled"
done
else
echo "未知 | color=gray disabled"
fi
我只需要把上面的代码保存为 my-service.2s.js,放进插件目录,菜单就自动显示出来了。需要注意文件名的 2s,表示脚本每2秒执行一次,这对于需要监控服务状态来说很有必要。
通过这个插件,我可以很方便地切换网络代理,也能实时监控中转服务器的服务状态,一旦有故障,可以及时修复,以免影响其他同事使用。



