SwiftBar - 这款免费开源的菜单栏插件工具 + AI 编程可以打造自己的状态栏功能菜单,附详细教程,小白也能上手

昨天折腾了一下,让 AI 帮我写了个 SwiftBar 插件,实现了简单的代理切换和服务状态监控的功能。

SwiftBar 介绍

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

SwiftBar 官网
SwiftBar 官网

值得关注的几点

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

实际上我很早就知道这款工具,但我之前以为只支持用 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秒执行一次,这对于需要监控服务状态来说很有必要。

通过这个插件,我可以很方便地切换网络代理,也能实时监控中转服务器的服务状态,一旦有故障,可以及时修复,以免影响其他同事使用。