package _123 import ( "errors" "fmt" "net/http" "strconv" "github.com/alist-org/alist/v3/drivers/base" "github.com/alist-org/alist/v3/pkg/utils" "github.com/go-resty/resty/v2" jsoniter "github.com/json-iterator/go" ) // do others that not defined in Driver interface const ( Api = "https://www.123pan.com/api" AApi = "https://www.123pan.com/a/api" BApi = "https://www.123pan.com/b/api" MainApi = Api SignIn = MainApi + "/user/sign_in" Logout = MainApi + "/user/logout" UserInfo = MainApi + "/user/info" FileList = MainApi + "/file/list/new" DownloadInfo = MainApi + "/file/download_info" Mkdir = MainApi + "/file/upload_request" Move = MainApi + "/file/mod_pid" Rename = MainApi + "/file/rename" Trash = MainApi + "/file/trash" UploadRequest = MainApi + "/file/upload_request" UploadComplete = MainApi + "/file/upload_complete" S3PreSignedUrls = MainApi + "/file/s3_repare_upload_parts_batch" S3Auth = MainApi + "/file/s3_upload_object/auth" UploadCompleteV2 = MainApi + "/file/upload_complete/v2" S3Complete = MainApi + "/file/s3_complete_multipart_upload" //AuthKeySalt = "8-8D$sL8gPjom7bk#cY" ) func (d *Pan123) login() error { var body base.Json if utils.IsEmailFormat(d.Username) { body = base.Json{ "mail": d.Username, "password": d.Password, "type": 2, } } else { body = base.Json{ "passport": d.Username, "password": d.Password, "remember": true, } } res, err := base.RestyClient.R(). SetHeaders(map[string]string{ "origin": "https://www.123pan.com", "referer": "https://www.123pan.com/", "user-agent": "Dart/2.19(dart:io)", "platform": "android", "app-version": "36", //"user-agent": base.UserAgent, }). SetBody(body).Post(SignIn) if err != nil { return err } if utils.Json.Get(res.Body(), "code").ToInt() != 200 { err = fmt.Errorf(utils.Json.Get(res.Body(), "message").ToString()) } else { d.AccessToken = utils.Json.Get(res.Body(), "data", "token").ToString() } return err } //func authKey(reqUrl string) (*string, error) { // reqURL, err := url.Parse(reqUrl) // if err != nil { // return nil, err // } // // nowUnix := time.Now().Unix() // random := rand.Intn(0x989680) // // p4 := fmt.Sprintf("%d|%d|%s|%s|%s|%s", nowUnix, random, reqURL.Path, "web", "3", AuthKeySalt) // authKey := fmt.Sprintf("%d-%d-%x", nowUnix, random, md5.Sum([]byte(p4))) // return &authKey, nil //} func (d *Pan123) request(url string, method string, callback base.ReqCallback, resp interface{}) ([]byte, error) { req := base.RestyClient.R() req.SetHeaders(map[string]string{ "origin": "https://www.123pan.com", "referer": "https://www.123pan.com/", "authorization": "Bearer " + d.AccessToken, "user-agent": "Dart/2.19(dart:io)", "platform": "android", "app-version": "36", //"user-agent": base.UserAgent, }) if callback != nil { callback(req) } if resp != nil { req.SetResult(resp) } //authKey, err := authKey(url) //if err != nil { // return nil, err //} //req.SetQueryParam("auth-key", *authKey) res, err := req.Execute(method, url) if err != nil { return nil, err } body := res.Body() code := utils.Json.Get(body, "code").ToInt() if code != 0 { if code == 401 { err := d.login() if err != nil { return nil, err } return d.request(url, method, callback, resp) } return nil, errors.New(jsoniter.Get(body, "message").ToString()) } return body, nil } func (d *Pan123) getFiles(parentId string) ([]File, error) { page := 1 res := make([]File, 0) for { var resp Files query := map[string]string{ "driveId": "0", "limit": "100", "next": "0", "orderBy": d.OrderBy, "orderDirection": d.OrderDirection, "parentFileId": parentId, "trashed": "false", "Page": strconv.Itoa(page), } _, err := d.request(FileList, http.MethodGet, func(req *resty.Request) { req.SetQueryParams(query) }, &resp) if err != nil { return nil, err } page++ res = append(res, resp.Data.InfoList...) if len(resp.Data.InfoList) == 0 || resp.Data.Next == "-1" { break } } return res, nil }