Fantetic Blog

Scriptable 小组件分享:服务器探针、Codex 额度和天气

分享三份 Scriptable 脚本,把服务器状态、Codex 额度和天气放到 iPhone 桌面与锁屏上。三个组件采用深灰与薄荷绿配色,支持小、中、大及锁屏尺寸,可以按需要单独安装。

下面介绍各自的功能,再说明安装、连接设置和组件参数。脚本下载放在后半部分,配图是设计示意和模拟渲染,不是真机截图。

服务器探针

服务器探针的小、中、大组件

探针组件显示周期流量、在线状态、CPU、内存和上下行速度,大号还显示磁盘与运行时长。详细模式下,小号显示一台服务器,中号两台,大号四台。

每块组件可以选择不同的服务器,也可以指定显示顺序。例如,在组件的 Parameter 中填写:

servers=1;mode=detail

1 是服务器 ID。想按指定顺序显示多台,可以填写 servers=3,1;mode=detail。只需安装一份脚本,各组件分别设置参数,不必复制脚本。

需要滑动切换时,添加几块同尺寸组件,分别指定服务器,再拖到一起组成 iOS 组件叠放。这套脚本不提供组件内部的滑动列表。

点击组件打开探针面板网页。此前在 iOS 16.6 的使用中,锁屏组件可以打开网页,桌面组件有时会先显示 Scriptable 再跳转;当前脚本不保证消除这个系统过渡。

Codex 额度

Codex 额度组件,锁屏部分为早期单环设计

额度组件显示 5 小时与 7 天窗口的已用比例、重置时间和可用重置次数。百分比表示已经使用的额度,0% 表示未使用。

这份脚本连接自建管理面板,使用以下接口:

GET  /api/v1/admin/accounts/{id}/usage
POST /api/v1/admin/openai/accounts/{id}/quota/refresh

使用前需要准备兼容的管理面板、数字账号 ID 和 Admin API Key。脚本通过 x-api-key 请求头鉴权,完整查询参数已写入脚本。仅有 ChatGPT 账号不能直接使用这两个管理接口。点击组件打开配置域名下的 /admin/dashboard。

探针与额度的圆形、矩形锁屏组件支持双环,可以同时查看两项指标。

锁屏双环的放大示意

双环中,上面一行对应外环,下面一行对应内环。圆形组件使用短标签和数字,矩形组件还可以展示名称及补充信息。

探针可以选择 CPU、内存、磁盘或流量;额度可以选择 5H、7D 已用比例,也可以显示剩余重置时间。例如:

account=1;rings=dual;outer=5h;inner=5h-reset

外环显示 5 小时已用额度,内环显示距离重置的剩余时间。越接近重置,时间环越空。时间显示随组件运行更新,不是实时倒计时。

和风天气

天气脚本的模拟渲染,左侧无预警,右侧有预警

天气组件突出天气图标、当前温度和空气质量,同时显示风力、湿度、当天最低与最高温度、日出日落及距日落时间。中号展示未来三天,大号展示未来五天。

预警显示在地点右侧,无预警时不预留独立区域。更新时间放在右下角。锁屏圆形可选择天气、空气质量或预警模式。

设置时输入城市或区县名,从搜索结果中选择正确地区,脚本会保存坐标和时区。重名地区可以通过上级城市进一步筛选,也保留了手动坐标入口。

点击组件打开对应地点的和风天气详情网页。链接通过坐标查询并缓存;如果没有可用链接,则打开和风天气首页。

刷新与多组件共用

探针默认请求最早十五分钟后刷新,额度和天气默认五分钟。这些是最早刷新时间,实际运行由 iOS 调度,无法保证固定间隔,也不能保证叠放中的所有组件同时更新画面。

相同来源的数据可以共用:探针按面板共享服务器列表,额度按面板和账号等设置共享数据,天气按地点和接口共享缓存。一个组件更新缓存后,其他组件下次运行时会读取它;已经显示的画面仍要等系统重新绘制。

