Files

287 lines
7.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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` 二次确认。