2021-12-06 07:55:05 +00:00
|
|
|
package _23
|
2021-11-27 11:40:36 +00:00
|
|
|
|
|
|
|
import (
|
2021-12-11 09:44:33 +00:00
|
|
|
"crypto/hmac"
|
|
|
|
"crypto/sha256"
|
|
|
|
"errors"
|
2021-11-27 11:40:36 +00:00
|
|
|
"fmt"
|
|
|
|
"github.com/Xhofe/alist/conf"
|
2021-12-06 07:55:05 +00:00
|
|
|
"github.com/Xhofe/alist/drivers/base"
|
2021-11-27 11:40:36 +00:00
|
|
|
"github.com/Xhofe/alist/model"
|
|
|
|
"github.com/Xhofe/alist/utils"
|
|
|
|
"github.com/go-resty/resty/v2"
|
2021-12-11 09:44:33 +00:00
|
|
|
jsoniter "github.com/json-iterator/go"
|
2021-12-19 09:54:28 +00:00
|
|
|
log "github.com/sirupsen/logrus"
|
2021-12-11 09:44:33 +00:00
|
|
|
"math/rand"
|
2021-11-27 11:40:36 +00:00
|
|
|
"path/filepath"
|
|
|
|
"strconv"
|
|
|
|
"time"
|
|
|
|
)
|
|
|
|
|
2021-12-18 07:22:56 +00:00
|
|
|
type BaseResp struct {
|
|
|
|
Code int `json:"code"`
|
|
|
|
Message string `json:"message"`
|
|
|
|
}
|
|
|
|
|
2021-11-27 11:40:36 +00:00
|
|
|
type Pan123TokenResp struct {
|
2021-12-18 07:22:56 +00:00
|
|
|
BaseResp
|
2021-11-27 11:40:36 +00:00
|
|
|
Data struct {
|
|
|
|
Token string `json:"token"`
|
|
|
|
} `json:"data"`
|
|
|
|
}
|
|
|
|
|
|
|
|
type Pan123File struct {
|
|
|
|
FileName string `json:"FileName"`
|
|
|
|
Size int64 `json:"Size"`
|
|
|
|
UpdateAt *time.Time `json:"UpdateAt"`
|
|
|
|
FileId int64 `json:"FileId"`
|
|
|
|
Type int `json:"Type"`
|
|
|
|
Etag string `json:"Etag"`
|
|
|
|
S3KeyFlag string `json:"S3KeyFlag"`
|
|
|
|
}
|
|
|
|
|
|
|
|
type Pan123Files struct {
|
2021-12-18 07:22:56 +00:00
|
|
|
BaseResp
|
2021-12-19 09:54:28 +00:00
|
|
|
Data struct {
|
2021-11-27 11:40:36 +00:00
|
|
|
InfoList []Pan123File `json:"InfoList"`
|
|
|
|
Next string `json:"Next"`
|
|
|
|
} `json:"data"`
|
|
|
|
}
|
|
|
|
|
|
|
|
type Pan123DownResp struct {
|
2021-12-18 07:22:56 +00:00
|
|
|
BaseResp
|
2021-12-19 09:54:28 +00:00
|
|
|
Data struct {
|
2021-11-27 11:40:36 +00:00
|
|
|
DownloadUrl string `json:"DownloadUrl"`
|
|
|
|
} `json:"data"`
|
|
|
|
}
|
|
|
|
|
|
|
|
func (driver Pan123) Login(account *model.Account) error {
|
2021-12-19 09:54:28 +00:00
|
|
|
url := "https://www.123pan.com/api/user/sign_in"
|
|
|
|
if account.APIProxyUrl != "" {
|
|
|
|
url = fmt.Sprintf("%s/%s", account.APIProxyUrl, url)
|
|
|
|
}
|
2021-11-27 11:40:36 +00:00
|
|
|
var resp Pan123TokenResp
|
2021-12-19 09:54:28 +00:00
|
|
|
_, err := base.RestyClient.R().
|
2021-11-27 11:40:36 +00:00
|
|
|
SetResult(&resp).
|
2021-12-06 07:55:05 +00:00
|
|
|
SetBody(base.Json{
|
2021-11-27 11:40:36 +00:00
|
|
|
"passport": account.Username,
|
|
|
|
"password": account.Password,
|
2021-12-19 09:54:28 +00:00
|
|
|
}).Post(url)
|
2021-11-27 11:40:36 +00:00
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
if resp.Code != 200 {
|
|
|
|
err = fmt.Errorf(resp.Message)
|
|
|
|
account.Status = resp.Message
|
|
|
|
} else {
|
|
|
|
account.Status = "work"
|
|
|
|
account.AccessToken = resp.Data.Token
|
|
|
|
}
|
|
|
|
_ = model.SaveAccount(account)
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
func (driver Pan123) FormatFile(file *Pan123File) *model.File {
|
|
|
|
f := &model.File{
|
|
|
|
Id: strconv.FormatInt(file.FileId, 10),
|
|
|
|
Name: file.FileName,
|
|
|
|
Size: file.Size,
|
2021-11-30 01:37:51 +00:00
|
|
|
Driver: driver.Config().Name,
|
2021-11-27 11:40:36 +00:00
|
|
|
UpdatedAt: file.UpdateAt,
|
|
|
|
}
|
|
|
|
if file.Type == 1 {
|
|
|
|
f.Type = conf.FOLDER
|
|
|
|
} else {
|
|
|
|
f.Type = utils.GetFileType(filepath.Ext(file.FileName))
|
|
|
|
}
|
|
|
|
return f
|
|
|
|
}
|
|
|
|
|
|
|
|
func (driver Pan123) GetFiles(parentId string, account *model.Account) ([]Pan123File, error) {
|
|
|
|
next := "0"
|
|
|
|
res := make([]Pan123File, 0)
|
|
|
|
for next != "-1" {
|
|
|
|
var resp Pan123Files
|
2021-12-19 09:54:28 +00:00
|
|
|
query := map[string]string{
|
|
|
|
"driveId": "0",
|
|
|
|
"limit": "100",
|
|
|
|
"next": next,
|
|
|
|
"orderBy": account.OrderBy,
|
|
|
|
"orderDirection": account.OrderDirection,
|
|
|
|
"parentFileId": parentId,
|
|
|
|
"trashed": "false",
|
|
|
|
}
|
|
|
|
_, err := driver.Request("https://www.123pan.com/api/file/list",
|
|
|
|
base.Get, query, nil, &resp, false, account)
|
2021-11-27 11:40:36 +00:00
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
next = resp.Data.Next
|
|
|
|
res = append(res, resp.Data.InfoList...)
|
|
|
|
}
|
|
|
|
return res, nil
|
|
|
|
}
|
|
|
|
|
2021-12-19 09:54:28 +00:00
|
|
|
func (driver Pan123) Request(url string, method int, query map[string]string, data *base.Json, resp interface{}, proxy bool, account *model.Account) ([]byte, error) {
|
|
|
|
rawUrl := url
|
|
|
|
if account.APIProxyUrl != "" {
|
|
|
|
url = fmt.Sprintf("%s/%s", account.APIProxyUrl, url)
|
|
|
|
}
|
|
|
|
log.Debugf("request: %s", url)
|
|
|
|
req := base.RestyClient.R()
|
|
|
|
req.SetHeader("Authorization", "Bearer "+account.AccessToken)
|
|
|
|
if query != nil {
|
|
|
|
req.SetQueryParams(query)
|
|
|
|
}
|
|
|
|
if data != nil {
|
|
|
|
req.SetBody(data)
|
|
|
|
}
|
|
|
|
if resp != nil {
|
|
|
|
req.SetResult(resp)
|
|
|
|
}
|
|
|
|
var res *resty.Response
|
|
|
|
var err error
|
|
|
|
switch method {
|
|
|
|
case base.Get:
|
|
|
|
res, err = req.Get(url)
|
|
|
|
case base.Post:
|
|
|
|
res, err = req.Post(url)
|
|
|
|
default:
|
|
|
|
return nil, base.ErrNotSupport
|
|
|
|
}
|
2021-12-11 09:44:33 +00:00
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
2021-12-19 09:54:28 +00:00
|
|
|
log.Debug(res.String())
|
2021-12-11 09:44:33 +00:00
|
|
|
body := res.Body()
|
2021-12-19 09:54:28 +00:00
|
|
|
code := jsoniter.Get(body, "code").ToInt()
|
|
|
|
if code != 0 {
|
|
|
|
if code == 401 {
|
|
|
|
err := driver.Login(account)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
return driver.Request(rawUrl, method, query, data, resp, proxy, account)
|
|
|
|
}
|
2021-12-11 09:44:33 +00:00
|
|
|
return nil, errors.New(jsoniter.Get(body, "message").ToString())
|
|
|
|
}
|
|
|
|
return body, nil
|
|
|
|
}
|
|
|
|
|
2021-12-19 09:54:28 +00:00
|
|
|
//func (driver Pan123) Post(url string, data base.Json, account *model.Account) ([]byte, error) {
|
|
|
|
// res, err := pan123Client.R().
|
|
|
|
// SetHeader("authorization", "Bearer "+account.AccessToken).
|
|
|
|
// SetBody(data).Post(url)
|
|
|
|
// if err != nil {
|
|
|
|
// return nil, err
|
|
|
|
// }
|
|
|
|
// body := res.Body()
|
|
|
|
// if jsoniter.Get(body, "code").ToInt() != 0 {
|
|
|
|
// return nil, errors.New(jsoniter.Get(body, "message").ToString())
|
|
|
|
// }
|
|
|
|
// return body, nil
|
|
|
|
//}
|
|
|
|
|
2021-11-27 11:40:36 +00:00
|
|
|
func (driver Pan123) GetFile(path string, account *model.Account) (*Pan123File, error) {
|
|
|
|
dir, name := filepath.Split(path)
|
2021-11-28 07:10:06 +00:00
|
|
|
dir = utils.ParsePath(dir)
|
2021-11-27 11:40:36 +00:00
|
|
|
_, err := driver.Files(dir, account)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
2021-12-08 14:58:44 +00:00
|
|
|
parentFiles_, _ := base.GetCache(dir, account)
|
2021-11-27 11:40:36 +00:00
|
|
|
parentFiles, _ := parentFiles_.([]Pan123File)
|
|
|
|
for _, file := range parentFiles {
|
|
|
|
if file.FileName == name {
|
2021-11-28 07:10:06 +00:00
|
|
|
if file.Type != conf.FOLDER {
|
2021-11-27 11:40:36 +00:00
|
|
|
return &file, err
|
|
|
|
} else {
|
2021-12-06 07:55:05 +00:00
|
|
|
return nil, base.ErrNotFile
|
2021-11-27 11:40:36 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2021-12-06 07:55:05 +00:00
|
|
|
return nil, base.ErrPathNotFound
|
2021-11-27 11:40:36 +00:00
|
|
|
}
|
|
|
|
|
2021-12-11 09:44:33 +00:00
|
|
|
func RandStr(length int) string {
|
|
|
|
str := "123456789abcdefghijklmnopqrstuvwxyz"
|
|
|
|
bytes := []byte(str)
|
|
|
|
var result []byte
|
2021-12-19 09:54:28 +00:00
|
|
|
rand.Seed(time.Now().UnixNano() + int64(rand.Intn(100)))
|
2021-12-11 09:44:33 +00:00
|
|
|
for i := 0; i < length; i++ {
|
|
|
|
result = append(result, bytes[rand.Intn(len(bytes))])
|
|
|
|
}
|
|
|
|
return string(result)
|
|
|
|
}
|
|
|
|
|
|
|
|
func HMAC(message string, secret string) string {
|
|
|
|
key := []byte(secret)
|
|
|
|
h := hmac.New(sha256.New, key)
|
|
|
|
h.Write([]byte(message))
|
|
|
|
// fmt.Println(h.Sum(nil))
|
|
|
|
//sha := hex.EncodeToString(h.Sum(nil))
|
|
|
|
// fmt.Println(sha)
|
|
|
|
//return sha
|
|
|
|
return string(h.Sum(nil))
|
|
|
|
}
|
|
|
|
|
2021-11-27 11:40:36 +00:00
|
|
|
func init() {
|
2021-12-06 07:55:05 +00:00
|
|
|
base.RegisterDriver(&Pan123{})
|
2021-11-27 11:40:36 +00:00
|
|
|
}
|