webservice.go 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. // 对外服务
  2. package webservice
  3. import (
  4. "crypto/tls"
  5. _ "embed"
  6. "encoding/json"
  7. "fmt"
  8. qu "jygit.jydev.jianyu360.cn/data_processing/common_utils"
  9. "log"
  10. "net/http"
  11. be "spider_creator/backend"
  12. bdb "spider_creator/backend/db"
  13. )
  14. const (
  15. LISTEN_ADDR = ":8080"
  16. )
  17. type (
  18. SpiderConfigItem struct {
  19. Key string `json:"key"`
  20. Css string `json:"css"`
  21. Url string `json:"url"`
  22. }
  23. WebService struct {
  24. db *bdb.SpiderDb
  25. enf be.EventNotifyFace
  26. currentSpiderConfig *be.SpiderConfig
  27. }
  28. )
  29. var (
  30. //go:embed cert.pem
  31. certBytes []byte
  32. //go:embed key.pem
  33. keyBytes []byte
  34. currentTabSpiderConfig = &be.SpiderConfig{}
  35. )
  36. // NewWebService
  37. func NewWebService(db *bdb.SpiderDb, enf be.EventNotifyFace, csf *be.SpiderConfig) *WebService {
  38. return &WebService{db, enf, csf}
  39. }
  40. func (ws *WebService) RunHttpServe() {
  41. // 设置HTTP服务器
  42. mux := http.NewServeMux()
  43. // 解析证书
  44. cert, err := tls.X509KeyPair(certBytes, keyBytes)
  45. if err != nil {
  46. qu.Debug(err.Error())
  47. return
  48. }
  49. // 创建一个TLS配置
  50. tlsConfig := &tls.Config{
  51. // 可以在这里添加其他TLS配置
  52. Certificates: []tls.Certificate{cert},
  53. ServerName: "localhost",
  54. InsecureSkipVerify: true,
  55. }
  56. server := &http.Server{
  57. Addr: LISTEN_ADDR,
  58. Handler: mux,
  59. TLSConfig: tlsConfig,
  60. }
  61. //这里注册HTTP服务
  62. mux.HandleFunc("/save", ws.SaveSpiderConfig)
  63. mux.HandleFunc("/load", ws.LoadSpiderConfig)
  64. //
  65. qu.Debug("Starting HTTPS server on ", LISTEN_ADDR)
  66. err = server.ListenAndServeTLS("", "")
  67. if err != nil {
  68. qu.Debug("Failed to start server: ", err.Error())
  69. return
  70. }
  71. }
  72. // SaveSpiderConfig LoadCurrentSpiderConfig,json处理
  73. func (ws *WebService) SaveSpiderConfig(w http.ResponseWriter, r *http.Request) {
  74. qu.Debug("保存设置")
  75. w.Header().Set("Access-Control-Allow-Origin", "*")
  76. w.Header().Set("Content-Type", "application/json")
  77. var req = new(SpiderConfigItem)
  78. err := json.NewDecoder(r.Body).Decode(req)
  79. if err != nil {
  80. qu.Debug("序列化失败")
  81. http.Error(w, err.Error(), http.StatusBadRequest)
  82. return
  83. }
  84. switch req.Key {
  85. case "listItemCss":
  86. currentTabSpiderConfig.ListItemCss = req.Css
  87. case "listLinkCss":
  88. currentTabSpiderConfig.ListLinkCss = req.Css
  89. case "listPublishTimeCss":
  90. currentTabSpiderConfig.ListPubtimeCss = req.Css
  91. case "listNextPageCss":
  92. currentTabSpiderConfig.ListNextPageCss = req.Css
  93. case "listBodyCss":
  94. currentTabSpiderConfig.ListBodyCss = req.Css
  95. case "titleCss":
  96. currentTabSpiderConfig.TitleCss = req.Css
  97. case "publishUnitCss":
  98. currentTabSpiderConfig.PublishUnitCss = req.Css
  99. case "publishTimeCss":
  100. currentTabSpiderConfig.PublishTimeCss = req.Css
  101. case "contentCss":
  102. currentTabSpiderConfig.ContentCss = req.Css
  103. case "attachCss":
  104. currentTabSpiderConfig.AttachCss = req.Css
  105. }
  106. qu.Debug("CSS", req.Key, req.Css, req.Url)
  107. fmt.Fprint(w, "{'code':200}")
  108. //TODO 通知开发工具端,CSS选择器有变动
  109. ws.enf.Dispatch("spiderConfigChange", map[string]interface{}{"key": req.Key, "css": req.Css, "url": req.Url})
  110. }
  111. // LoadSpiderConfig LoadCurrentSpiderConfig,加载,返回当前配置项
  112. func (ws *WebService) LoadSpiderConfig(w http.ResponseWriter, r *http.Request) {
  113. qu.Debug("加载当前配置项")
  114. w.Header().Set("Access-Control-Allow-Origin", "*")
  115. w.Header().Set("Content-Type", "application/json")
  116. var req = new(SpiderConfigItem)
  117. err := json.NewDecoder(r.Body).Decode(req)
  118. if err != nil {
  119. qu.Debug("序列化失败")
  120. http.Error(w, err.Error(), http.StatusBadRequest)
  121. return
  122. } else {
  123. qu.Debug("高亮:", req.Url, *currentTabSpiderConfig)
  124. err = json.NewEncoder(w).Encode(currentTabSpiderConfig)
  125. if err != nil {
  126. log.Println("反向序列化失败")
  127. http.Error(w, err.Error(), http.StatusBadRequest)
  128. return
  129. }
  130. }
  131. }
  132. func SetCurrentTabCssMark(cssMark map[string]interface{}) {
  133. sc, err := be.NewSpiderConfig(cssMark)
  134. if err != nil {
  135. qu.Debug("标注信息传输失败!")
  136. }
  137. currentTabSpiderConfig = sc
  138. qu.Debug("当前编辑爬虫链接:", currentTabSpiderConfig)
  139. }