item.go
2.39 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
package service
import (
"bunjang/model"
"encoding/json"
"fmt"
"io"
"io/ioutil"
"log"
"net/http"
"net/url"
"strconv"
"strings"
)
func GetItemByKeyword(keyword string) ([]model.Item, error) {
var items []model.Item
responseItems, err := getApiResponseItems(keyword)
if err != nil {
return nil, err
}
for _, responseItem := range responseItems {
extraInfo, err := getItemExtraInfo(responseItem.Pid)
if err != nil {
return nil, err
}
item := model.Item{
Platform: "번개장터",
Name: responseItem.Name,
Price: priceStringToInt(responseItem.Price),
ThumbnailUrl: responseItem.ProductImage,
ItemUrl: "https://m.bunjang.co.kr/products/" + responseItem.Pid,
ExtraInfo: extraInfo,
}
items = append(items, item)
}
return items, nil
}
func getApiResponseItems(keyword string) ([]model.ApiResponseItem, error) {
encText := url.QueryEscape(keyword)
apiUrl := fmt.Sprintf("https://api.bunjang.co.kr/api/1/find_v2.json?q=%s&order=score", encText)
response, err := getResponse(apiUrl)
if err != nil {
return nil, err
}
var apiResponse model.ApiResponse
err = json.Unmarshal(response, &apiResponse)
if err != nil {
return nil, err
}
return apiResponse.Items, nil
}
func getItemExtraInfo(pid string) (string, error) {
apiUrl := fmt.Sprintf("https://api.bunjang.co.kr/api/1/product/%s/detail_info.json", pid)
response, err := getResponse(apiUrl)
if err != nil {
return "", err
}
var itemInfo map[string]interface{}
err = json.Unmarshal(response, &itemInfo)
if err != nil {
return "", err
}
extraInfo := itemInfo["item_info"].(map[string]interface{})["description_for_detail"].(string)
return extraInfo, nil
}
func getResponse(url string) ([]byte, error) {
req, err := http.NewRequest("GET", url, nil)
if err != nil {
return nil, err
}
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
return nil, err
}
defer func(Body io.ReadCloser) {
err := Body.Close()
if err != nil {
log.Fatal(err)
}
}(resp.Body)
response, _ := ioutil.ReadAll(resp.Body)
return response, nil
}
func priceStringToInt(priceString string) int {
strings.TrimSpace(priceString)
if priceString == "" {
return 0
}
priceString = strings.ReplaceAll(priceString, "원", "")
priceString = strings.ReplaceAll(priceString, ",", "")
price, err := strconv.Atoi(priceString)
if err != nil {
log.Fatal(err)
}
return price
}