Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
99 changes: 38 additions & 61 deletions drivers/pikpak/driver.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,14 @@ import (
"net/http"
"strconv"
"strings"
"sync"

"github.com/OpenListTeam/OpenList/v4/drivers/base"
"github.com/OpenListTeam/OpenList/v4/internal/driver"
"github.com/OpenListTeam/OpenList/v4/internal/model"
"github.com/OpenListTeam/OpenList/v4/internal/op"
streamPkg "github.com/OpenListTeam/OpenList/v4/internal/stream"
"github.com/OpenListTeam/OpenList/v4/pkg/singleflight"
"github.com/OpenListTeam/OpenList/v4/pkg/utils"
hash_extend "github.com/OpenListTeam/OpenList/v4/pkg/utils/hash"
"github.com/go-resty/resty/v2"
Expand All @@ -25,6 +27,9 @@ type PikPak struct {
*Common
RefreshToken string
AccessToken string
authMu sync.RWMutex
authG singleflight.Group[struct{}]
persistMu sync.Mutex
}

func (d *PikPak) Config() driver.Config {
Expand All @@ -35,81 +40,58 @@ func (d *PikPak) GetAddition() driver.Additional {
return &d.Addition
}

func (d *PikPak) saveStorage(update func()) {
d.persistMu.Lock()
defer d.persistMu.Unlock()
if update != nil {
update()
}
op.MustSaveDriverStorage(d)
}

func (d *PikPak) Init(ctx context.Context) (err error) {
if d.Common == nil {
d.Common = &Common{
client: base.NewRestyClient(),
CaptchaToken: "",
UserID: "",
DeviceID: utils.GetMD5EncodeStr(d.Username + d.Password),
UserAgent: "",
RefreshCTokenCk: func(token string) {
d.Common.CaptchaToken = token
op.MustSaveDriverStorage(d)
},
client: base.NewRestyClient(),
UserID: "",
DeviceID: genDeviceID(),
UserAgent: "",
}
}

if d.Platform == "android" {
d.ClientID = AndroidClientID
d.ClientSecret = AndroidClientSecret
d.ClientVersion = AndroidClientVersion
d.PackageName = AndroidPackageName
d.Algorithms = AndroidAlgorithms
d.UserAgent = BuildCustomUserAgent(utils.GetMD5EncodeStr(d.Username+d.Password), 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"
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; rv:129.0) Gecko/20100101 Firefox/129.0"
if d.Platform == "web" {
d.saveStorage(func() {
d.Platform = ""
})
} else if d.Platform != "" {
return fmt.Errorf("legacy pikpak %q profile was removed; recreate this storage with the current PikPak driver settings", d.Platform)
}

if d.Addition.CaptchaToken != "" && d.Addition.RefreshToken == "" {
d.SetCaptchaToken(d.Addition.CaptchaToken)
if d.Addition.RefreshToken != "" {
d.setRefreshTokenState(d.Addition.RefreshToken)
}

if d.Addition.DeviceID != "" {
d.SetDeviceID(d.Addition.DeviceID)
} else {
d.Addition.DeviceID = d.Common.DeviceID
op.MustSaveDriverStorage(d)
}
// 如果已经有RefreshToken,直接获取AccessToken
if d.Addition.RefreshToken != "" {
if err = d.refreshToken(d.Addition.RefreshToken); err != nil {
return err
}
} else {
// 如果没有填写RefreshToken,尝试登录 获取 refreshToken
if err = d.login(); err != nil {
return err
if d.GetDeviceID() == "" || len(d.GetDeviceID()) != 32 {
d.SetDeviceID(genDeviceID())
}
d.saveStorage(func() {
d.Addition.DeviceID = d.GetDeviceID()
})
}

// 获取CaptchaToken
err = d.RefreshCaptchaTokenAtLogin(GetAction(http.MethodGet, "https://api-drive.mypikpak.net/drive/v1/files"), d.Common.GetUserID())
if err != nil {
if err = d.ensureAuthorized(false, ""); err != nil {
return err
}

// 更新UserAgent
if d.Platform == "android" {
d.Common.UserAgent = BuildCustomUserAgent(utils.GetMD5EncodeStr(d.Username+d.Password), AndroidClientID, AndroidPackageName, AndroidSdkVersion, AndroidClientVersion, AndroidPackageName, d.Common.UserID)
}

// 保存 有效的 RefreshToken
d.Addition.RefreshToken = d.RefreshToken
op.MustSaveDriverStorage(d)

return nil
}

Expand Down Expand Up @@ -246,11 +228,6 @@ func (d *PikPak) Put(ctx context.Context, dstDir model.Obj, stream model.FileStr
}

params := resp.Resumable.Params
// endpoint := strings.Join(strings.Split(params.Endpoint, ".")[1:], ".")
// web 端上传 返回的endpoint 为 `mypikpak.net` | android 端上传 返回的endpoint 为 `vip-lixian-07.mypikpak.net`·
if d.Addition.Platform == "android" {
params.Endpoint = "mypikpak.net"
}

if stream.GetSize() <= 10*utils.MB { // 文件大小 小于10MB,改用普通模式上传
return d.UploadByOSS(ctx, &params, stream, up)
Expand Down
12 changes: 6 additions & 6 deletions drivers/pikpak/meta.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,16 +9,16 @@ type Addition struct {
driver.RootID
Username string `json:"username" required:"true"`
Password string `json:"password" required:"true"`
Platform string `json:"platform" required:"true" default:"web" type:"select" options:"android,web,pc"`
RefreshToken string `json:"refresh_token" required:"true" default:""`
CaptchaToken string `json:"captcha_token" default:""`
DeviceID string `json:"device_id" required:"false" default:""`
Platform string `json:"platform" ignore:"true" default:""`
RefreshToken string `json:"refresh_token" ignore:"true" default:""`
DeviceID string `json:"device_id" ignore:"true" default:""`
DisableMediaLink bool `json:"disable_media_link" default:"true"`
}

var config = driver.Config{
Name: "PikPak",
LocalSort: true,
Name: "PikPak",
LocalSort: true,
PreferProxy: true,
}

func init() {
Expand Down
7 changes: 7 additions & 0 deletions drivers/pikpak/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -196,6 +196,13 @@ type CaptchaTokenResponse struct {
Url string `json:"url"`
}

func (c *CaptchaTokenResponse) Expiry() time.Time {
if c == nil || c.ExpiresIn <= 0 {
return time.Time{}
}
return time.Now().Add(time.Duration(c.ExpiresIn) * time.Second)
}

type AboutResponse struct {
Quota struct {
Limit string `json:"limit"`
Expand Down
Loading
Loading