mirror of https://github.com/Xhofe/alist
155 lines
3.9 KiB
Go
155 lines
3.9 KiB
Go
package pikpak_share
|
|
|
|
import (
|
|
"errors"
|
|
"net/http"
|
|
|
|
"github.com/alist-org/alist/v3/drivers/base"
|
|
"github.com/alist-org/alist/v3/internal/op"
|
|
"github.com/go-resty/resty/v2"
|
|
jsoniter "github.com/json-iterator/go"
|
|
)
|
|
|
|
// do others that not defined in Driver interface
|
|
|
|
func (d *PikPakShare) login() error {
|
|
url := "https://user.mypikpak.com/v1/auth/signin"
|
|
var e RespErr
|
|
res, err := base.RestyClient.R().SetError(&e).SetBody(base.Json{
|
|
"captcha_token": "",
|
|
"client_id": "YNxT9w7GMdWvEOKa",
|
|
"client_secret": "dbw2OtmVEeuUvIptb1Coyg",
|
|
"username": d.Username,
|
|
"password": d.Password,
|
|
}).Post(url)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if e.ErrorCode != 0 {
|
|
return errors.New(e.Error)
|
|
}
|
|
data := res.Body()
|
|
d.RefreshToken = jsoniter.Get(data, "refresh_token").ToString()
|
|
d.AccessToken = jsoniter.Get(data, "access_token").ToString()
|
|
return nil
|
|
}
|
|
|
|
func (d *PikPakShare) refreshToken() error {
|
|
url := "https://user.mypikpak.com/v1/auth/token"
|
|
var e RespErr
|
|
res, err := base.RestyClient.R().SetError(&e).
|
|
SetHeader("user-agent", "").SetBody(base.Json{
|
|
"client_id": "YNxT9w7GMdWvEOKa",
|
|
"client_secret": "dbw2OtmVEeuUvIptb1Coyg",
|
|
"grant_type": "refresh_token",
|
|
"refresh_token": d.RefreshToken,
|
|
}).Post(url)
|
|
if err != nil {
|
|
d.Status = err.Error()
|
|
op.MustSaveDriverStorage(d)
|
|
return err
|
|
}
|
|
if e.ErrorCode != 0 {
|
|
if e.ErrorCode == 4126 {
|
|
// refresh_token invalid, re-login
|
|
return d.login()
|
|
}
|
|
d.Status = e.Error
|
|
op.MustSaveDriverStorage(d)
|
|
return errors.New(e.Error)
|
|
}
|
|
data := res.Body()
|
|
d.Status = "work"
|
|
d.RefreshToken = jsoniter.Get(data, "refresh_token").ToString()
|
|
d.AccessToken = jsoniter.Get(data, "access_token").ToString()
|
|
op.MustSaveDriverStorage(d)
|
|
return nil
|
|
}
|
|
|
|
func (d *PikPakShare) request(url string, method string, callback base.ReqCallback, resp interface{}) ([]byte, error) {
|
|
req := base.RestyClient.R()
|
|
req.SetHeader("Authorization", "Bearer "+d.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 {
|
|
if e.ErrorCode == 16 {
|
|
// login / refresh token
|
|
err = d.refreshToken()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return d.request(url, method, callback, resp)
|
|
}
|
|
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
|
|
}
|