-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathrequest.go
165 lines (148 loc) · 5.26 KB
/
request.go
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
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
package goinside
import (
"encoding/base64"
"io"
"net/http"
"net/url"
"time"
)
// urls
const (
gallerysURL = "http://m.dcinside.com/category_gall_total.html"
commentMoreURL = "http://m.dcinside.com/comment_more_new.php"
)
// apis
const (
loginAPI dcinsideAPI = "https://dcid.dcinside.com/join/mobile_app_login.php"
appKeyVerificationAPI dcinsideAPI = "https://dcid.dcinside.com/join/mobile_app_key_verification_3rd.php"
appCheckAPI dcinsideAPI = "http://json2.dcinside.com/json0/app_check_A_rina.php"
writeArticleAPI dcinsideAPI = "http://upload.dcinside.com/_app_write_api.php"
deleteArticleAPI dcinsideAPI = "http://m.dcinside.com/api/gall_del.php"
writeCommentAPI dcinsideAPI = "http://m.dcinside.com/api/comment_ok.php"
deleteCommentAPI dcinsideAPI = "http://m.dcinside.com/api/comment_del.php"
recommendUpAPI dcinsideAPI = "http://m.dcinside.com/api/_recommend_up.php"
recommendDownAPI dcinsideAPI = "http://m.dcinside.com/api/_recommend_down.php"
reportAPI dcinsideAPI = "http://m.dcinside.com/api/report_upload.php"
redirectAPI dcinsideAPI = "http://m.dcinside.com/api/redirect.php"
readListAPI dcinsideAPI = "http://m.dcinside.com/api/gall_list_new.php"
readArticleAPI dcinsideAPI = "http://m.dcinside.com/api/view2.php"
readArticleDetailAPI dcinsideAPI = "http://m.dcinside.com/api/gall_view.php"
readArticleImageAPI dcinsideAPI = "http://m.dcinside.com/api/view_img.php"
readCommentAPI dcinsideAPI = "http://m.dcinside.com/api/comment_new.php"
majorGalleryListAPI dcinsideAPI = "http://json.dcinside.com/App/gall_name.php"
minorGalleryListAPI dcinsideAPI = "http://json.dcinside.com/App/gall_name_sub.php"
)
// content types
const (
defaultContentType = "application/x-www-form-urlencoded; charset=UTF-8"
nonCharsetContentType = "application/x-www-form-urlencoded"
)
var (
apiRequestHeader = map[string]string{
"User-Agent": "dcinside.app",
"Referer": "http://www.dcinside.com",
"Host": "upload.dcinside.com",
"Connection": "Keep-Alive",
}
mobileRequestHeader = map[string]string{
"User-Agent": "Linux Android",
"Referer": "http://m.dcinside.com",
}
imageRequestHeader = map[string]string{
"Referer": "http://www.dcinside.com",
}
)
type session interface {
articleWriteForm(string, string, string, ...string) (form io.Reader, contentType string)
articleDeleteForm(string, string) (form io.Reader, contentType string)
commentWriteForm(string, string, string, ...string) (form io.Reader, contentType string)
commentDeleteForm(string, string, string) (form io.Reader, contentType string)
actionForm(string, string) (form io.Reader, contentType string)
getAppID() string
connector
}
type dcinsideAPI string
func (api dcinsideAPI) post(c connector, form io.Reader, contentType string) (*http.Response, error) {
return do(c, "POST", string(api), nil, form, contentType, apiRequestHeader)
}
func (api dcinsideAPI) get(m map[string]string) (*http.Response, error) {
URL, err := url.Parse(string(api))
if err != nil {
return nil, err
}
data := url.Values{}
for k, v := range m {
data.Add(k, v)
}
URL.RawQuery = data.Encode()
encodedParams := base64.StdEncoding.EncodeToString([]byte(URL.String()))
URL, err = url.Parse(string(redirectAPI))
if err != nil {
return nil, err
}
data = url.Values{}
data.Add("hash", encodedParams)
URL.RawQuery = data.Encode()
return do(&GuestSession{}, "GET", URL.String(), nil, nil, defaultContentType, apiRequestHeader)
}
func (api dcinsideAPI) getWithoutHash() (*http.Response, error) {
URL, err := url.Parse(string(api))
if err != nil {
return nil, err
}
return do(&GuestSession{}, "GET", URL.String(), nil, nil, defaultContentType, apiRequestHeader)
}
type connector interface {
Connection() *Connection
}
func post(c connector, URL string, cookies []*http.Cookie, form io.Reader, contentType string) (*http.Response, error) {
return do(c, "POST", URL, cookies, form, contentType, mobileRequestHeader)
}
func get(c connector, URL string) (*http.Response, error) {
return do(c, "GET", URL, nil, nil, defaultContentType, mobileRequestHeader)
}
func do(c connector, method, URL string, cookies []*http.Cookie, form io.Reader, contentType string, requestHeader map[string]string) (*http.Response, error) {
req, err := http.NewRequest(method, URL, form)
if err != nil {
return nil, err
}
for _, cookie := range cookies {
req.AddCookie(cookie)
}
if contentType != "" {
req.Header.Set("Content-Type", contentType)
}
for k, v := range requestHeader {
req.Header.Set(k, v)
}
client := func() *http.Client {
proxy := c.Connection().proxy
if proxy != nil {
return &http.Client{Transport: &http.Transport{Proxy: proxy}}
}
return &http.Client{}
}()
client.CheckRedirect = func(req *http.Request, via []*http.Request) error {
for k, v := range requestHeader {
req.Header.Set(k, v)
}
return nil
}
if c.Connection().timeout != 0 {
client.Timeout = c.Connection().timeout
}
return client.Do(req)
}
func doImage(URL ImageURLType) (*http.Response, error) {
req, err := http.NewRequest("GET", string(URL), nil)
if err != nil {
return nil, err
}
client := &http.Client{
Timeout: time.Second * 3,
}
for k, v := range imageRequestHeader {
req.Header.Set(k, v)
}
return client.Do(req)
}