mirror of https://github.com/Xhofe/alist
				
				
				
			
		
			
				
	
	
		
			95 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Go
		
	
	
			
		
		
	
	
			95 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Go
		
	
	
package pikpak_share
 | 
						|
 | 
						|
import (
 | 
						|
	"errors"
 | 
						|
	"net/http"
 | 
						|
 | 
						|
	"github.com/alist-org/alist/v3/drivers/base"
 | 
						|
	"github.com/go-resty/resty/v2"
 | 
						|
)
 | 
						|
 | 
						|
func (d *PikPakShare) request(url string, method string, callback base.ReqCallback, resp interface{}) ([]byte, error) {
 | 
						|
	req := base.RestyClient.R()
 | 
						|
 | 
						|
	token, err := d.oauth2Token.Token()
 | 
						|
	if err != nil {
 | 
						|
		return nil, err
 | 
						|
	}
 | 
						|
	req.SetAuthScheme(token.TokenType).SetAuthToken(token.AccessToken)
 | 
						|
 | 
						|
	if callback != nil {
 | 
						|
		callback(req)
 | 
						|
	}
 | 
						|
	if resp != nil {
 | 
						|
		req.SetResult(resp)
 | 
						|
	}
 | 
						|
	var e RespErr
 | 
						|
	req.SetError(&e)
 | 
						|
	res, err := req.Execute(method, url)
 | 
						|
	if err != nil {
 | 
						|
		return nil, err
 | 
						|
	}
 | 
						|
	if e.ErrorCode != 0 {
 | 
						|
		return nil, errors.New(e.Error)
 | 
						|
	}
 | 
						|
	return res.Body(), nil
 | 
						|
}
 | 
						|
 | 
						|
func (d *PikPakShare) getSharePassToken() error {
 | 
						|
	query := map[string]string{
 | 
						|
		"share_id":       d.ShareId,
 | 
						|
		"pass_code":      d.SharePwd,
 | 
						|
		"thumbnail_size": "SIZE_LARGE",
 | 
						|
		"limit":          "100",
 | 
						|
	}
 | 
						|
	var resp ShareResp
 | 
						|
	_, err := d.request("https://api-drive.mypikpak.com/drive/v1/share", http.MethodGet, func(req *resty.Request) {
 | 
						|
		req.SetQueryParams(query)
 | 
						|
	}, &resp)
 | 
						|
	if err != nil {
 | 
						|
		return err
 | 
						|
	}
 | 
						|
	d.PassCodeToken = resp.PassCodeToken
 | 
						|
	return nil
 | 
						|
}
 | 
						|
 | 
						|
func (d *PikPakShare) getFiles(id string) ([]File, error) {
 | 
						|
	res := make([]File, 0)
 | 
						|
	pageToken := "first"
 | 
						|
	for pageToken != "" {
 | 
						|
		if pageToken == "first" {
 | 
						|
			pageToken = ""
 | 
						|
		}
 | 
						|
		query := map[string]string{
 | 
						|
			"parent_id":       id,
 | 
						|
			"share_id":        d.ShareId,
 | 
						|
			"thumbnail_size":  "SIZE_LARGE",
 | 
						|
			"with_audit":      "true",
 | 
						|
			"limit":           "100",
 | 
						|
			"filters":         `{"phase":{"eq":"PHASE_TYPE_COMPLETE"},"trashed":{"eq":false}}`,
 | 
						|
			"page_token":      pageToken,
 | 
						|
			"pass_code_token": d.PassCodeToken,
 | 
						|
		}
 | 
						|
		var resp ShareResp
 | 
						|
		_, err := d.request("https://api-drive.mypikpak.com/drive/v1/share/detail", http.MethodGet, func(req *resty.Request) {
 | 
						|
			req.SetQueryParams(query)
 | 
						|
		}, &resp)
 | 
						|
		if err != nil {
 | 
						|
			return nil, err
 | 
						|
		}
 | 
						|
		if resp.ShareStatus != "OK" {
 | 
						|
			if resp.ShareStatus == "PASS_CODE_EMPTY" || resp.ShareStatus == "PASS_CODE_ERROR" {
 | 
						|
				err = d.getSharePassToken()
 | 
						|
				if err != nil {
 | 
						|
					return nil, err
 | 
						|
				}
 | 
						|
				return d.getFiles(id)
 | 
						|
			}
 | 
						|
			return nil, errors.New(resp.ShareStatusText)
 | 
						|
		}
 | 
						|
		pageToken = resp.NextPageToken
 | 
						|
		res = append(res, resp.Files...)
 | 
						|
	}
 | 
						|
	return res, nil
 | 
						|
}
 |