feat(pikpak&pikpak_share): add download address delay detection (#7136)
* feat(pikpak): add download address delay detection * feat(pikpak_share): add download address delay detection
This commit is contained in:
parent
c9fa3d7cd6
commit
716d33fddd
@ -14,6 +14,7 @@ import (
|
|||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
"golang.org/x/oauth2"
|
"golang.org/x/oauth2"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"regexp"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
@ -48,6 +49,7 @@ func (d *PikPak) Init(ctx context.Context) (err error) {
|
|||||||
d.Common.CaptchaToken = token
|
d.Common.CaptchaToken = token
|
||||||
op.MustSaveDriverStorage(d)
|
op.MustSaveDriverStorage(d)
|
||||||
},
|
},
|
||||||
|
LowLatencyAddr: "",
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -65,6 +67,13 @@ func (d *PikPak) Init(ctx context.Context) (err error) {
|
|||||||
d.PackageName = WebPackageName
|
d.PackageName = WebPackageName
|
||||||
d.Algorithms = WebAlgorithms
|
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"
|
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.5.6.4831 Chrome/100.0.4896.160 Electron/18.3.15 Safari/537.36"
|
||||||
}
|
}
|
||||||
|
|
||||||
if d.Addition.CaptchaToken != "" && d.Addition.RefreshToken == "" {
|
if d.Addition.CaptchaToken != "" && d.Addition.RefreshToken == "" {
|
||||||
@ -128,6 +137,15 @@ func (d *PikPak) Init(ctx context.Context) (err error) {
|
|||||||
// 保存 有效的 RefreshToken
|
// 保存 有效的 RefreshToken
|
||||||
d.Addition.RefreshToken = d.RefreshToken
|
d.Addition.RefreshToken = d.RefreshToken
|
||||||
op.MustSaveDriverStorage(d)
|
op.MustSaveDriverStorage(d)
|
||||||
|
|
||||||
|
if d.UseLowLatencyAddress && d.Addition.CustomLowLatencyAddress != "" {
|
||||||
|
d.Common.LowLatencyAddr = d.Addition.CustomLowLatencyAddress
|
||||||
|
} else if d.UseLowLatencyAddress {
|
||||||
|
d.Common.LowLatencyAddr = findLowestLatencyAddress(DlAddr)
|
||||||
|
d.Addition.CustomLowLatencyAddress = d.Common.LowLatencyAddr
|
||||||
|
op.MustSaveDriverStorage(d)
|
||||||
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -147,6 +165,7 @@ func (d *PikPak) List(ctx context.Context, dir model.Obj, args model.ListArgs) (
|
|||||||
|
|
||||||
func (d *PikPak) Link(ctx context.Context, file model.Obj, args model.LinkArgs) (*model.Link, error) {
|
func (d *PikPak) Link(ctx context.Context, file model.Obj, args model.LinkArgs) (*model.Link, error) {
|
||||||
var resp File
|
var resp File
|
||||||
|
var url string
|
||||||
queryParams := map[string]string{
|
queryParams := map[string]string{
|
||||||
"_magic": "2021",
|
"_magic": "2021",
|
||||||
"usage": "FETCH",
|
"usage": "FETCH",
|
||||||
@ -162,14 +181,22 @@ func (d *PikPak) Link(ctx context.Context, file model.Obj, args model.LinkArgs)
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
link := model.Link{
|
url = resp.WebContentLink
|
||||||
URL: resp.WebContentLink,
|
|
||||||
}
|
|
||||||
if !d.DisableMediaLink && len(resp.Medias) > 0 && resp.Medias[0].Link.Url != "" {
|
if !d.DisableMediaLink && len(resp.Medias) > 0 && resp.Medias[0].Link.Url != "" {
|
||||||
log.Debugln("use media link")
|
log.Debugln("use media link")
|
||||||
link.URL = resp.Medias[0].Link.Url
|
url = resp.Medias[0].Link.Url
|
||||||
}
|
}
|
||||||
return &link, nil
|
|
||||||
|
if d.UseLowLatencyAddress && d.Common.LowLatencyAddr != "" {
|
||||||
|
// 替换为加速链接
|
||||||
|
re := regexp.MustCompile(`https://[^/]+/download/`)
|
||||||
|
url = re.ReplaceAllString(url, "https://"+d.Common.LowLatencyAddr+"/download/")
|
||||||
|
}
|
||||||
|
|
||||||
|
return &model.Link{
|
||||||
|
URL: url,
|
||||||
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *PikPak) MakeDir(ctx context.Context, parentDir model.Obj, dirName string) error {
|
func (d *PikPak) MakeDir(ctx context.Context, parentDir model.Obj, dirName string) error {
|
||||||
|
@ -7,14 +7,16 @@ import (
|
|||||||
|
|
||||||
type Addition struct {
|
type Addition struct {
|
||||||
driver.RootID
|
driver.RootID
|
||||||
Username string `json:"username" required:"true"`
|
Username string `json:"username" required:"true"`
|
||||||
Password string `json:"password" required:"true"`
|
Password string `json:"password" required:"true"`
|
||||||
Platform string `json:"platform" required:"true" type:"select" options:"android,web"`
|
Platform string `json:"platform" required:"true" type:"select" options:"android,web,pc"`
|
||||||
RefreshToken string `json:"refresh_token" required:"true" default:""`
|
RefreshToken string `json:"refresh_token" required:"true" default:""`
|
||||||
RefreshTokenMethod string `json:"refresh_token_method" required:"true" type:"select" options:"oauth2,http"`
|
RefreshTokenMethod string `json:"refresh_token_method" required:"true" type:"select" options:"oauth2,http"`
|
||||||
CaptchaToken string `json:"captcha_token" default:""`
|
CaptchaToken string `json:"captcha_token" default:""`
|
||||||
DeviceID string `json:"device_id" required:"false" default:""`
|
DeviceID string `json:"device_id" required:"false" default:""`
|
||||||
DisableMediaLink bool `json:"disable_media_link" default:"true"`
|
DisableMediaLink bool `json:"disable_media_link" default:"true"`
|
||||||
|
UseLowLatencyAddress bool `json:"use_low_latency_address" default:"false"`
|
||||||
|
CustomLowLatencyAddress string `json:"custom_low_latency_address" default:""`
|
||||||
}
|
}
|
||||||
|
|
||||||
var config = driver.Config{
|
var config = driver.Config{
|
||||||
|
@ -30,21 +30,14 @@ import (
|
|||||||
// do others that not defined in Driver interface
|
// do others that not defined in Driver interface
|
||||||
|
|
||||||
var AndroidAlgorithms = []string{
|
var AndroidAlgorithms = []string{
|
||||||
"Gez0T9ijiI9WCeTsKSg3SMlx",
|
"aDhgaSE3MsjROCmpmsWqP1sJdFJ",
|
||||||
"zQdbalsolyb1R/",
|
"+oaVkqdd8MJuKT+uMr2AYKcd9tdWge3XPEPR2hcePUknd",
|
||||||
"ftOjr52zt51JD68C3s",
|
"u/sd2GgT2fTytRcKzGicHodhvIltMntA3xKw2SRv7S48OdnaQIS5mn",
|
||||||
"yeOBMH0JkbQdEFNNwQ0RI9T3wU/v",
|
"2WZiae2QuqTOxBKaaqCNHCW3olu2UImelkDzBn",
|
||||||
"BRJrQZiTQ65WtMvwO",
|
"/vJ3upic39lgmrkX855Qx",
|
||||||
"je8fqxKPdQVJiy1DM6Bc9Nb1",
|
"yNc9ruCVMV7pGV7XvFeuLMOcy1",
|
||||||
"niV",
|
"4FPq8mT3JQ1jzcVxMVfwFftLQm33M7i",
|
||||||
"9hFCW2R1",
|
"xozoy5e3Ea",
|
||||||
"sHKHpe2i96",
|
|
||||||
"p7c5E6AcXQ/IJUuAEC9W6",
|
|
||||||
"",
|
|
||||||
"aRv9hjc9P+Pbn+u3krN6",
|
|
||||||
"BzStcgE8qVdqjEH16l4",
|
|
||||||
"SqgeZvL5j9zoHP95xWHt",
|
|
||||||
"zVof5yaJkPe3VFpadPof",
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var WebAlgorithms = []string{
|
var WebAlgorithms = []string{
|
||||||
@ -65,6 +58,19 @@ var WebAlgorithms = []string{
|
|||||||
"NhXXU9rg4XXdzo7u5o",
|
"NhXXU9rg4XXdzo7u5o",
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var PCAlgorithms = []string{
|
||||||
|
"KHBJ07an7ROXDoK7Db",
|
||||||
|
"G6n399rSWkl7WcQmw5rpQInurc1DkLmLJqE",
|
||||||
|
"JZD1A3M4x+jBFN62hkr7VDhkkZxb9g3rWqRZqFAAb",
|
||||||
|
"fQnw/AmSlbbI91Ik15gpddGgyU7U",
|
||||||
|
"/Dv9JdPYSj3sHiWjouR95NTQff",
|
||||||
|
"yGx2zuTjbWENZqecNI+edrQgqmZKP",
|
||||||
|
"ljrbSzdHLwbqcRn",
|
||||||
|
"lSHAsqCkGDGxQqqwrVu",
|
||||||
|
"TsWXI81fD1",
|
||||||
|
"vk7hBjawK/rOSrSWajtbMk95nfgf3",
|
||||||
|
}
|
||||||
|
|
||||||
const (
|
const (
|
||||||
OSSUserAgent = "aliyun-sdk-android/2.9.13(Linux/Android 14/M2004j7ac;UKQ1.231108.001)"
|
OSSUserAgent = "aliyun-sdk-android/2.9.13(Linux/Android 14/M2004j7ac;UKQ1.231108.001)"
|
||||||
OssSecurityTokenHeaderName = "X-OSS-Security-Token"
|
OssSecurityTokenHeaderName = "X-OSS-Security-Token"
|
||||||
@ -74,16 +80,59 @@ const (
|
|||||||
const (
|
const (
|
||||||
AndroidClientID = "YNxT9w7GMdWvEOKa"
|
AndroidClientID = "YNxT9w7GMdWvEOKa"
|
||||||
AndroidClientSecret = "dbw2OtmVEeuUvIptb1Coyg"
|
AndroidClientSecret = "dbw2OtmVEeuUvIptb1Coyg"
|
||||||
AndroidClientVersion = "1.47.1"
|
AndroidClientVersion = "1.48.3"
|
||||||
AndroidPackageName = "com.pikcloud.pikpak"
|
AndroidPackageName = "com.pikcloud.pikpak"
|
||||||
AndroidSdkVersion = "2.0.4.204000"
|
AndroidSdkVersion = "2.0.4.204101"
|
||||||
WebClientID = "YUMx5nI8ZU8Ap8pm"
|
WebClientID = "YUMx5nI8ZU8Ap8pm"
|
||||||
WebClientSecret = "dbw2OtmVEeuUvIptb1Coyg"
|
WebClientSecret = "dbw2OtmVEeuUvIptb1Coyg"
|
||||||
WebClientVersion = "2.0.0"
|
WebClientVersion = "2.0.0"
|
||||||
WebPackageName = "mypikpak.com"
|
WebPackageName = "mypikpak.com"
|
||||||
WebSdkVersion = "8.0.3"
|
WebSdkVersion = "8.0.3"
|
||||||
|
PCClientID = "YvtoWO6GNHiuCl7x"
|
||||||
|
PCClientSecret = "1NIH5R1IEe2pAxZE3hv3uA"
|
||||||
|
PCClientVersion = "undefined" // 2.5.6.4831
|
||||||
|
PCPackageName = "mypikpak.com"
|
||||||
|
PCSdkVersion = "8.0.3"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var DlAddr = []string{
|
||||||
|
"dl-a10b-0621.mypikpak.com",
|
||||||
|
"dl-a10b-0622.mypikpak.com",
|
||||||
|
"dl-a10b-0623.mypikpak.com",
|
||||||
|
"dl-a10b-0624.mypikpak.com",
|
||||||
|
"dl-a10b-0625.mypikpak.com",
|
||||||
|
"dl-a10b-0858.mypikpak.com",
|
||||||
|
"dl-a10b-0859.mypikpak.com",
|
||||||
|
"dl-a10b-0860.mypikpak.com",
|
||||||
|
"dl-a10b-0861.mypikpak.com",
|
||||||
|
"dl-a10b-0862.mypikpak.com",
|
||||||
|
"dl-a10b-0863.mypikpak.com",
|
||||||
|
"dl-a10b-0864.mypikpak.com",
|
||||||
|
"dl-a10b-0865.mypikpak.com",
|
||||||
|
"dl-a10b-0866.mypikpak.com",
|
||||||
|
"dl-a10b-0867.mypikpak.com",
|
||||||
|
"dl-a10b-0868.mypikpak.com",
|
||||||
|
"dl-a10b-0869.mypikpak.com",
|
||||||
|
"dl-a10b-0870.mypikpak.com",
|
||||||
|
"dl-a10b-0871.mypikpak.com",
|
||||||
|
"dl-a10b-0872.mypikpak.com",
|
||||||
|
"dl-a10b-0873.mypikpak.com",
|
||||||
|
"dl-a10b-0874.mypikpak.com",
|
||||||
|
"dl-a10b-0875.mypikpak.com",
|
||||||
|
"dl-a10b-0876.mypikpak.com",
|
||||||
|
"dl-a10b-0877.mypikpak.com",
|
||||||
|
"dl-a10b-0878.mypikpak.com",
|
||||||
|
"dl-a10b-0879.mypikpak.com",
|
||||||
|
"dl-a10b-0880.mypikpak.com",
|
||||||
|
"dl-a10b-0881.mypikpak.com",
|
||||||
|
"dl-a10b-0882.mypikpak.com",
|
||||||
|
"dl-a10b-0883.mypikpak.com",
|
||||||
|
"dl-a10b-0884.mypikpak.com",
|
||||||
|
"dl-a10b-0885.mypikpak.com",
|
||||||
|
"dl-a10b-0886.mypikpak.com",
|
||||||
|
"dl-a10b-0887.mypikpak.com",
|
||||||
|
}
|
||||||
|
|
||||||
func (d *PikPak) login() error {
|
func (d *PikPak) login() error {
|
||||||
url := "https://user.mypikpak.com/v1/auth/signin"
|
url := "https://user.mypikpak.com/v1/auth/signin"
|
||||||
// 使用 用户填写的 CaptchaToken —————— (验证后的captcha_token)
|
// 使用 用户填写的 CaptchaToken —————— (验证后的captcha_token)
|
||||||
@ -180,13 +229,15 @@ func (d *PikPak) request(url string, method string, callback base.ReqCallback, r
|
|||||||
"X-Device-ID": d.GetDeviceID(),
|
"X-Device-ID": d.GetDeviceID(),
|
||||||
"X-Captcha-Token": d.GetCaptchaToken(),
|
"X-Captcha-Token": d.GetCaptchaToken(),
|
||||||
})
|
})
|
||||||
if d.oauth2Token != nil {
|
if d.RefreshTokenMethod == "oauth2" {
|
||||||
// 使用oauth2 获取 access_token
|
// 使用oauth2 获取 access_token
|
||||||
token, err := d.oauth2Token.Token()
|
token, err := d.oauth2Token.Token()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
req.SetAuthScheme(token.TokenType).SetAuthToken(token.AccessToken)
|
req.SetAuthScheme(token.TokenType).SetAuthToken(token.AccessToken)
|
||||||
|
} else {
|
||||||
|
req.SetHeader("Authorization", "Bearer "+d.AccessToken)
|
||||||
}
|
}
|
||||||
|
|
||||||
if callback != nil {
|
if callback != nil {
|
||||||
@ -277,6 +328,7 @@ type Common struct {
|
|||||||
UserAgent string
|
UserAgent string
|
||||||
// 验证码token刷新成功回调
|
// 验证码token刷新成功回调
|
||||||
RefreshCTokenCk func(token string)
|
RefreshCTokenCk func(token string)
|
||||||
|
LowLatencyAddr string
|
||||||
}
|
}
|
||||||
|
|
||||||
func generateDeviceSign(deviceID, packageName string) string {
|
func generateDeviceSign(deviceID, packageName string) string {
|
||||||
@ -667,3 +719,46 @@ func OssOption(params *S3Params) []oss.Option {
|
|||||||
}
|
}
|
||||||
return options
|
return options
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type AddressLatency struct {
|
||||||
|
Address string
|
||||||
|
Latency time.Duration
|
||||||
|
}
|
||||||
|
|
||||||
|
func checkLatency(address string, wg *sync.WaitGroup, ch chan<- AddressLatency) {
|
||||||
|
defer wg.Done()
|
||||||
|
start := time.Now()
|
||||||
|
resp, err := http.Get("https://" + address + "/generate_204")
|
||||||
|
if err != nil {
|
||||||
|
ch <- AddressLatency{Address: address, Latency: time.Hour} // Set high latency on error
|
||||||
|
return
|
||||||
|
}
|
||||||
|
defer resp.Body.Close()
|
||||||
|
latency := time.Since(start)
|
||||||
|
ch <- AddressLatency{Address: address, Latency: latency}
|
||||||
|
}
|
||||||
|
|
||||||
|
func findLowestLatencyAddress(addresses []string) string {
|
||||||
|
var wg sync.WaitGroup
|
||||||
|
ch := make(chan AddressLatency, len(addresses))
|
||||||
|
|
||||||
|
for _, address := range addresses {
|
||||||
|
wg.Add(1)
|
||||||
|
go checkLatency(address, &wg, ch)
|
||||||
|
}
|
||||||
|
|
||||||
|
wg.Wait()
|
||||||
|
close(ch)
|
||||||
|
|
||||||
|
var lowestLatencyAddress string
|
||||||
|
lowestLatency := time.Hour
|
||||||
|
|
||||||
|
for result := range ch {
|
||||||
|
if result.Latency < lowestLatency {
|
||||||
|
lowestLatency = result.Latency
|
||||||
|
lowestLatencyAddress = result.Address
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return lowestLatencyAddress
|
||||||
|
}
|
||||||
|
@ -4,6 +4,7 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"github.com/alist-org/alist/v3/internal/op"
|
"github.com/alist-org/alist/v3/internal/op"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"regexp"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/alist-org/alist/v3/internal/driver"
|
"github.com/alist-org/alist/v3/internal/driver"
|
||||||
@ -36,6 +37,7 @@ func (d *PikPakShare) Init(ctx context.Context) error {
|
|||||||
d.Common.CaptchaToken = token
|
d.Common.CaptchaToken = token
|
||||||
op.MustSaveDriverStorage(d)
|
op.MustSaveDriverStorage(d)
|
||||||
},
|
},
|
||||||
|
LowLatencyAddr: "",
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -60,6 +62,21 @@ func (d *PikPakShare) Init(ctx context.Context) error {
|
|||||||
d.PackageName = WebPackageName
|
d.PackageName = WebPackageName
|
||||||
d.Algorithms = WebAlgorithms
|
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"
|
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.5.6.4831 Chrome/100.0.4896.160 Electron/18.3.15 Safari/537.36"
|
||||||
|
}
|
||||||
|
|
||||||
|
if d.UseLowLatencyAddress && d.Addition.CustomLowLatencyAddress != "" {
|
||||||
|
d.Common.LowLatencyAddr = d.Addition.CustomLowLatencyAddress
|
||||||
|
} else if d.UseLowLatencyAddress {
|
||||||
|
d.Common.LowLatencyAddr = findLowestLatencyAddress(DlAddr)
|
||||||
|
d.Addition.CustomLowLatencyAddress = d.Common.LowLatencyAddr
|
||||||
|
op.MustSaveDriverStorage(d)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取CaptchaToken
|
// 获取CaptchaToken
|
||||||
@ -71,6 +88,7 @@ func (d *PikPakShare) Init(ctx context.Context) error {
|
|||||||
if d.SharePwd != "" {
|
if d.SharePwd != "" {
|
||||||
return d.getSharePassToken()
|
return d.getSharePassToken()
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -112,10 +130,16 @@ func (d *PikPakShare) Link(ctx context.Context, file model.Obj, args model.LinkA
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
link := model.Link{
|
|
||||||
URL: downloadUrl,
|
if d.UseLowLatencyAddress && d.Common.LowLatencyAddr != "" {
|
||||||
|
// 替换为加速链接
|
||||||
|
re := regexp.MustCompile(`https://[^/]+/download/`)
|
||||||
|
downloadUrl = re.ReplaceAllString(downloadUrl, "https://"+d.Common.LowLatencyAddr+"/download/")
|
||||||
}
|
}
|
||||||
return &link, nil
|
|
||||||
|
return &model.Link{
|
||||||
|
URL: downloadUrl,
|
||||||
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
var _ driver.Driver = (*PikPakShare)(nil)
|
var _ driver.Driver = (*PikPakShare)(nil)
|
||||||
|
@ -7,11 +7,13 @@ import (
|
|||||||
|
|
||||||
type Addition struct {
|
type Addition struct {
|
||||||
driver.RootID
|
driver.RootID
|
||||||
ShareId string `json:"share_id" required:"true"`
|
ShareId string `json:"share_id" required:"true"`
|
||||||
SharePwd string `json:"share_pwd"`
|
SharePwd string `json:"share_pwd"`
|
||||||
Platform string `json:"platform" required:"true" type:"select" options:"android,web"`
|
Platform string `json:"platform" required:"true" type:"select" options:"android,web,pc"`
|
||||||
DeviceID string `json:"device_id" required:"false" default:""`
|
DeviceID string `json:"device_id" required:"false" default:""`
|
||||||
UseTransCodingAddress bool `json:"use_transcoding_address" required:"true" default:"false"`
|
UseTransCodingAddress bool `json:"use_transcoding_address" required:"true" default:"false"`
|
||||||
|
UseLowLatencyAddress bool `json:"use_low_latency_address" default:"false"`
|
||||||
|
CustomLowLatencyAddress string `json:"custom_low_latency_address" default:""`
|
||||||
}
|
}
|
||||||
|
|
||||||
var config = driver.Config{
|
var config = driver.Config{
|
||||||
|
@ -10,6 +10,7 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
"regexp"
|
"regexp"
|
||||||
"strings"
|
"strings"
|
||||||
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/alist-org/alist/v3/drivers/base"
|
"github.com/alist-org/alist/v3/drivers/base"
|
||||||
@ -17,21 +18,14 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
var AndroidAlgorithms = []string{
|
var AndroidAlgorithms = []string{
|
||||||
"Gez0T9ijiI9WCeTsKSg3SMlx",
|
"aDhgaSE3MsjROCmpmsWqP1sJdFJ",
|
||||||
"zQdbalsolyb1R/",
|
"+oaVkqdd8MJuKT+uMr2AYKcd9tdWge3XPEPR2hcePUknd",
|
||||||
"ftOjr52zt51JD68C3s",
|
"u/sd2GgT2fTytRcKzGicHodhvIltMntA3xKw2SRv7S48OdnaQIS5mn",
|
||||||
"yeOBMH0JkbQdEFNNwQ0RI9T3wU/v",
|
"2WZiae2QuqTOxBKaaqCNHCW3olu2UImelkDzBn",
|
||||||
"BRJrQZiTQ65WtMvwO",
|
"/vJ3upic39lgmrkX855Qx",
|
||||||
"je8fqxKPdQVJiy1DM6Bc9Nb1",
|
"yNc9ruCVMV7pGV7XvFeuLMOcy1",
|
||||||
"niV",
|
"4FPq8mT3JQ1jzcVxMVfwFftLQm33M7i",
|
||||||
"9hFCW2R1",
|
"xozoy5e3Ea",
|
||||||
"sHKHpe2i96",
|
|
||||||
"p7c5E6AcXQ/IJUuAEC9W6",
|
|
||||||
"",
|
|
||||||
"aRv9hjc9P+Pbn+u3krN6",
|
|
||||||
"BzStcgE8qVdqjEH16l4",
|
|
||||||
"SqgeZvL5j9zoHP95xWHt",
|
|
||||||
"zVof5yaJkPe3VFpadPof",
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var WebAlgorithms = []string{
|
var WebAlgorithms = []string{
|
||||||
@ -52,19 +46,75 @@ var WebAlgorithms = []string{
|
|||||||
"NhXXU9rg4XXdzo7u5o",
|
"NhXXU9rg4XXdzo7u5o",
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var PCAlgorithms = []string{
|
||||||
|
"KHBJ07an7ROXDoK7Db",
|
||||||
|
"G6n399rSWkl7WcQmw5rpQInurc1DkLmLJqE",
|
||||||
|
"JZD1A3M4x+jBFN62hkr7VDhkkZxb9g3rWqRZqFAAb",
|
||||||
|
"fQnw/AmSlbbI91Ik15gpddGgyU7U",
|
||||||
|
"/Dv9JdPYSj3sHiWjouR95NTQff",
|
||||||
|
"yGx2zuTjbWENZqecNI+edrQgqmZKP",
|
||||||
|
"ljrbSzdHLwbqcRn",
|
||||||
|
"lSHAsqCkGDGxQqqwrVu",
|
||||||
|
"TsWXI81fD1",
|
||||||
|
"vk7hBjawK/rOSrSWajtbMk95nfgf3",
|
||||||
|
}
|
||||||
|
|
||||||
const (
|
const (
|
||||||
AndroidClientID = "YNxT9w7GMdWvEOKa"
|
AndroidClientID = "YNxT9w7GMdWvEOKa"
|
||||||
AndroidClientSecret = "dbw2OtmVEeuUvIptb1Coyg"
|
AndroidClientSecret = "dbw2OtmVEeuUvIptb1Coyg"
|
||||||
AndroidClientVersion = "1.47.1"
|
AndroidClientVersion = "1.48.3"
|
||||||
AndroidPackageName = "com.pikcloud.pikpak"
|
AndroidPackageName = "com.pikcloud.pikpak"
|
||||||
AndroidSdkVersion = "2.0.4.204000"
|
AndroidSdkVersion = "2.0.4.204101"
|
||||||
WebClientID = "YUMx5nI8ZU8Ap8pm"
|
WebClientID = "YUMx5nI8ZU8Ap8pm"
|
||||||
WebClientSecret = "dbw2OtmVEeuUvIptb1Coyg"
|
WebClientSecret = "dbw2OtmVEeuUvIptb1Coyg"
|
||||||
WebClientVersion = "2.0.0"
|
WebClientVersion = "2.0.0"
|
||||||
WebPackageName = "mypikpak.com"
|
WebPackageName = "mypikpak.com"
|
||||||
WebSdkVersion = "8.0.3"
|
WebSdkVersion = "8.0.3"
|
||||||
|
PCClientID = "YvtoWO6GNHiuCl7x"
|
||||||
|
PCClientSecret = "1NIH5R1IEe2pAxZE3hv3uA"
|
||||||
|
PCClientVersion = "undefined" // 2.5.6.4831
|
||||||
|
PCPackageName = "mypikpak.com"
|
||||||
|
PCSdkVersion = "8.0.3"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var DlAddr = []string{
|
||||||
|
"dl-a10b-0621.mypikpak.com",
|
||||||
|
"dl-a10b-0622.mypikpak.com",
|
||||||
|
"dl-a10b-0623.mypikpak.com",
|
||||||
|
"dl-a10b-0624.mypikpak.com",
|
||||||
|
"dl-a10b-0625.mypikpak.com",
|
||||||
|
"dl-a10b-0858.mypikpak.com",
|
||||||
|
"dl-a10b-0859.mypikpak.com",
|
||||||
|
"dl-a10b-0860.mypikpak.com",
|
||||||
|
"dl-a10b-0861.mypikpak.com",
|
||||||
|
"dl-a10b-0862.mypikpak.com",
|
||||||
|
"dl-a10b-0863.mypikpak.com",
|
||||||
|
"dl-a10b-0864.mypikpak.com",
|
||||||
|
"dl-a10b-0865.mypikpak.com",
|
||||||
|
"dl-a10b-0866.mypikpak.com",
|
||||||
|
"dl-a10b-0867.mypikpak.com",
|
||||||
|
"dl-a10b-0868.mypikpak.com",
|
||||||
|
"dl-a10b-0869.mypikpak.com",
|
||||||
|
"dl-a10b-0870.mypikpak.com",
|
||||||
|
"dl-a10b-0871.mypikpak.com",
|
||||||
|
"dl-a10b-0872.mypikpak.com",
|
||||||
|
"dl-a10b-0873.mypikpak.com",
|
||||||
|
"dl-a10b-0874.mypikpak.com",
|
||||||
|
"dl-a10b-0875.mypikpak.com",
|
||||||
|
"dl-a10b-0876.mypikpak.com",
|
||||||
|
"dl-a10b-0877.mypikpak.com",
|
||||||
|
"dl-a10b-0878.mypikpak.com",
|
||||||
|
"dl-a10b-0879.mypikpak.com",
|
||||||
|
"dl-a10b-0880.mypikpak.com",
|
||||||
|
"dl-a10b-0881.mypikpak.com",
|
||||||
|
"dl-a10b-0882.mypikpak.com",
|
||||||
|
"dl-a10b-0883.mypikpak.com",
|
||||||
|
"dl-a10b-0884.mypikpak.com",
|
||||||
|
"dl-a10b-0885.mypikpak.com",
|
||||||
|
"dl-a10b-0886.mypikpak.com",
|
||||||
|
"dl-a10b-0887.mypikpak.com",
|
||||||
|
}
|
||||||
|
|
||||||
func (d *PikPakShare) request(url string, method string, callback base.ReqCallback, resp interface{}) ([]byte, error) {
|
func (d *PikPakShare) request(url string, method string, callback base.ReqCallback, resp interface{}) ([]byte, error) {
|
||||||
req := base.RestyClient.R()
|
req := base.RestyClient.R()
|
||||||
req.SetHeaders(map[string]string{
|
req.SetHeaders(map[string]string{
|
||||||
@ -177,6 +227,7 @@ type Common struct {
|
|||||||
UserAgent string
|
UserAgent string
|
||||||
// 验证码token刷新成功回调
|
// 验证码token刷新成功回调
|
||||||
RefreshCTokenCk func(token string)
|
RefreshCTokenCk func(token string)
|
||||||
|
LowLatencyAddr string
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Common) SetUserAgent(userAgent string) {
|
func (c *Common) SetUserAgent(userAgent string) {
|
||||||
@ -316,3 +367,46 @@ func (d *PikPakShare) refreshCaptchaToken(action string, metas map[string]string
|
|||||||
d.Common.SetCaptchaToken(resp.CaptchaToken)
|
d.Common.SetCaptchaToken(resp.CaptchaToken)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type AddressLatency struct {
|
||||||
|
Address string
|
||||||
|
Latency time.Duration
|
||||||
|
}
|
||||||
|
|
||||||
|
func checkLatency(address string, wg *sync.WaitGroup, ch chan<- AddressLatency) {
|
||||||
|
defer wg.Done()
|
||||||
|
start := time.Now()
|
||||||
|
resp, err := http.Get("https://" + address + "/generate_204")
|
||||||
|
if err != nil {
|
||||||
|
ch <- AddressLatency{Address: address, Latency: time.Hour} // Set high latency on error
|
||||||
|
return
|
||||||
|
}
|
||||||
|
defer resp.Body.Close()
|
||||||
|
latency := time.Since(start)
|
||||||
|
ch <- AddressLatency{Address: address, Latency: latency}
|
||||||
|
}
|
||||||
|
|
||||||
|
func findLowestLatencyAddress(addresses []string) string {
|
||||||
|
var wg sync.WaitGroup
|
||||||
|
ch := make(chan AddressLatency, len(addresses))
|
||||||
|
|
||||||
|
for _, address := range addresses {
|
||||||
|
wg.Add(1)
|
||||||
|
go checkLatency(address, &wg, ch)
|
||||||
|
}
|
||||||
|
|
||||||
|
wg.Wait()
|
||||||
|
close(ch)
|
||||||
|
|
||||||
|
var lowestLatencyAddress string
|
||||||
|
lowestLatency := time.Hour
|
||||||
|
|
||||||
|
for result := range ch {
|
||||||
|
if result.Latency < lowestLatency {
|
||||||
|
lowestLatency = result.Latency
|
||||||
|
lowestLatencyAddress = result.Address
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return lowestLatencyAddress
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user