diff --git a/drivers/123/driver.go b/drivers/123/driver.go index 1f1ae858..f5d981ef 100644 --- a/drivers/123/driver.go +++ b/drivers/123/driver.go @@ -6,9 +6,12 @@ import ( "encoding/base64" "encoding/hex" "fmt" + "golang.org/x/time/rate" "io" "net/http" "net/url" + "sync" + "time" "github.com/alist-org/alist/v3/drivers/base" "github.com/alist-org/alist/v3/internal/driver" @@ -26,6 +29,7 @@ import ( type Pan123 struct { model.Storage Addition + apiRateLimit sync.Map } func (d *Pan123) Config() driver.Config { @@ -254,4 +258,11 @@ func (d *Pan123) Put(ctx context.Context, dstDir model.Obj, stream model.FileStr return err } +func (d *Pan123) APIRateLimit(api string) bool { + limiter, _ := d.apiRateLimit.LoadOrStore(api, + rate.NewLimiter(rate.Every(time.Millisecond*700), 1)) + ins := limiter.(*rate.Limiter) + return ins.Allow() +} + var _ driver.Driver = (*Pan123)(nil) diff --git a/drivers/123/util.go b/drivers/123/util.go index 1a86e1bd..9d5d6780 100644 --- a/drivers/123/util.go +++ b/drivers/123/util.go @@ -160,7 +160,7 @@ func (d *Pan123) login() error { SetHeaders(map[string]string{ "origin": "https://www.123pan.com", "referer": "https://www.123pan.com/", - "user-agent": "Dart/2.19(dart:io)", + "user-agent": "Dart/2.19(dart:io)-alist", "platform": "web", "app-version": "3", //"user-agent": base.UserAgent, @@ -197,7 +197,7 @@ func (d *Pan123) request(url string, method string, callback base.ReqCallback, r "origin": "https://www.123pan.com", "referer": "https://www.123pan.com/", "authorization": "Bearer " + d.AccessToken, - "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0", + "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) alist-client", "platform": "web", "app-version": "3", //"user-agent": base.UserAgent, @@ -235,7 +235,12 @@ func (d *Pan123) request(url string, method string, callback base.ReqCallback, r func (d *Pan123) getFiles(parentId string) ([]File, error) { page := 1 res := make([]File, 0) + // 2024-02-06 fix concurrency by 123pan for { + if !d.APIRateLimit(FileList) { + time.Sleep(time.Millisecond * 200) + continue + } var resp Files query := map[string]string{ "driveId": "0",