server.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. package analysiscode
  2. import (
  3. "analysiscode/proto"
  4. "bytes"
  5. "context"
  6. "encoding/json"
  7. "fmt"
  8. "log"
  9. "net"
  10. "net/http"
  11. "os"
  12. "qfw/util"
  13. "spiderutil"
  14. "time"
  15. "github.com/imroc/req"
  16. "google.golang.org/grpc"
  17. )
  18. func init() {
  19. util.ReadConfig(&spiderutil.Config) //初始化参数
  20. }
  21. type CodeService struct {
  22. proto.GetCodeServer
  23. }
  24. //server
  25. func main1() {
  26. util.Debug("port", spiderutil.Config.ServerPort)
  27. lis, err := net.Listen("tcp", spiderutil.Config.ServerPort)
  28. if err != nil {
  29. log.Println("failed to listen: ", err)
  30. }
  31. //create a server
  32. s := grpc.NewServer()
  33. //注册事件
  34. proto.RegisterGetCodeServer(s, &CodeService{})
  35. s.Serve(lis)
  36. }
  37. func (cs *CodeService) GetCodeByImgPath(ctx context.Context, req *proto.GetCodebyImgPathReq) (*proto.GetCodebyImgPathResp, error) {
  38. defer util.Catch()
  39. //根据图片地址解析出code
  40. util.Debug("Img Path:", req.Imgpath)
  41. code, headers, cookies := getCode(req.Imgpath, req.Stype, req.Head, req.Cookie)
  42. head, _ := json.Marshal(headers)
  43. cookie, _ := json.Marshal(cookies)
  44. return &proto.GetCodebyImgPathResp{
  45. Code: code,
  46. Head: string(head),
  47. Cookie: string(cookie),
  48. }, nil
  49. }
  50. func getCode(path, stype, head, cookie string) (code string, respheader http.Header, respcookie []*http.Cookie) {
  51. // log.Println("cookie---", cookie)
  52. // log.Println("stype---", stype)
  53. defer util.Catch()
  54. client := req.C().SetTimeout(spiderutil.Config.TimeOut * time.Second)
  55. headers := map[string]string{}
  56. if head != "" {
  57. json.Unmarshal([]byte(head), &headers)
  58. }
  59. cookies := []*http.Cookie{}
  60. if cookie != "" {
  61. json.Unmarshal([]byte(cookie), &cookies)
  62. }
  63. //log.Println("headers:", headers)
  64. //log.Println("cookies:", cookies)
  65. for times := 1; times <= 3; times++ { //重试三次
  66. request := client.R()
  67. if len(headers) > 0 {
  68. request.SetHeaders(headers)
  69. }
  70. if len(cookies) > 0 {
  71. request.SetCookies(cookies...)
  72. }
  73. //下载验证码图片
  74. getCodeResp, err := request.Get(path)
  75. //log.Println("respHeader---", getCodeResp.Header)
  76. //log.Println("respCookie---", getCodeResp.Cookies())
  77. if err != nil {
  78. log.Println("Get Code By Path Error: ", err)
  79. continue
  80. }
  81. //savefile(getCodeResp)
  82. //解析验证码
  83. data := map[string]string{
  84. "grant_type": "",
  85. "username": spiderutil.Config.UserName,
  86. "password": spiderutil.Config.PassWord,
  87. "scope": "",
  88. "client_id": "",
  89. "client_secret ": "",
  90. }
  91. codeResp, err := client.R().
  92. SetHeader("accept", "application/json").
  93. SetFileReader("file", "1", bytes.NewReader(getCodeResp.Bytes())).
  94. SetFormData(data).
  95. Post(spiderutil.Config.ServerCodeAddress + stype)
  96. //SetFile("file", "C:/Users/topnet/Desktop/code.jpg").
  97. // Post(spiderutil.Config.ServerCodeAddress)
  98. if err != nil {
  99. log.Println("analysis code by path err: ", err)
  100. continue
  101. }
  102. codeResult := map[string]interface{}{}
  103. json.Unmarshal(codeResp.Bytes(), &codeResult)
  104. log.Println("codeResult:", codeResult)
  105. if yzm, ok := codeResult["r"].(map[string]interface{})["pic_str"].(string); ok && yzm != "" {
  106. code = yzm
  107. respheader = getCodeResp.Header
  108. respcookie = getCodeResp.Cookies()
  109. return
  110. }
  111. }
  112. return
  113. }
  114. func savefile(resp *req.Response) {
  115. filename := fmt.Sprint(time.Now().Unix()) + ".jpg"
  116. file, _ := os.Create(filename)
  117. defer file.Close()
  118. file.Write(resp.Bytes())
  119. }
  120. //func main() {
  121. // log.Println(util.Config)
  122. // conn, err := grpc.Dial("127.0.0.1"+util.Config.Port, grpc.WithInsecure())
  123. // if err != nil {
  124. // log.Fatalf("did not connect: %v", err)
  125. // }
  126. // defer conn.Close()
  127. // client := proto.NewGetCodeServerClient(conn)
  128. // codeImgReq := &proto.GetCodebyImgPathReq{
  129. // Imgpath:
  130. // }
  131. // getCodeByImg(client, codeImgReq)
  132. //
  133. //}
  134. //