探针共享缓存的有效期为 60 秒,额度为 5 分钟,天气按数据类型使用不同缓存时长。缓存有效期和组件刷新周期是两回事。需要主动获取数据时,可在 App 内使用脚本的刷新菜单;天气遇到限流或鉴权失败时仍遵守请求退避。

组件下方的“Scriptable”是系统显示的应用名。脚本能修改组件内部文字,不能用空白字符隐藏这个名称。

下载与安装

文件用来做什么
Monitor.js服务器探针
CodexQuota.jsCodex 额度
QWeather.js和风天气
SharedCache.js探针和额度共用的数据缓存模块
LockRings.js探针和额度共用的锁屏双环模块

手机安装 Scriptable 后,导入需要的脚本,也可以新建脚本并粘贴完整内容。探针和额度必须同时导入 SharedCache;使用双环还需导入 LockRings。模块名称不要修改,并与主脚本放在同一目录。天气脚本可独立运行。

附件版本:Monitor 1.6.0、CodexQuota 1.3.1、QWeather 1.1.2、SharedCache 1.0.0、LockRings 1.0.1。

三个脚本都先在 App 里运行,配好连接再放到桌面。Token 和 Key 会保存到 Keychain,不用写进代码,也不要填到组件的 Parameter 里。

探针怎么填

先到探针后台的“安全”里创建只读 API Token,给它授权需要展示的服务器。这里用的不是节点安装时的 agent Token,也不是后台登录密码。

运行 Monitor,选择“连接 / 更换 Token”,填 HTTPS 面板地址和 Token,点“测试并保存”。可以填面板首页,也可以填完整的 /api/v1/servers 列表接口地址。其他探针服务的数据格式不一定相同,不能只换域名就用。

服务器 ID 可以在“独立组件参数 / 预览”里查看。参数留空就用全局设置;每块组件想看不同的节点,就按下面填写,记得换成自己的 ID:

Parameter显示方式
servers=1;mode=detail节点 1,详细模式
servers=3,1;mode=detail按 3、1 的顺序显示,数量受组件尺寸限制
mode=simple当前组件改用简洁模式
servers=1;rings=dual;outer=cpu;inner=memory锁屏外环 CPU,内环内存

探针双环可选 cpu、memory、disk、traffic。不想用双环,填 rings=single,也就不需要 LockRings 模块了。双环设置只影响圆形和矩形锁屏,不会改变桌面布局。

如果希望所有组件都按同一顺序,在脚本的“排序 → 自定义顺序”里填 ID,例如 3,1,5。这会优先显示这几台,其他节点仍会接在后面;只想看这几台,还要设置筛选。单个组件里的 servers 参数则只显示列出的节点。

额度怎么填

运行 CodexQuota,选择“连接 / 更换 API Key”,填写 HTTPS 管理面板地址、数字账号 ID、显示名称和 Admin API Key。Key 只填值,不加前缀。账号 ID 是接口路径里的数字,不是邮箱,也不是返回数据中的 UUID。

点“测试并保存”后,脚本会请求 usage 和 quota/refresh 两条接口。面板需要兼容这套接口,API Key 也必须有权限访问对应账号。部分成功时会保留可用数据并提示缺失,不会把失败的数据当成 0。

Parameter显示方式
account=2当前组件改看账号 2
account=2;window=7d单环或锁屏单行选 7 天窗口;桌面仍显示两个窗口
account=1;rings=dual;outer=5h;inner=7d双环分别显示 5 小时、7 天已用比例
account=1;rings=dual;outer=5h-reset;inner=7d-reset两个环都看剩余重置时间

outer 和 inner 可以互换,也可以混搭额度和时间。百分比表示已用,时间到点后仍要等接口更新,脚本不会自己把额度清零,也不会消耗重置次数。

刷新间隔在“显示与刷新”里调整,范围是 5~120 分钟。API Key 失效后需要在 App 内更新,脚本不会自动登录面板。更换面板也要提供对应的 Key。

天气怎么填

运行 QWeather,填写和风天气控制台提供的 API Host、API Key,再输入城市或区县名。Host 类似 xxxx.qweatherapi.com,不要填官网地址或附带接口路径。

