mirror of https://github.com/Xhofe/alist
				
				
				
			
		
			
				
	
	
		
			184 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Go
		
	
	
			
		
		
	
	
			184 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Go
		
	
	
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 {
 | 
						||
		// 手机端超星上传的文件没有fileID字段,但ObjectID与fileID相同,可代替
 | 
						||
		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
 | 
						||
	}
 | 
						||
	// Create the request
 | 
						||
	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
 | 
						||
 | 
						||
}
 |