package outServer import ( "fmt" "net/http" "net/http/cookiejar" "net/url" "regexp" "strings" "time" "github.com/gogf/gf/v2/net/ghttp" "github.com/gogf/gf/v2/util/gconv" "golang.org/x/net/publicsuffix" ) type sussBi struct { addr string loginAddr string user string pwd string Url *url.URL cookiePath string jar *cookiejar.Jar succbiJar *cookiejar.Jar prm *ParamReplaceManager } // 参数替换 type ParamReplace struct { Replace []ParamReplaceSetting Match []ParamReplaceSetting } type ParamReplaceSetting struct { Key, Value string } type ParamReplaceManager struct { eqRouters map[string]*ParamReplace regexRouter map[*regexp.Regexp]*ParamReplace } func InitSussBi(config map[string]interface{}) (*sussBi, error) { address := gconv.String(config["addr"]) user := gconv.String(config["user"]) password := gconv.String(config["password"]) paramReplace := gconv.Map(config["paramReplace"]) cookiePath := gconv.String(config["cookiePath"]) loginAddr := gconv.String(config["loginAddr"]) if address == "" { return nil, fmt.Errorf("配置异常") } sussCookie, err := cookiejar.New(&cookiejar.Options{ PublicSuffixList: publicsuffix.List, }) if err != nil { return nil, fmt.Errorf("初始化cookie异常") } sussCookie2, err2 := cookiejar.New(&cookiejar.Options{ PublicSuffixList: publicsuffix.List, }) if err2 != nil { return nil, fmt.Errorf("初始化cookie异常") } prManager := &ParamReplaceManager{ eqRouters: map[string]*ParamReplace{}, regexRouter: map[*regexp.Regexp]*ParamReplace{}, } for url, setting := range paramReplace { pr := &ParamReplace{} settingMap := gconv.Map(setting) if settingMap == nil || len(settingMap) == 0 { continue } if replaceMap := gconv.Map(settingMap["replace"]); replaceMap != nil && len(replaceMap) > 0 { for k, v := range replaceMap { pr.Replace = append(pr.Replace, ParamReplaceSetting{ Key: k, Value: gconv.String(v), }) } } replaceMap := gconv.Map(settingMap["match"]) if replaceMap != nil && len(replaceMap) > 0 { for k, v := range replaceMap { pr.Match = append(pr.Match, ParamReplaceSetting{ Key: k, Value: gconv.String(v), }) } } if len(pr.Match) == 0 && len(pr.Replace) == 0 { continue } if regexp.QuoteMeta(url) == url { prManager.eqRouters[url] = pr } else { if reg, err := regexp.Compile(url); err == nil { prManager.regexRouter[reg] = pr } } } u, _ := url.Parse(address) return &sussBi{ addr: address, user: user, Url: u, pwd: password, loginAddr: loginAddr, cookiePath: cookiePath, jar: sussCookie, succbiJar: sussCookie2, prm: prManager, }, nil } // AutoLogin 自动登录 func (s *sussBi) AutoLogin() error { client := &http.Client{ Jar: s.jar, } resp, err := client.Get(fmt.Sprintf("%s/?:user=%s&:password=%s", s.addr, s.user, s.pwd)) if err != nil { return err } if !(resp.StatusCode == 302 || resp.StatusCode == 200) { return fmt.Errorf("自动登录异常") } client.Jar = s.succbiJar resp, err = client.Get(fmt.Sprintf("%s/succbi/?:user=%s&:password=%s", s.addr, s.user, s.pwd)) if err != nil { return err } if !(resp.StatusCode == 302 || resp.StatusCode == 200) { return fmt.Errorf("自动登录异常") } return nil } // RequestLogin 装配登录状态 func (s *sussBi) RequestLogin(r *ghttp.Request) error { if strings.HasPrefix(r.URL.Path, "/succbi") { u, e := url.Parse(s.Url.String() + "/succbi") if e != nil { return e } //cookies2 := s.succbiJar.Cookies(s.Url) //fmt.Println(cookies2) if cookies := s.succbiJar.Cookies(u); len(cookies) > 0 { r.Request.AddCookie(cookies[0]) } } else { if cookies := s.jar.Cookies(s.Url); len(cookies) > 0 { r.Request.AddCookie(cookies[0]) } } return nil } // CheckLoginOut 检测登录状态是否过期 func (s *sussBi) CheckLoginOut(r *ghttp.Request) bool { return true if r.Response.Status == 401 { return true } return false } func (s *sussBi) Filter(r *ghttp.Request) error { http.SetCookie(r.Response.ResponseWriter, &http.Cookie{ Name: "BITOKEN", Path: "/", HttpOnly: false, MaxAge: 604800, Expires: time.Now().AddDate(0, 0, 7), }) return nil }