SussBi.go 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. package outServer
  2. import (
  3. "fmt"
  4. "net/http"
  5. "net/http/cookiejar"
  6. "net/url"
  7. "regexp"
  8. "strings"
  9. "time"
  10. "github.com/gogf/gf/v2/net/ghttp"
  11. "github.com/gogf/gf/v2/util/gconv"
  12. "golang.org/x/net/publicsuffix"
  13. )
  14. type sussBi struct {
  15. addr string
  16. loginAddr string
  17. user string
  18. pwd string
  19. Url *url.URL
  20. cookiePath string
  21. jar *cookiejar.Jar
  22. succbiJar *cookiejar.Jar
  23. prm *ParamReplaceManager
  24. }
  25. // 参数替换
  26. type ParamReplace struct {
  27. Replace []ParamReplaceSetting
  28. Match []ParamReplaceSetting
  29. }
  30. type ParamReplaceSetting struct {
  31. Key, Value string
  32. }
  33. type ParamReplaceManager struct {
  34. eqRouters map[string]*ParamReplace
  35. regexRouter map[*regexp.Regexp]*ParamReplace
  36. }
  37. func InitSussBi(config map[string]interface{}) (*sussBi, error) {
  38. address := gconv.String(config["addr"])
  39. user := gconv.String(config["user"])
  40. password := gconv.String(config["password"])
  41. paramReplace := gconv.Map(config["paramReplace"])
  42. cookiePath := gconv.String(config["cookiePath"])
  43. loginAddr := gconv.String(config["loginAddr"])
  44. if address == "" {
  45. return nil, fmt.Errorf("配置异常")
  46. }
  47. sussCookie, err := cookiejar.New(&cookiejar.Options{
  48. PublicSuffixList: publicsuffix.List,
  49. })
  50. if err != nil {
  51. return nil, fmt.Errorf("初始化cookie异常")
  52. }
  53. sussCookie2, err2 := cookiejar.New(&cookiejar.Options{
  54. PublicSuffixList: publicsuffix.List,
  55. })
  56. if err2 != nil {
  57. return nil, fmt.Errorf("初始化cookie异常")
  58. }
  59. prManager := &ParamReplaceManager{
  60. eqRouters: map[string]*ParamReplace{},
  61. regexRouter: map[*regexp.Regexp]*ParamReplace{},
  62. }
  63. for url, setting := range paramReplace {
  64. pr := &ParamReplace{}
  65. settingMap := gconv.Map(setting)
  66. if settingMap == nil || len(settingMap) == 0 {
  67. continue
  68. }
  69. if replaceMap := gconv.Map(settingMap["replace"]); replaceMap != nil && len(replaceMap) > 0 {
  70. for k, v := range replaceMap {
  71. pr.Replace = append(pr.Replace, ParamReplaceSetting{
  72. Key: k,
  73. Value: gconv.String(v),
  74. })
  75. }
  76. }
  77. replaceMap := gconv.Map(settingMap["match"])
  78. if replaceMap != nil && len(replaceMap) > 0 {
  79. for k, v := range replaceMap {
  80. pr.Match = append(pr.Match, ParamReplaceSetting{
  81. Key: k,
  82. Value: gconv.String(v),
  83. })
  84. }
  85. }
  86. if len(pr.Match) == 0 && len(pr.Replace) == 0 {
  87. continue
  88. }
  89. if regexp.QuoteMeta(url) == url {
  90. prManager.eqRouters[url] = pr
  91. } else {
  92. if reg, err := regexp.Compile(url); err == nil {
  93. prManager.regexRouter[reg] = pr
  94. }
  95. }
  96. }
  97. u, _ := url.Parse(address)
  98. return &sussBi{
  99. addr: address,
  100. user: user,
  101. Url: u,
  102. pwd: password,
  103. loginAddr: loginAddr,
  104. cookiePath: cookiePath,
  105. jar: sussCookie,
  106. succbiJar: sussCookie2,
  107. prm: prManager,
  108. }, nil
  109. }
  110. // AutoLogin 自动登录
  111. func (s *sussBi) AutoLogin() error {
  112. client := &http.Client{
  113. Jar: s.jar,
  114. }
  115. resp, err := client.Get(fmt.Sprintf("%s/?:user=%s&:password=%s", s.addr, s.user, s.pwd))
  116. if err != nil {
  117. return err
  118. }
  119. if !(resp.StatusCode == 302 || resp.StatusCode == 200) {
  120. return fmt.Errorf("自动登录异常")
  121. }
  122. client.Jar = s.succbiJar
  123. resp, err = client.Get(fmt.Sprintf("%s/succbi/?:user=%s&:password=%s", s.addr, s.user, s.pwd))
  124. if err != nil {
  125. return err
  126. }
  127. if !(resp.StatusCode == 302 || resp.StatusCode == 200) {
  128. return fmt.Errorf("自动登录异常")
  129. }
  130. return nil
  131. }
  132. // RequestLogin 装配登录状态
  133. func (s *sussBi) RequestLogin(r *ghttp.Request) error {
  134. if strings.HasPrefix(r.URL.Path, "/succbi") {
  135. u, e := url.Parse(s.Url.String() + "/succbi")
  136. if e != nil {
  137. return e
  138. }
  139. //cookies2 := s.succbiJar.Cookies(s.Url)
  140. //fmt.Println(cookies2)
  141. if cookies := s.succbiJar.Cookies(u); len(cookies) > 0 {
  142. r.Request.AddCookie(cookies[0])
  143. }
  144. } else {
  145. if cookies := s.jar.Cookies(s.Url); len(cookies) > 0 {
  146. r.Request.AddCookie(cookies[0])
  147. }
  148. }
  149. return nil
  150. }
  151. // CheckLoginOut 检测登录状态是否过期
  152. func (s *sussBi) CheckLoginOut(r *ghttp.Request) bool {
  153. return true
  154. if r.Response.Status == 401 {
  155. return true
  156. }
  157. return false
  158. }
  159. func (s *sussBi) Filter(r *ghttp.Request) error {
  160. http.SetCookie(r.Response.ResponseWriter, &http.Cookie{
  161. Name: "BITOKEN",
  162. Path: "/",
  163. HttpOnly: false,
  164. MaxAge: 604800,
  165. Expires: time.Now().AddDate(0, 0, 7),
  166. })
  167. return nil
  168. }