tct-main.go 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. package controllers_scraper
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "kkscrap-go/controllers/scraper/cafe24"
  6. "kkscrap-go/controllers/scraper/godo"
  7. "kkscrap-go/controllers/scraper/magento"
  8. "kkscrap-go/controllers/scraper/shopify"
  9. "kkscrap-go/locals"
  10. "kkscrap-go/controllers/scraper/wordpress"
  11. "kkscrap-go/controllers/scraper/young"
  12. "kkscrap-go/model"
  13. "net/http"
  14. "net/url"
  15. "regexp"
  16. "strings"
  17. util "kkscrap-go/controllers/scraper/util"
  18. // "golang.org/x/crypto/bcrypt"
  19. "github.com/labstack/echo"
  20. )
  21. type SolutionTypeGetReq struct {
  22. Url string
  23. }
  24. func SolutionTypeGet(c echo.Context) error {
  25. v := c.Get("receiver").(SolutionTypeGetReq)
  26. retv := &struct {
  27. SolutionType string
  28. ThemeType string
  29. }{}
  30. fmt.Println(v.Url)
  31. // (1) function 공유될 수 있도록 해서 작업요
  32. // v.SolutionType, v.ThemeType = solType(&kkk)
  33. retv.SolutionType = "Wordpress"
  34. retv.ThemeType = "Avada"
  35. // ret, _ := json.MarshalIndent(itemInfo, "", "\t")
  36. ret, _ := json.Marshal(retv)
  37. return c.JSONBlob(http.StatusOK, ret)
  38. }
  39. type ProductPageGetReq struct {
  40. SolutionType string
  41. ThemeType string
  42. Products []ProductUri
  43. }
  44. type ProductUri struct {
  45. Uri string
  46. }
  47. // 오리지널 웹사이트 전체를 업테이트 하는 경우 Uri를 하나씩 보내면 비효율적이므로 하나의 배치로
  48. // 묶어서 요청할 수 있도록 한다. 주로 product-page-get를 쓰고 item-url-scrap은 deprecate 예정임.
  49. func ProductPageGet(c echo.Context) error {
  50. v := c.Get("receiver").(ProductPageGetReq)
  51. var vRet locals.ProductPage // Row(개별레코드)->Page(Row의 집합)->Book(Page의 집합)의 개념
  52. for _, row := range v.Products {
  53. // (1)Url 의 HTML를 2번 가져오는데 아래와 같이 1번만 가져와서 처리할 수 있도록 수정요.
  54. // kkk := htmlGet(row.Uri)
  55. // 전체 웹사이트가 아니라 개별 상품페이지(1개페이지)의 경우 SolutionType 없이 request됨
  56. if v.SolutionType == "" {
  57. // v.SolutionType, v.ThemeType = solType(&kkk)
  58. }
  59. prodInfo, err := parse(row.Uri)
  60. if err != nil {
  61. prodInfo.ItemNick = "Parsing Failed"
  62. }
  63. // 개별 prodInfo가 계속 추가될 수 있도록 코드를 변경요.
  64. // vRet.ProductPage = append(vRet.ProductPage, *prodInfo)
  65. }
  66. // ret, _ := json.MarshalIndent(itemInfo, "", "\t")
  67. ret, _ := json.Marshal(vRet)
  68. return c.JSONBlob(http.StatusOK, ret)
  69. }
  70. type ItemUrlScrapReq struct {
  71. ItemUrl string
  72. }
  73. func ItemUrlScrap(c echo.Context) error {
  74. v := c.Get("receiver").(ItemUrlScrapReq)
  75. // retv := &struct {
  76. // model.ItemInfo
  77. // }{}
  78. itemInfo, err := parse(v.ItemUrl)
  79. if err != nil {
  80. return c.String(604, "ertvwerawqfd-ItemUrl Parse failed: "+err.Error())
  81. }
  82. ret, _ := json.MarshalIndent(itemInfo, "", "\t")
  83. // fmt.Println(string(data))
  84. // ret, _ := json.Marshal(itemInfo)
  85. return c.JSONBlob(http.StatusOK, ret)
  86. }
  87. var regexpTitle *regexp.Regexp
  88. func init() {
  89. regexpTitle, _ = regexp.Compile("<title>(.*)</title>")
  90. }
  91. func getTitle(body string) string {
  92. ss := regexpTitle.FindAllStringSubmatch(body, 1)
  93. if len(ss) == 1 {
  94. return ss[0][1]
  95. }
  96. return ""
  97. }
  98. func parse(uri string) (ret model.ItemInfo, err error) {
  99. t, err := getSolutionType(uri)
  100. if err != nil {
  101. return
  102. }
  103. ret = parseSolution(t, uri)
  104. return
  105. }
  106. func parseSolution(t model.SolutionType, uri string) (ret model.ItemInfo) {
  107. ret.SolutionName = t
  108. u, err := url.Parse(uri)
  109. if err != nil {
  110. return
  111. }
  112. ret.DomainName = u.Host
  113. ret.DomainURI = uri
  114. if t == model.SolutionTypeWooCommerce {
  115. wordpress.Parse(uri, &ret)
  116. } else if t == model.SolutionTypeShopify {
  117. shopify.Parse(uri, &ret)
  118. } else if t == model.SolutionTypeMagento {
  119. magento.Parse(uri, &ret)
  120. } else if t == model.SolutionTypeCafe24 {
  121. cafe24.Parse(uri, &ret)
  122. } else if t == model.SolutionTypeGodo {
  123. godo.Parse(uri, &ret)
  124. } else if t == model.SolutionTypeYoung {
  125. young.Parse(uri, &ret)
  126. } else if t == model.SolutionTypeOthers {
  127. magento.Parse(uri, &ret)
  128. }
  129. return
  130. }
  131. func getSolutionType(url string) (t model.SolutionType, reterr error) {
  132. body, err := util.Get(url)
  133. if err != nil {
  134. reterr = err
  135. return
  136. }
  137. if strings.Contains(body, "window.CAFE24") {
  138. t = model.SolutionTypeCafe24
  139. } else if strings.Contains(body, "woocommerce-page") {
  140. t = model.SolutionTypeWooCommerce
  141. } else if strings.Contains(body, "고도몰5") {
  142. t = model.SolutionTypeGodo
  143. } else if strings.Contains(body, "cdn.shopify.com") {
  144. t = model.SolutionTypeShopify
  145. } else if strings.Contains(body, "magento") {
  146. t = model.SolutionTypeMagento
  147. } else if strings.Contains(body, "it_id=") {
  148. t = model.SolutionTypeYoung
  149. } else {
  150. t = model.SolutionTypeOthers
  151. //reterr = errors.New("no found solution type")
  152. }
  153. //ioutil.WriteFile(string(t) + ".html", []byte(body), 644)
  154. return
  155. }