|
package chaoxing |
|
|
|
import ( |
|
"bytes" |
|
"crypto/aes" |
|
"crypto/cipher" |
|
"encoding/base64" |
|
"errors" |
|
"fmt" |
|
"mime/multipart" |
|
"net/http" |
|
"strings" |
|
|
|
"github.com/alist-org/alist/v3/drivers/base" |
|
"github.com/go-resty/resty/v2" |
|
) |
|
|
|
func (d *ChaoXing) requestDownload(pathname string, method string, callback base.ReqCallback, resp interface{}) ([]byte, error) { |
|
u := d.conf.DowloadApi + pathname |
|
req := base.RestyClient.R() |
|
req.SetHeaders(map[string]string{ |
|
"Cookie": d.Cookie, |
|
"Accept": "application/json, text/plain, */*", |
|
"Referer": d.conf.referer, |
|
}) |
|
if callback != nil { |
|
callback(req) |
|
} |
|
if resp != nil { |
|
req.SetResult(resp) |
|
} |
|
var e Resp |
|
req.SetError(&e) |
|
res, err := req.Execute(method, u) |
|
if err != nil { |
|
return nil, err |
|
} |
|
return res.Body(), nil |
|
} |
|
|
|
func (d *ChaoXing) request(pathname string, method string, callback base.ReqCallback, resp interface{}) ([]byte, error) { |
|
u := d.conf.api + pathname |
|
if strings.Contains(pathname, "getUploadConfig") { |
|
u = pathname |
|
} |
|
req := base.RestyClient.R() |
|
req.SetHeaders(map[string]string{ |
|
"Cookie": d.Cookie, |
|
"Accept": "application/json, text/plain, */*", |
|
"Referer": d.conf.referer, |
|
}) |
|
if callback != nil { |
|
callback(req) |
|
} |
|
if resp != nil { |
|
req.SetResult(resp) |
|
} |
|
var e Resp |
|
req.SetError(&e) |
|
res, err := req.Execute(method, u) |
|
if err != nil { |
|
return nil, err |
|
} |
|
return res.Body(), nil |
|
} |
|
|
|
func (d *ChaoXing) GetFiles(parent string) ([]File, error) { |
|
files := make([]File, 0) |
|
query := map[string]string{ |
|
"bbsid": d.Addition.Bbsid, |
|
"folderId": parent, |
|
"recType": "1", |
|
} |
|
var resp ListFileResp |
|
_, err := d.request("/pc/resource/getResourceList", http.MethodGet, func(req *resty.Request) { |
|
req.SetQueryParams(query) |
|
}, &resp) |
|
if err != nil { |
|
return nil, err |
|
} |
|
if resp.Result != 1 { |
|
msg := fmt.Sprintf("error code is:%d", resp.Result) |
|
return nil, errors.New(msg) |
|
} |
|
if len(resp.List) > 0 { |
|
files = append(files, resp.List...) |
|
} |
|
querys := map[string]string{ |
|
"bbsid": d.Addition.Bbsid, |
|
"folderId": parent, |
|
"recType": "2", |
|
} |
|
var resps ListFileResp |
|
_, err = d.request("/pc/resource/getResourceList", http.MethodGet, func(req *resty.Request) { |
|
req.SetQueryParams(querys) |
|
}, &resps) |
|
if err != nil { |
|
return nil, err |
|
} |
|
for _, file := range resps.List { |
|
|
|
if file.Content.FileID == "" { |
|
file.Content.FileID = file.Content.ObjectID |
|
} |
|
files = append(files, file) |
|
} |
|
return files, nil |
|
} |
|
|
|
func EncryptByAES(message, key string) (string, error) { |
|
aesKey := []byte(key) |
|
plainText := []byte(message) |
|
block, err := aes.NewCipher(aesKey) |
|
if err != nil { |
|
return "", err |
|
} |
|
iv := aesKey[:aes.BlockSize] |
|
mode := cipher.NewCBCEncrypter(block, iv) |
|
padding := aes.BlockSize - len(plainText)%aes.BlockSize |
|
paddedText := append(plainText, byte(padding)) |
|
for i := 0; i < padding-1; i++ { |
|
paddedText = append(paddedText, byte(padding)) |
|
} |
|
ciphertext := make([]byte, len(paddedText)) |
|
mode.CryptBlocks(ciphertext, paddedText) |
|
encrypted := base64.StdEncoding.EncodeToString(ciphertext) |
|
return encrypted, nil |
|
} |
|
|
|
func CookiesToString(cookies []*http.Cookie) string { |
|
var cookieStr string |
|
for _, cookie := range cookies { |
|
cookieStr += cookie.Name + "=" + cookie.Value + "; " |
|
} |
|
if len(cookieStr) > 2 { |
|
cookieStr = cookieStr[:len(cookieStr)-2] |
|
} |
|
return cookieStr |
|
} |
|
|
|
func (d *ChaoXing) Login() (string, error) { |
|
transferKey := "u2oh6Vu^HWe4_AES" |
|
body := &bytes.Buffer{} |
|
writer := multipart.NewWriter(body) |
|
uname, err := EncryptByAES(d.Addition.UserName, transferKey) |
|
if err != nil { |
|
return "", err |
|
} |
|
password, err := EncryptByAES(d.Addition.Password, transferKey) |
|
if err != nil { |
|
return "", err |
|
} |
|
err = writer.WriteField("uname", uname) |
|
if err != nil { |
|
return "", err |
|
} |
|
err = writer.WriteField("password", password) |
|
if err != nil { |
|
return "", err |
|
} |
|
err = writer.WriteField("t", "true") |
|
if err != nil { |
|
return "", err |
|
} |
|
err = writer.Close() |
|
if err != nil { |
|
return "", err |
|
} |
|
|
|
req, err := http.NewRequest("POST", "https://passport2.chaoxing.com/fanyalogin", body) |
|
if err != nil { |
|
return "", err |
|
} |
|
req.Header.Set("Content-Type", writer.FormDataContentType()) |
|
req.Header.Set("Content-Length", fmt.Sprintf("%d", body.Len())) |
|
resp, err := http.DefaultClient.Do(req) |
|
if err != nil { |
|
return "", err |
|
} |
|
defer resp.Body.Close() |
|
return CookiesToString(resp.Cookies()), nil |
|
|
|
} |
|
|