| package pikpak_share |
|
|
| import ( |
| "context" |
| "github.com/alist-org/alist/v3/internal/op" |
| "net/http" |
| "strings" |
| "time" |
|
|
| "github.com/alist-org/alist/v3/internal/driver" |
| "github.com/alist-org/alist/v3/internal/model" |
| "github.com/alist-org/alist/v3/pkg/utils" |
| "github.com/go-resty/resty/v2" |
| ) |
|
|
| type PikPakShare struct { |
| model.Storage |
| Addition |
| *Common |
| PassCodeToken string |
| } |
|
|
| func (d *PikPakShare) Config() driver.Config { |
| return config |
| } |
|
|
| func (d *PikPakShare) GetAddition() driver.Additional { |
| return &d.Addition |
| } |
|
|
| func (d *PikPakShare) Init(ctx context.Context) error { |
| if d.Common == nil { |
| d.Common = &Common{ |
| DeviceID: utils.GetMD5EncodeStr(d.Addition.ShareId + d.Addition.SharePwd + time.Now().String()), |
| UserAgent: "", |
| RefreshCTokenCk: func(token string) { |
| d.Common.CaptchaToken = token |
| op.MustSaveDriverStorage(d) |
| }, |
| UseProxy: d.Addition.UseProxy, |
| ProxyUrl: d.Addition.ProxyUrl, |
| } |
| } |
| |
|
|
| if d.Addition.DeviceID != "" { |
| d.SetDeviceID(d.Addition.DeviceID) |
| } else { |
| d.Addition.DeviceID = d.Common.DeviceID |
| op.MustSaveDriverStorage(d) |
| } |
|
|
| if d.Platform == "android" { |
| d.ClientID = AndroidClientID |
| d.ClientSecret = AndroidClientSecret |
| d.ClientVersion = AndroidClientVersion |
| d.PackageName = AndroidPackageName |
| d.Algorithms = AndroidAlgorithms |
| d.UserAgent = BuildCustomUserAgent(d.GetDeviceID(), AndroidClientID, AndroidPackageName, AndroidSdkVersion, AndroidClientVersion, AndroidPackageName, "") |
| } else if d.Platform == "web" { |
| d.ClientID = WebClientID |
| d.ClientSecret = WebClientSecret |
| d.ClientVersion = WebClientVersion |
| d.PackageName = WebPackageName |
| d.Algorithms = WebAlgorithms |
| d.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36" |
| } else if d.Platform == "pc" { |
| d.ClientID = PCClientID |
| d.ClientSecret = PCClientSecret |
| d.ClientVersion = PCClientVersion |
| d.PackageName = PCPackageName |
| d.Algorithms = PCAlgorithms |
| d.UserAgent = "MainWindow Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) PikPak/2.6.11.4955 Chrome/100.0.4896.160 Electron/18.3.15 Safari/537.36" |
| } |
|
|
| |
| err := d.RefreshCaptchaToken(GetAction(http.MethodGet, "https://api-drive.mypikpak.net/drive/v1/share:batch_file_info"), "") |
| if err != nil { |
| return err |
| } |
|
|
| if d.SharePwd != "" { |
| return d.getSharePassToken() |
| } |
|
|
| return nil |
| } |
|
|
| func (d *PikPakShare) Drop(ctx context.Context) error { |
| return nil |
| } |
|
|
| func (d *PikPakShare) List(ctx context.Context, dir model.Obj, args model.ListArgs) ([]model.Obj, error) { |
| files, err := d.getFiles(dir.GetID()) |
| if err != nil { |
| return nil, err |
| } |
| return utils.SliceConvert(files, func(src File) (model.Obj, error) { |
| return fileToObj(src), nil |
| }) |
| } |
|
|
| func (d *PikPakShare) Link(ctx context.Context, file model.Obj, args model.LinkArgs) (*model.Link, error) { |
| var resp ShareResp |
| query := map[string]string{ |
| "share_id": d.ShareId, |
| "file_id": file.GetID(), |
| "pass_code_token": d.PassCodeToken, |
| } |
| _, err := d.request("https://api-drive.mypikpak.net/drive/v1/share/file_info", http.MethodGet, func(req *resty.Request) { |
| req.SetQueryParams(query) |
| }, &resp) |
| if err != nil { |
| return nil, err |
| } |
|
|
| downloadUrl := resp.FileInfo.WebContentLink |
| if downloadUrl == "" && len(resp.FileInfo.Medias) > 0 { |
| |
| if d.Addition.UseTransCodingAddress && len(resp.FileInfo.Medias) > 1 { |
| downloadUrl = resp.FileInfo.Medias[1].Link.Url |
| } else { |
| downloadUrl = resp.FileInfo.Medias[0].Link.Url |
| } |
|
|
| } |
|
|
| if d.Addition.UseProxy { |
| if strings.HasSuffix(d.Addition.ProxyUrl, "/") { |
| downloadUrl = d.Addition.ProxyUrl + downloadUrl |
| } else { |
| downloadUrl = d.Addition.ProxyUrl + "/" + downloadUrl |
| } |
|
|
| } |
|
|
|
|
| return &model.Link{ |
| URL: downloadUrl, |
| }, nil |
| } |
|
|
| var _ driver.Driver = (*PikPakShare)(nil) |
|
|