From 6d85f1b0c0f68b5ef3876de296bc62122a2b2970 Mon Sep 17 00:00:00 2001 From: 123pan <136693889+123pan-com@users.noreply.github.com> Date: Fri, 9 Feb 2024 14:45:44 +0800 Subject: [PATCH] fix(123): `User-Agent` and rate limit (#6012) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 修复标签 * 新增接口限流器。防止云盘云端把Alist当做攻击,封禁Alist客户端 --------- Co-authored-by: 风信子 --- drivers/123/driver.go | 11 +++++++++++ drivers/123/util.go | 9 +++++++-- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/drivers/123/driver.go b/drivers/123/driver.go index 1f1ae85886a..f5d981ef636 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 1a86e1bdef2..9d5d6780167 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",