Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
alist-org
GitHub Repository: alist-org/alist
Path: blob/main/drivers/ilanzou/util.go
1986 views
1
package template
2
3
import (
4
"encoding/hex"
5
"fmt"
6
"net/http"
7
"net/url"
8
"strconv"
9
"strings"
10
"time"
11
12
"github.com/alist-org/alist/v3/drivers/base"
13
"github.com/alist-org/alist/v3/pkg/utils"
14
"github.com/foxxorcat/mopan-sdk-go"
15
"github.com/go-resty/resty/v2"
16
log "github.com/sirupsen/logrus"
17
)
18
19
func (d *ILanZou) login() error {
20
res, err := d.unproved("/login", http.MethodPost, func(req *resty.Request) {
21
req.SetBody(base.Json{
22
"loginName": d.Username,
23
"loginPwd": d.Password,
24
})
25
})
26
if err != nil {
27
return err
28
}
29
d.Token = utils.Json.Get(res, "data", "appToken").ToString()
30
if d.Token == "" {
31
return fmt.Errorf("failed to login: token is empty, resp: %s", res)
32
}
33
return nil
34
}
35
36
func getTimestamp(secret []byte) (int64, string, error) {
37
ts := time.Now().UnixMilli()
38
tsStr := strconv.FormatInt(ts, 10)
39
res, err := mopan.AesEncrypt([]byte(tsStr), secret)
40
if err != nil {
41
return 0, "", err
42
}
43
return ts, hex.EncodeToString(res), nil
44
}
45
46
func (d *ILanZou) request(pathname, method string, callback base.ReqCallback, proved bool, retry ...bool) ([]byte, error) {
47
_, ts_str, err := getTimestamp(d.conf.secret)
48
if err != nil {
49
return nil, err
50
}
51
52
params := []string{
53
"uuid=" + url.QueryEscape(d.UUID),
54
"devType=6",
55
"devCode=" + url.QueryEscape(d.UUID),
56
"devModel=chrome",
57
"devVersion=" + url.QueryEscape(d.conf.devVersion),
58
"appVersion=",
59
"timestamp=" + ts_str,
60
}
61
62
if proved {
63
params = append(params, "appToken="+url.QueryEscape(d.Token))
64
}
65
66
params = append(params, "extra=2")
67
68
queryString := strings.Join(params, "&")
69
70
req := base.RestyClient.R()
71
req.SetHeaders(map[string]string{
72
"Origin": d.conf.site,
73
"Referer": d.conf.site + "/",
74
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36 Edg/125.0.0.0",
75
"Accept-Encoding": "gzip, deflate, br, zstd",
76
"Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6,mt;q=0.5",
77
})
78
79
if d.Addition.Ip != "" {
80
req.SetHeader("X-Forwarded-For", d.Addition.Ip)
81
}
82
83
if callback != nil {
84
callback(req)
85
}
86
87
res, err := req.Execute(method, d.conf.base+pathname+"?"+queryString)
88
if err != nil {
89
if res != nil {
90
log.Errorf("[iLanZou] request error: %s", res.String())
91
}
92
return nil, err
93
}
94
isRetry := len(retry) > 0 && retry[0]
95
body := res.Body()
96
code := utils.Json.Get(body, "code").ToInt()
97
msg := utils.Json.Get(body, "msg").ToString()
98
if code != 200 {
99
if !isRetry && proved && (utils.SliceContains([]int{-1, -2}, code) || d.Token == "") {
100
err = d.login()
101
if err != nil {
102
return nil, err
103
}
104
return d.request(pathname, method, callback, proved, true)
105
}
106
return nil, fmt.Errorf("%d: %s", code, msg)
107
}
108
return body, nil
109
}
110
111
func (d *ILanZou) unproved(pathname, method string, callback base.ReqCallback) ([]byte, error) {
112
return d.request("/"+d.conf.unproved+pathname, method, callback, false)
113
}
114
115
func (d *ILanZou) proved(pathname, method string, callback base.ReqCallback) ([]byte, error) {
116
return d.request("/"+d.conf.proved+pathname, method, callback, true)
117
}
118
119