webservice.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  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. qu.Debug("CSS", req.Key, req.Css, req.Url)
  85. /*//TODO 业务操作
  86. switch req.Key {
  87. case "listItemCss":
  88. ws.currentSpiderConfig.ListItemCss = req.Css
  89. case "listLinkCss":
  90. ws.currentSpiderConfig.ListLinkCss = req.Css
  91. case "listPublishTimeCss":
  92. ws.currentSpiderConfig.ListPubtimeCss = req.Css
  93. case "listNextPageCss":
  94. ws.currentSpiderConfig.ListNextPageCss = req.Css
  95. case "listBodyCss":
  96. ws.currentSpiderConfig.ListBodyCss = req.Css
  97. case "titleCss":
  98. ws.currentSpiderConfig.TitleCss = req.Css
  99. case "publishUnitCss":
  100. ws.currentSpiderConfig.PublishUnitCss = req.Css
  101. case "publishTimeCss":
  102. ws.currentSpiderConfig.PublishTimeCss = req.Css
  103. case "contentCss":
  104. ws.currentSpiderConfig.ContentCss = req.Css
  105. case "attachCss":
  106. ws.currentSpiderConfig.AttachCss = req.Css
  107. }
  108. fmt.Fprint(w, "{'code':200}")
  109. ws.db.SaveOrUpdate(ws.currentSpiderConfig)*/
  110. fmt.Fprint(w, "{'code':200}")
  111. //TODO 通知开发工具端,CSS选择器有变动
  112. ws.enf.Dispatch("spiderConfigChange", map[string]interface{}{"key": req.Key, "css": req.Css, "url": req.Url})
  113. }
  114. // LoadSpiderConfig LoadCurrentSpiderConfig,加载,返回当前配置项
  115. func (ws *WebService) LoadSpiderConfig(w http.ResponseWriter, r *http.Request) {
  116. qu.Debug("加载当前配置项")
  117. w.Header().Set("Access-Control-Allow-Origin", "*")
  118. w.Header().Set("Content-Type", "application/json")
  119. var req = new(SpiderConfigItem)
  120. err := json.NewDecoder(r.Body).Decode(req)
  121. if err != nil {
  122. qu.Debug("序列化失败")
  123. http.Error(w, err.Error(), http.StatusBadRequest)
  124. return
  125. } else {
  126. qu.Debug("高亮:", req.Url, *currentTabSpiderConfig)
  127. err = json.NewEncoder(w).Encode(currentTabSpiderConfig)
  128. if err != nil {
  129. log.Println("反向序列化失败")
  130. http.Error(w, err.Error(), http.StatusBadRequest)
  131. return
  132. }
  133. }
  134. }
  135. func SetCurrentTabCssMark(sc *be.SpiderConfig) {
  136. currentTabSpiderConfig = sc
  137. qu.Debug("当前编辑爬虫链接:", currentTabSpiderConfig)
  138. }