package utils import ( "crypto/md5" "encoding/json" "errors" "fmt" "github.com/go-resty/resty/v2" "go-wechat/model" "log" ) // LeiGod // @description: 雷神加速器相关接口 type LeiGod interface { Login() error // 登录 Info() (model.LeiGodUserInfoResp, error) // 获取用户信息 Pause() error // 暂停加速 } type leiGod struct { account, password string // 账号、密码 token string } // LeiGodUtil // @description: 创建一个雷神加速器工具类 // @param userId // @return leiGodI func LeiGodUtil(account, password string) LeiGod { // 把密码md5一下 hash := md5.New() hash.Write([]byte(password)) password = fmt.Sprintf("%x", hash.Sum(nil)) return &leiGod{account: account, password: password} } // Login // @description: 登录 // @receiver l // @return string func (l *leiGod) Login() (err error) { // 组装参数 param := map[string]any{ "account_token": nil, "country_code": 86, "lang": "zh_CN", "os_type": 4, "mobile_num": l.account, "username": l.account, "password": l.password, "region_code": 1, "src_channel": "guanwang", "sem_ad_img_url": map[string]any{ "btn_yrl": "", "url": "", }, } pbs, _ := json.Marshal(param) var loginResp model.Response[any] var resp *resty.Response res := resty.New() resp, err = res.R(). SetHeader("Content-Type", "application/json;chartset=utf-8"). SetBody(string(pbs)). SetResult(&loginResp). Post("https://webapi.leigod.com/api/auth/login") if err != nil { log.Panicf("雷神加速器登录失败: %s", err.Error()) } log.Printf("雷神加速器登录结果: %s", unicodeToText(resp.String())) // 返回状态码不是0表示有错 if loginResp.Code != 0 { return errors.New(loginResp.Msg) } // 将Data字段转为结构体 var bs []byte if bs, err = json.Marshal(loginResp.Data); err != nil { return } var loginInfo model.LeiGodLoginResp if err = json.Unmarshal(bs, &loginInfo); err != nil { return } if loginInfo.LoginInfo.AccountToken != "" { l.token = loginInfo.LoginInfo.AccountToken } return } // Info // @description: 获取用户信息 // @receiver l // @return string func (l *leiGod) Info() (ui model.LeiGodUserInfoResp, err error) { // 组装参数 param := map[string]any{ "account_token": l.token, "lang": "zh_CN", "os_type": 4, } pbs, _ := json.Marshal(param) var userInfoResp model.Response[model.LeiGodUserInfoResp] var resp *resty.Response res := resty.New() resp, err = res.R(). SetHeader("Content-Type", "application/json;chartset=utf-8"). SetBody(string(pbs)). SetResult(&userInfoResp). Post("https://webapi.leigod.com/api/user/info") if err != nil { log.Panicf("雷神加速器用户信息获取失败: %s", err.Error()) } log.Printf("雷神加速器用户信息获取结果: %s", unicodeToText(resp.String())) // 返回状态码不是0表示有错 if userInfoResp.Code != 0 { err = errors.New(userInfoResp.Msg) return } return userInfoResp.Data, err } // Pause // @description: 暂停加速 // @receiver l // @return string func (l *leiGod) Pause() (err error) { // 组装参数 param := map[string]any{ "account_token": l.token, "lang": "zh_CN", "os_type": 4, } pbs, _ := json.Marshal(param) var pauseResp model.Response[any] var resp *resty.Response res := resty.New() resp, err = res.R(). SetHeader("Content-Type", "application/json;chartset=utf-8"). SetBody(string(pbs)). SetResult(&pauseResp). Post("https://webapi.leigod.com/api/user/pause") if err != nil { log.Panicf("雷神加速器暂停失败: %s", err.Error()) } log.Printf("雷神加速器暂停结果: %s", unicodeToText(resp.String())) // 返回状态码不是0表示有错 if pauseResp.Code != 0 { err = errors.New(pauseResp.Msg) return } return }