data_processor.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. // Package fenwei
  2. // @Author gmy 2024/8/20 14:47:00
  3. package fenwei
  4. import (
  5. "bytes"
  6. "context"
  7. "eta/eta_data_analysis/utils"
  8. "fmt"
  9. "github.com/chromedp/cdproto/network"
  10. "github.com/chromedp/chromedp"
  11. "io"
  12. "log"
  13. "net/http"
  14. "time"
  15. )
  16. type DataProcessor interface {
  17. FetchAndProcess() (string, error)
  18. GenerateRequestParams(string) map[string]string
  19. }
  20. type BaseProcessor struct {
  21. URL string
  22. }
  23. func (p *BaseProcessor) FetchAndProcess() (string, error) {
  24. // 获取当前时间 yyyy-MM-dd
  25. now := time.Now()
  26. currentTime := now.Format(utils.FormatDateUnSpace)
  27. params := p.GenerateRequestParams(currentTime)
  28. req, err := http.NewRequest("POST", p.URL, bytes.NewBufferString(params["params"]))
  29. if err != nil {
  30. return "", err
  31. }
  32. // 设置请求头
  33. req.Header.Set("Content-Type", "application/json")
  34. req.Header.Set("accept-language", "zh-CN,zh;q=0.9")
  35. client := &http.Client{}
  36. resp, err := client.Do(req)
  37. if err != nil {
  38. return "", err
  39. }
  40. defer resp.Body.Close()
  41. body, err := io.ReadAll(resp.Body)
  42. if err != nil {
  43. return "", err
  44. }
  45. return p.ProcessResponse(string(body)), nil
  46. }
  47. // GenerateRequestParams 让子类来实现这个方法
  48. func (p *BaseProcessor) GenerateRequestParams(string) map[string]string {
  49. return map[string]string{}
  50. }
  51. func (p *BaseProcessor) ProcessResponse(data string) string {
  52. return "Processed Data: " + data
  53. }
  54. // GetCookieByChrome 获取cookie
  55. func getCookieByChrome() (cookieStr string, err error) {
  56. // 读取Cookie
  57. if utils.FenweiNetUseName == "" {
  58. err = fmt.Errorf("汾渭账号未设置")
  59. return
  60. }
  61. if utils.FenweiNetPassword == "" {
  62. err = fmt.Errorf("汾渭密码未设置")
  63. return
  64. }
  65. opts := append(
  66. chromedp.DefaultExecAllocatorOptions[:],
  67. chromedp.Flag("headless", false),
  68. )
  69. allocCtx, cancel1 := chromedp.NewExecAllocator(context.Background(), opts...)
  70. defer cancel1()
  71. // 创建chrome实例
  72. ctx, cancel2 := chromedp.NewContext(
  73. allocCtx,
  74. chromedp.WithLogf(log.Printf),
  75. )
  76. defer cancel2()
  77. err = chromedp.Run(ctx,
  78. chromedp.Navigate(`https://www.sxcoal.com/`),
  79. chromedp.Click(`.pc_content__jO_mq`, chromedp.ByQuery),
  80. chromedp.Sleep(2*time.Second),
  81. chromedp.SetValue(`div.Sign_username__7eYwE input[type="text"]`, utils.FenweiNetUseName, chromedp.ByQuery),
  82. chromedp.SetValue(`div.Sign_password__dwxMn input[type="password"]`, utils.FenweiNetPassword, chromedp.ByQuery),
  83. chromedp.Sleep(2*time.Second),
  84. // 登录
  85. chromedp.Click(`.Button_text__D25sy`, chromedp.ByQuery),
  86. chromedp.ActionFunc(func(ctx context.Context) error {
  87. cookies, err := network.GetCookies().Do(ctx)
  88. if err != nil {
  89. return err
  90. }
  91. for _, v := range cookies {
  92. cookieStr = cookieStr + v.Name + "=" + v.Value + ";"
  93. }
  94. utils.FileLog.Info("header cookie:" + cookieStr)
  95. return nil
  96. }),
  97. )
  98. return
  99. }
  100. func encodeParams(params map[string]string) string {
  101. var result string
  102. for key, value := range params {
  103. result += fmt.Sprintf("%s=%s&", key, value)
  104. }
  105. return result[:len(result)-1]
  106. }