Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
alist-org
GitHub Repository: alist-org/alist
Path: blob/main/drivers/chaoxing/util.go
1986 views
1
package chaoxing
2
3
import (
4
"bytes"
5
"crypto/aes"
6
"crypto/cipher"
7
"encoding/base64"
8
"errors"
9
"fmt"
10
"mime/multipart"
11
"net/http"
12
"strings"
13
14
"github.com/alist-org/alist/v3/drivers/base"
15
"github.com/go-resty/resty/v2"
16
)
17
18
func (d *ChaoXing) requestDownload(pathname string, method string, callback base.ReqCallback, resp interface{}) ([]byte, error) {
19
u := d.conf.DowloadApi + pathname
20
req := base.RestyClient.R()
21
req.SetHeaders(map[string]string{
22
"Cookie": d.Cookie,
23
"Accept": "application/json, text/plain, */*",
24
"Referer": d.conf.referer,
25
})
26
if callback != nil {
27
callback(req)
28
}
29
if resp != nil {
30
req.SetResult(resp)
31
}
32
var e Resp
33
req.SetError(&e)
34
res, err := req.Execute(method, u)
35
if err != nil {
36
return nil, err
37
}
38
return res.Body(), nil
39
}
40
41
func (d *ChaoXing) request(pathname string, method string, callback base.ReqCallback, resp interface{}) ([]byte, error) {
42
u := d.conf.api + pathname
43
if strings.Contains(pathname, "getUploadConfig") {
44
u = pathname
45
}
46
req := base.RestyClient.R()
47
req.SetHeaders(map[string]string{
48
"Cookie": d.Cookie,
49
"Accept": "application/json, text/plain, */*",
50
"Referer": d.conf.referer,
51
})
52
if callback != nil {
53
callback(req)
54
}
55
if resp != nil {
56
req.SetResult(resp)
57
}
58
var e Resp
59
req.SetError(&e)
60
res, err := req.Execute(method, u)
61
if err != nil {
62
return nil, err
63
}
64
return res.Body(), nil
65
}
66
67
func (d *ChaoXing) GetFiles(parent string) ([]File, error) {
68
files := make([]File, 0)
69
query := map[string]string{
70
"bbsid": d.Addition.Bbsid,
71
"folderId": parent,
72
"recType": "1",
73
}
74
var resp ListFileResp
75
_, err := d.request("/pc/resource/getResourceList", http.MethodGet, func(req *resty.Request) {
76
req.SetQueryParams(query)
77
}, &resp)
78
if err != nil {
79
return nil, err
80
}
81
if resp.Result != 1 {
82
msg := fmt.Sprintf("error code is:%d", resp.Result)
83
return nil, errors.New(msg)
84
}
85
if len(resp.List) > 0 {
86
files = append(files, resp.List...)
87
}
88
querys := map[string]string{
89
"bbsid": d.Addition.Bbsid,
90
"folderId": parent,
91
"recType": "2",
92
}
93
var resps ListFileResp
94
_, err = d.request("/pc/resource/getResourceList", http.MethodGet, func(req *resty.Request) {
95
req.SetQueryParams(querys)
96
}, &resps)
97
if err != nil {
98
return nil, err
99
}
100
for _, file := range resps.List {
101
// 手机端超星上传的文件没有fileID字段,但ObjectID与fileID相同,可代替
102
if file.Content.FileID == "" {
103
file.Content.FileID = file.Content.ObjectID
104
}
105
files = append(files, file)
106
}
107
return files, nil
108
}
109
110
func EncryptByAES(message, key string) (string, error) {
111
aesKey := []byte(key)
112
plainText := []byte(message)
113
block, err := aes.NewCipher(aesKey)
114
if err != nil {
115
return "", err
116
}
117
iv := aesKey[:aes.BlockSize]
118
mode := cipher.NewCBCEncrypter(block, iv)
119
padding := aes.BlockSize - len(plainText)%aes.BlockSize
120
paddedText := append(plainText, byte(padding))
121
for i := 0; i < padding-1; i++ {
122
paddedText = append(paddedText, byte(padding))
123
}
124
ciphertext := make([]byte, len(paddedText))
125
mode.CryptBlocks(ciphertext, paddedText)
126
encrypted := base64.StdEncoding.EncodeToString(ciphertext)
127
return encrypted, nil
128
}
129
130
func CookiesToString(cookies []*http.Cookie) string {
131
var cookieStr string
132
for _, cookie := range cookies {
133
cookieStr += cookie.Name + "=" + cookie.Value + "; "
134
}
135
if len(cookieStr) > 2 {
136
cookieStr = cookieStr[:len(cookieStr)-2]
137
}
138
return cookieStr
139
}
140
141
func (d *ChaoXing) Login() (string, error) {
142
transferKey := "u2oh6Vu^HWe4_AES"
143
body := &bytes.Buffer{}
144
writer := multipart.NewWriter(body)
145
uname, err := EncryptByAES(d.Addition.UserName, transferKey)
146
if err != nil {
147
return "", err
148
}
149
password, err := EncryptByAES(d.Addition.Password, transferKey)
150
if err != nil {
151
return "", err
152
}
153
err = writer.WriteField("uname", uname)
154
if err != nil {
155
return "", err
156
}
157
err = writer.WriteField("password", password)
158
if err != nil {
159
return "", err
160
}
161
err = writer.WriteField("t", "true")
162
if err != nil {
163
return "", err
164
}
165
err = writer.Close()
166
if err != nil {
167
return "", err
168
}
169
// Create the request
170
req, err := http.NewRequest("POST", "https://passport2.chaoxing.com/fanyalogin", body)
171
if err != nil {
172
return "", err
173
}
174
req.Header.Set("Content-Type", writer.FormDataContentType())
175
req.Header.Set("Content-Length", fmt.Sprintf("%d", body.Len()))
176
resp, err := http.DefaultClient.Do(req)
177
if err != nil {
178
return "", err
179
}
180
defer resp.Body.Close()
181
return CookiesToString(resp.Cookies()), nil
182
183
}
184
185