287 lines
7.6 KiB
Markdown
287 lines
7.6 KiB
Markdown
# SimAdmin 多实例 Autman 插件
|
||
|
||
管理员专用 Python 插件,支持多个 SimAdmin 实例:
|
||
|
||
- 多级菜单交互式配置管理
|
||
- 查询全部或指定实例状态
|
||
- 通过指定实例发送短信
|
||
- 兼容 SimAdmin API:
|
||
- `GET /api/health`
|
||
- `GET /api/sim`
|
||
- `GET /api/network`
|
||
- `GET /api/stats`
|
||
- `GET /api/sms/stats`
|
||
- `POST /api/sms/send`
|
||
|
||
插件文件:
|
||
|
||
- 推荐实机文件:`py/simadmin_multi.py`
|
||
- 归档说明文件:`plugins/simadmin/simadmin_multi.py`
|
||
|
||
## 安装位置
|
||
|
||
参考仓库里已有可用插件(`py/rb-aut.py`、`py/mi10rb-aut.py`、`py/jd_rabbit_账密.py`),实机请优先复制 `py/simadmin_multi.py` 到 Autman 的 Python 脚本插件目录,例如:
|
||
|
||
```text
|
||
plugin/scripts/simadmin_multi.py
|
||
```
|
||
|
||
不要只复制 `plugins/simadmin/` 整个目录;部分 Autman 部署只扫描脚本目录的一层 `.py` 文件,子目录里的文件可能不会被加载。
|
||
|
||
插件头注已设置:
|
||
|
||
```text
|
||
#[admin: false]
|
||
#[rule: ^sim帮助$]
|
||
#[rule: ^sim配置$]
|
||
#[rule: ^sim管理$]
|
||
#[rule: ^sim状态.*$]
|
||
#[rule: ^sim短信.*$]
|
||
#[priority: 999]
|
||
#[platform: qq,qb,wx,wb,tg,tb,fs,we,web,wxmp]
|
||
```
|
||
|
||
说明:头注里故意设置 `#[admin: false]`,只让框架负责触发规则;插件代码内仍会调用 `sender.isAdmin()` 做管理员校验,非管理员会回复 `仅管理员可用`。这样可以避免部分实机环境框架层管理员识别失败时直接拦截、导致完全无回应。
|
||
|
||
> 实机排查修复:参考已有可用 Python 插件,头注采用 Autman 常见的 `#[key: value]` 无空格格式,优先级提升到 `999`,并将复杂规则降级为 `^sim状态.*$` / `^sim短信.*$`。复杂正则里的 `(?:...)`、`\S`、`[\s\S]` 在某些规则解析器里可能不兼容,导致插件不触发。平台扩展到 `qq,qb,wx,wb,tg,tb,fs,we,web,wxmp`,避免适配器 imType 不匹配。
|
||
|
||
## 配置存储
|
||
|
||
插件配置存入 Autman 数据桶:
|
||
|
||
- bucket:`otto`
|
||
- key:`simadmin_instances`
|
||
|
||
插件会用 JSON 数组保存配置。也兼容读取旧的多行简写配置。
|
||
|
||
## 多级菜单配置管理
|
||
|
||
发送:
|
||
|
||
```text
|
||
sim配置
|
||
```
|
||
|
||
或:
|
||
|
||
```text
|
||
sim管理
|
||
```
|
||
|
||
进入菜单:
|
||
|
||
```text
|
||
SimAdmin 配置管理(多级菜单)
|
||
当前实例数:0
|
||
1. 查看实例列表
|
||
2. 添加实例
|
||
3. 编辑实例
|
||
4. 删除实例
|
||
5. 启用/禁用实例
|
||
6. 测试状态查询
|
||
7. 导出配置 JSON
|
||
q. 退出
|
||
```
|
||
|
||
### 实例列表页快捷操作
|
||
|
||
菜单选择 `1. 查看实例列表` 后,不再只是展示文本,而是进入实例列表操作页:
|
||
|
||
```text
|
||
SimAdmin 实例列表:
|
||
1. 主卡 [启用]
|
||
http://192.168.68.1:3000 timeout=10s token=未设置
|
||
2. 副卡 [禁用]
|
||
http://192.168.68.2:3000 timeout=10s token=abc***xyz
|
||
|
||
列表操作:
|
||
输入实例编号:进入该实例操作菜单
|
||
a. 新增实例
|
||
e <编号>. 编辑实例,例如 e 1
|
||
d <编号>. 删除实例,例如 d 1
|
||
t <编号>. 测试状态,例如 t 1
|
||
on <编号> / off <编号>. 启用或禁用
|
||
r. 刷新列表
|
||
b. 返回上级菜单
|
||
q. 退出配置管理
|
||
```
|
||
|
||
也就是说,查看列表后可以直接继续操作:
|
||
|
||
```text
|
||
1 # 进入 1 号实例操作菜单
|
||
e 1 # 直接编辑 1 号实例
|
||
d 2 # 直接删除 2 号实例
|
||
t 1 # 直接测试 1 号实例
|
||
on 2 # 启用 2 号实例
|
||
a # 新增实例
|
||
```
|
||
|
||
### 单实例操作菜单
|
||
|
||
在列表页输入实例编号后,进入该实例的二级操作菜单:
|
||
|
||
```text
|
||
实例操作:【主卡】
|
||
主卡 [启用]
|
||
http://192.168.68.1:3000 timeout=10s token=未设置
|
||
1. 测试状态
|
||
2. 编辑实例
|
||
3. 删除实例
|
||
4. 启用/禁用
|
||
5. 复制/新增一个实例
|
||
b. 返回实例列表
|
||
q. 退出配置管理
|
||
```
|
||
|
||
### 添加实例流程
|
||
|
||
可从主菜单选择 `2. 添加实例`,也可在列表页输入 `a`。
|
||
|
||
交互优化说明:很多聊天端/Autman `sender.listen()` 不能捕获“空回车”,所以插件不再要求直接回车。需要默认值时输入 `d` / `default` / `默认` / `跳过`;需要留空或清空 token 时输入 `clear` / `清空`。
|
||
|
||
示例:
|
||
|
||
```text
|
||
sim配置
|
||
1
|
||
a
|
||
请输入实例名称,例如:主卡
|
||
主卡
|
||
请输入 SimAdmin 地址,例如:http://192.168.68.1:3000
|
||
http://192.168.68.1:3000
|
||
请输入超时时间秒数
|
||
输入 d/default/默认 使用默认值:10
|
||
d
|
||
请输入 token
|
||
输入 d/default/默认 使用默认值:留空
|
||
输入 clear/清空 表示留空
|
||
clear
|
||
是否启用?输入 1/是 启用,0/否 禁用
|
||
输入 d/default/默认 使用默认值:启用
|
||
d
|
||
确认添加?输入 yes/y/确认,输入 n/no/取消 放弃
|
||
yes
|
||
```
|
||
|
||
### 编辑实例流程
|
||
|
||
可从主菜单选择 `3. 编辑实例`,也可在列表页输入 `e 1`,或输入实例编号后选择 `2. 编辑实例`。编辑 token 时:输入 `d` 保持当前 token,输入 `clear` 清空 token。
|
||
|
||
编辑二级菜单:
|
||
|
||
```text
|
||
编辑【主卡】
|
||
1. 修改名称
|
||
2. 修改地址
|
||
3. 修改 timeout
|
||
4. 修改 token
|
||
5. 切换启用/禁用(当前:启用)
|
||
6. 保存并返回
|
||
q. 放弃返回
|
||
```
|
||
|
||
### 删除实例流程
|
||
|
||
可从主菜单选择 `4. 删除实例`,也可在列表页输入 `d 1`,或进入单实例操作菜单选择 `3. 删除实例`。删除前需要输入 `yes` 二次确认。
|
||
|
||
### 启用/禁用实例
|
||
|
||
可从主菜单选择 `5. 启用/禁用实例`,也可在列表页输入 `on 1` / `off 1`,或进入单实例操作菜单选择 `4. 启用/禁用`。
|
||
|
||
### 测试状态查询
|
||
|
||
可从主菜单选择 `6. 测试状态查询`,也可在列表页输入 `t 1`,或进入单实例操作菜单选择 `1. 测试状态`。
|
||
|
||
### 导出配置
|
||
|
||
菜单选择 `7. 导出配置 JSON`,会输出当前完整 JSON,方便备份或迁移。
|
||
|
||
## 兼容的手工配置格式
|
||
|
||
虽然推荐直接使用菜单管理,但仍可手工写入数据桶。
|
||
|
||
### JSON 数组
|
||
|
||
```json
|
||
[
|
||
{
|
||
"name": "主卡",
|
||
"base_url": "http://192.168.68.1:3000",
|
||
"timeout": 10,
|
||
"token": "可选,如果前面有反代/网关鉴权",
|
||
"enabled": true
|
||
}
|
||
]
|
||
```
|
||
|
||
字段:
|
||
|
||
| 字段 | 必填 | 说明 |
|
||
|---|---:|---|
|
||
| `name` | 是 | 实例别名,指令里使用 |
|
||
| `base_url` | 是 | SimAdmin 地址,不要以 `/` 结尾 |
|
||
| `timeout` | 否 | 请求超时秒数,默认 10,范围 3-60 |
|
||
| `token` | 否 | 可选;会同时带 `Authorization: Bearer <token>` 和 `X-API-Token` |
|
||
| `enabled` | 否 | 是否启用,默认 true |
|
||
| `headers` | 否 | 自定义请求头对象 |
|
||
|
||
### 旧版简写
|
||
|
||
```text
|
||
主卡=http://192.168.68.1:3000
|
||
副卡=http://192.168.68.2:3000,token=xxx,timeout=10
|
||
```
|
||
|
||
插件能读取这种格式;通过菜单保存后会自动转换为 JSON 数组。
|
||
|
||
## 日常指令
|
||
|
||
```text
|
||
sim帮助
|
||
sim配置
|
||
sim管理
|
||
sim状态
|
||
sim状态 主卡
|
||
sim短信 主卡 10086 CXLL
|
||
sim短信 all 10086 测试短信
|
||
```
|
||
|
||
说明:
|
||
|
||
- `sim状态`:查询全部启用实例。
|
||
- `sim状态 <实例名>`:查询指定实例;支持名称包含匹配。
|
||
- `sim短信 <实例名|all> <号码> <内容>`:发送短信。
|
||
- `all` 会向所有启用实例发送同一条短信,谨慎使用。
|
||
|
||
## 返回示例
|
||
|
||
```text
|
||
【主卡】
|
||
健康: ok 版本: 1.0.0
|
||
SIM: 13800138000
|
||
ICCID: 8986...
|
||
IMSI: 460...
|
||
网络: China Mobile / registered / 信号:-70
|
||
系统: CPU 12.1% / MEM 45.2% / 温度 52 / 运行 1d2h
|
||
短信: 收 12 / 发 3
|
||
```
|
||
|
||
短信发送:
|
||
|
||
```text
|
||
短信发送结果:
|
||
✅ 主卡 发送成功 path=/xxx
|
||
❌ 副卡 发送失败: timed out
|
||
```
|
||
|
||
## 安全约定
|
||
|
||
- 插件头注和代码内都做了管理员限制。
|
||
- 配置管理、短信发送都仅管理员可用。
|
||
- 不在源码中硬编码任何 SimAdmin 地址或密钥。
|
||
- `token` 只用于兼容反代/网关鉴权;当前 SimAdmin 本身 API 如无鉴权也可留空。
|
||
- 短信号码只允许数字、空格、`-`、国际区号 `+`。
|
||
- 短信内容最大 1000 字,避免误发超长内容。
|
||
- 删除实例需要输入 `yes` 二次确认。
|