选“搜索地区并保存”,确认搜索结果里的省市和区县。比如搜“西湖”,可以再填上级城市“杭州”。查不到街道、小区时,换成城市或区县名;也保留了手动坐标入口作为备用。

账户需要有城市搜索、实时天气、每日及小时预报、空气质量、天气预警这些服务的访问权限。分钟降水是可选项,没有开通就先别打开。保存时检查实时天气连接,其他服务有问题会在组件或详情里提示。

只看一个地方的话,后面不用填任何参数。想单独改某块组件的锁屏内容或刷新间隔,可以这样填:

Parameter显示方式
lock=weather圆形锁屏显示天气,默认选项
lock=air圆形锁屏显示空气质量
lock=alert圆形锁屏显示预警,没有预警时显示天气
refresh=10当前组件最早 10 分钟后刷新,支持 5~60 分钟

多个地点也能分别配置,不过组件参数目前需要填坐标。例如:

name=上海;lat=31.23;lon=121.47;timezone=Asia/Shanghai;lock=air

这里的 name 只是显示名称,单改名字不会切换城市。换地点要同时修改 lat、lon,跨时区时也修改 timezone。平时只用一个地点,直接在脚本设置里搜城市会省事些。

AQI 默认采用中国标准,参数 airIndex 可以选择服务支持的其他指数;找不到所选指数就显示暂无。更新时间是实时天气最后成功获取的时间。“缓存”表示正在用旧数据,“部分”表示有接口异常或关键数据缺失。点击天气组件打开天气网页;需要检查接口状态时,在 Scriptable 内运行脚本,选择“立即刷新并查看详情”。

放到桌面和锁屏

  1. 长按桌面空白处,添加 Scriptable 小组件,选好尺寸。
  2. 长按这块组件,进入“编辑小组件”,在 Script 中选择脚本。Parameter 可以留空;需要独立设置时再粘贴上面的参数,每块填自己的。
  3. 想上下滑动切换,就把几块同尺寸组件拖到一起叠放。只想手动切换的话,可以在“编辑叠放”里关闭智能轮换和组件建议。
  4. 锁屏组件要另外添加:长按锁屏,进入“自定 → 锁定屏幕”,在时间下方添加圆形或矩形组件,再点进去选脚本。单行组件在时间上方的日期区域添加。

探针点击打开面板网页,额度点击打开域名下的 /admin/dashboard,天气点击打开对应地点的天气网页。链接不携带 Token 或 Key,也不会自动登录。锁屏时可能需要先解锁。运行一次脚本不保证桌面上的所有实例立刻一起刷新。

以后更新脚本,保留原脚本名称,用新内容完整覆盖即可,已有设置可以继续使用。从旧 Bearer 版本升级 Codex 额度时,需要重新填写 Admin API Key。共享缓存和双环模块也要按更新包替换,不要留两个不同名字的 LockRings。

没显示出来,先看这里

遇到的情况先检查什么
401 / 403令牌是否过期,节点、账号或天气服务是否有权限
404、返回网页而不是数据接口版本、面板地址,是否被登录页或代理拦截
提示重定向改填最终 HTTPS 地址,不使用跳转域名
探针没节点Token 的授权范围,以及筛选和 Parameter 里的服务器 ID
提示缺少 SharedCache是否导入了同目录下名为 SharedCache 的模块
双环无法显示是否导入了同目录下名为 LockRings 的模块
两块组件显示一样是否都留空继承了全局设置,要区分就各自填 Parameter
天气只显示部分内容在 Scriptable 内查看详情,检查对应服务权限、额度和获取时间
一直没刷新先在 App 内检查接口,再看组件是否在用缓存;无报错也可能是系统尚未调度

天气遇到限流或鉴权失败会暂缓请求,不要反复点刷新。减少间隔、增加地点都会增加请求量。对外分享天气组件时也要留意数据来源标注,脚本内的诊断详情保留了来源信息;[UNVERIFIED] 仅放在详情页是否符合具体授权,仍需核对。

注意:你需要结合自己的请求地址格式等自己改一下,不是拿来即用。

开源 IOS Scriptable