diff --git a/docs/adminApi.md b/docs/adminApi.md new file mode 100644 index 0000000..68dde26 --- /dev/null +++ b/docs/adminApi.md @@ -0,0 +1,232 @@ +# 管理 API + +> 支持跨域 + +## 公共参数 + +参数: + +| 参数名 | 类型 | 说明 | +| ------ | ------ | ----------- | +| access_token | string | 校验口令,config.json中配置 | + + + +## admin/do_restart + +### 热重启 + +> 热重启 + +> ps: 目前不支持ws部分的修改生效 + +method:`POST/GET` + +参数: + +| 参数名 | 类型 | 说明 | +| ------ | ---- | ------------------------------------- | +| 无||| + +返回: + +```json +{"data": {}, "retcode": 0, "status": "ok"} +``` + + +### admin/get_web_write + +> 拉取验证码/设备锁 + +method: `GET` + + +参数: + +| 参数名 | 类型 | 说明 | +| ------ | ------ | ----------- | +| 无||| + +返回: + +```json +{"data": {"ispic": true,"picbase64":"xxxxx"}, "retcode": 0, "status": "ok"} +``` +| 参数名 | 类型 | 说明 | +| ------ | ------ | ----------- | +| ispic| bool| 是否是验证码类型 true是,false为不是(比如设备锁| +|picbas64| string| 验证码的base64编码内容,加上头,放入img标签即可显示| + +### admin/do_web_write + +> web输入验证码/设备锁确认 + +method: `POST` formdata + + +参数: + +| 参数名 | 类型 | 说明 | +| ------ | ------ | ----------- | +| input | string | 输入的类容 | + +返回: + +```json +{"data": {}, "retcode": 0, "status": "ok"} +``` + + +### admin/do_restart_docker + +> 冷重启 + +> 注意:此api 会直接结束掉进程,需要依赖docker/supervisor等进程管理工具来自动拉起 + +method: `POST` + + +参数: + +| 参数名 |类型 | 说明 | +| ------ | ------ | -----------| +| 无 | | | + +返回: + +```json +{"data": {}, "retcode": 0, "status": "ok"} +``` + +### admin/do_config_base + +> 基础配置 + +method: `POST` formdata + + +参数: + +| 参数名 | 类型 | 说明 | +| ------ | ------ | ------------------------------------------------------------ | +| uin | string | qq号 | +| password | string | qq密码 | +| enable_db | string | 是否启动数据库,填 'true' 或者 'false' | +| access_token | string | 授权 token | + +返回: + +```json +{"data": {}, "retcode": 0, "status": "ok"} +``` + + +### admin/do_config_http + +> http服务配置 + +method: `POST` formdata + +参数: + +| 参数名 | 类型 | 说明 | +| ------ | ------ | ------------------------------------------------------------ | +| port | string | 服务端口 | +| host | string | 服务监听地址 | +| enable | string | 是否启用 ,填 'true' 或者 'false' | +| timeout | string | http请求超时时间 | +| post_url | string | post上报地址 不需要就填空字符串,或者不填| +| post_secret | string | post上报的secret 不需要就填空字符串,或者不填 | + +返回: + +```json +{"data": {}, "retcode": 0, "status": "ok"} +``` + + +### admin/do_config_ws + +> 正向ws设置 + +method: `POST` formdata + +参数: + +| 参数名 | 类型 | 说明 | +| ------ | ------ | ------------------------------------------------------------ | +| port | string | 服务端口 | +| host | string | 服务监听地址 | +| enable | string | 是否启用 ,填 'true' 或者 'false' | + + +返回: + +```json +{"data": {}, "retcode": 0, "status": "ok"} +``` + +### admin/do_config_reverse + +> 反向ws配置 + +method: `POST` formdata + +参数: + +| 参数名 | 类型 | 说明 | +| ------ | ------ | ------------------------------------------------------------ | +| port | string | 服务端口 | +| host | string | 服务监听地址 | +| enable | string | 是否启用 ,填 'true' 或者 'false' | + + +返回: + +```json +{"data": {}, "retcode": 0, "status": "ok"} +``` + +### admin/do_config_json + +> 直接修改 config.json配置 + +method: `POST` formdata + +参数: + +| 参数名 | 类型 | 说明 | +| ------ | ------ | ------------------------------------------------------------ | +| json | string | 完整的config.json的配合,json字符串 | + + +返回: + +```json +{"data": {}, "retcode": 0, "status": "ok"} +``` + +### admin/get_config_json + +> 获取当前 config.json配置 + +method: `GET` + +参数: + +| 参数名 | 类型 | 说明 | +| ------ | ------ | ------------------------------------------------------------ | +| 无 | | | + + +返回: + +```json +{"data": {"config":"xxxx"}, "retcode": 0, "status": "ok"} +``` + +| 参数名 | 类型 | 说明 | +| ------ | ------ | ------------------------------------------------------------ | +| config | string | 完整的config.json的配合,json字符串 | + diff --git a/global/config.go b/global/config.go index 71ecaaf..e380e99 100644 --- a/global/config.go +++ b/global/config.go @@ -81,6 +81,7 @@ type GoCQReverseWebsocketConfig struct { type GoCqWebUi struct { Enabled bool `json:"enabled"` + Host string `json:"host"` WebUiPort uint64 `json:"web_ui_port"` WebInput bool `json:"web_input"` } @@ -130,6 +131,7 @@ func DefaultConfig() *JsonConfig { }, WebUi: &GoCqWebUi{ Enabled: true, + Host: "0.0.0.0", WebInput: false, WebUiPort: 9999, }, diff --git a/main.go b/main.go index 15f10ab..46ce32d 100644 --- a/main.go +++ b/main.go @@ -237,17 +237,21 @@ func main() { conf.WebUi = &global.GoCqWebUi{ Enabled: true, WebInput: false, + Host: "0.0.0.0", WebUiPort: 9999, } } if conf.WebUi.WebUiPort <= 0 { conf.WebUi.WebUiPort = 9999 } + if conf.WebUi.Host == "" { + conf.WebUi.Host = "0.0.0.0" + } confErr := conf.Save("config.json") if confErr != nil { log.Error("保存配置文件失败") } - b := server.WebServer.Run(fmt.Sprintf("%s:%d", "0.0.0.0", conf.WebUi.WebUiPort), cli) + b := server.WebServer.Run(fmt.Sprintf("%s:%d", conf.WebUi.Host, conf.WebUi.WebUiPort), cli) c := server.Console signal.Notify(c, os.Interrupt, os.Kill) <-c diff --git a/server/apiAdmin.go b/server/apiAdmin.go index fd57f86..97b8d79 100644 --- a/server/apiAdmin.go +++ b/server/apiAdmin.go @@ -17,6 +17,7 @@ import ( "io/ioutil" "net/http" "os" + "os/signal" "strconv" "strings" "time" @@ -49,7 +50,7 @@ var HttpuriAdmin = map[string]func(s *webServer, c *gin.Context){ "do_config_ws": AdminDoConfigWs, //修改config.json的正向ws部分 "do_config_reverse": AdminDoConfigReverse, //修改config.json 中的反向ws部分 "do_config_json": AdminDoConfigJson, //直接修改 config.json配置 - "get_config_json": AdminDoConfigJson, //拉取 当前的config.json配置 + "get_config_json": AdminGetConfigJson, //拉取 当前的config.json配置 } func Failed(code int, msg string) coolq.MSG { @@ -69,12 +70,21 @@ func (s *webServer) Run(addr string, cli *client.QQClient) *coolq.CQBot { s.engine.Any("/admin/:action", s.admin) go func() { - log.Infof("Admin API 服务器已启动: %v", addr) - err := s.engine.Run(addr) - if err != nil { - log.Error(err) - log.Infof("请检查端口是否被占用.") - time.Sleep(time.Second * 5) + //开启端口监听 + if s.Conf.WebUi.Enabled { + log.Infof("Admin API 服务器已启动: %v", addr) + err := s.engine.Run(addr) + if err != nil { + log.Error(err) + log.Infof("请检查端口是否被占用.") + time.Sleep(time.Second * 5) + os.Exit(1) + } + } else { + //关闭端口监听 + c := make(chan os.Signal, 1) + signal.Notify(c, os.Interrupt, os.Kill) + <-c os.Exit(1) } }() @@ -99,7 +109,7 @@ func (s *webServer) Dologin() { img, _, _ := image.Decode(bytes.NewReader(rsp.CaptchaImage)) fmt.Println(asciiart.New("image", img).Art) if conf.WebUi.WebInput { - log.Warn("请输入验证码 (captcha.jpg): (http://127.0.0.1/admin/web_write 输入)") + log.Warnf("请输入验证码 (captcha.jpg): (http://%s:%d/admin/do_web_write 输入)", conf.WebUi.Host, conf.WebUi.WebUiPort) text = <-WebInput } else { log.Warn("请输入验证码 (captcha.jpg): (Enter 提交)") @@ -111,7 +121,7 @@ func (s *webServer) Dologin() { case client.UnsafeDeviceError: log.Warnf("账号已开启设备锁,请前往 -> %v <- 验证并重启Bot.", rsp.VerifyUrl) if conf.WebUi.WebInput { - log.Infof(" (http://127.0.0.1/admin/web_write 确认后继续)....") + log.Infof(" (http://%s:%d/admin/do_web_write 确认后继续)....", conf.WebUi.Host, conf.WebUi.WebUiPort) text = <-WebInput } else { log.Infof(" 按 Enter 继续....")