diff --git a/internal/application/cpdaily/login/ahjzu.go b/internal/application/cpdaily/login/ahjzu.go index f329f1d..abfca4b 100644 --- a/internal/application/cpdaily/login/ahjzu.go +++ b/internal/application/cpdaily/login/ahjzu.go @@ -204,6 +204,6 @@ func (c CpdailyAhjzuLogin) GetClient() *resty.Client { func NewAhjzu(ctx context.Context) *CpdailyAhjzuLogin { return &CpdailyAhjzuLogin{ - client: httpclient.Cpdaily.Clone(ctx), + client: httpclient.NewCpdailyClient(), } } diff --git a/internal/application/cpdaily/login/cas.go b/internal/application/cpdaily/login/cas.go index 8e6b139..5c8d6ce 100644 --- a/internal/application/cpdaily/login/cas.go +++ b/internal/application/cpdaily/login/cas.go @@ -39,7 +39,7 @@ type CpdailyCasLogin struct { func NewCas(ctx context.Context) CpdailyLogin { return &CpdailyCasLogin{ - client: httpclient.Cpdaily.Clone(ctx), + client: httpclient.NewCpdailyClient(), } } @@ -289,7 +289,7 @@ func (c *CpdailyCasLogin) ConfirmAdd(ctx context.Context, sc *school.SchoolDetai utils.OkOrPanic(err) // 提交确认添加 - client := httpclient.Cpdaily.Clone(ctx) + client := httpclient.NewCpdailyClient() client.SetCookieJar(cookieJar) post, err := client.R().SetFormData(map[string]string{ "service": service, diff --git a/internal/application/cpdaily/login/common.go b/internal/application/cpdaily/login/common.go index cef3603..49b8951 100644 --- a/internal/application/cpdaily/login/common.go +++ b/internal/application/cpdaily/login/common.go @@ -105,7 +105,8 @@ func CookieEnabled(ctx context.Context, host string, client *resty.Client) bool func GetClient(ctx context.Context, cookie string) *resty.Client { cookieJar := cookiejar.NewPersistCookieJar() cookieJar.Deserialize(cookie) - client := httpclient.Cpdaily.Clone(ctx) + // 不使用 Clone,创建全新的独立 client 实例避免状态共享 + client := httpclient.NewCpdailyClient() client.SetCookieJar(cookieJar) return client } diff --git a/internal/application/cpdaily/login/iap.go b/internal/application/cpdaily/login/iap.go index b69ce10..27920f4 100644 --- a/internal/application/cpdaily/login/iap.go +++ b/internal/application/cpdaily/login/iap.go @@ -27,7 +27,7 @@ type CpdailyIapLogin struct { func NewIap(ctx context.Context) *CpdailyIapLogin { return &CpdailyIapLogin{ - client: httpclient.Cpdaily.Clone(ctx), + client: httpclient.NewCpdailyClient(), } } diff --git a/internal/application/cpdaily/login/nut.go b/internal/application/cpdaily/login/nut.go index 787d39e..02d0c54 100644 --- a/internal/application/cpdaily/login/nut.go +++ b/internal/application/cpdaily/login/nut.go @@ -201,7 +201,7 @@ func (c CpdailyNutLogin) GetClient() *resty.Client { func NewNut(ctx context.Context) *CpdailyNutLogin { return &CpdailyNutLogin{ - client: httpclient.Cpdaily.Clone(ctx), + client: httpclient.NewCpdailyClient(), } } func reverseStringASCII(s string) string { diff --git a/internal/application/cpdaily/school/school_fetcher.go b/internal/application/cpdaily/school/school_fetcher.go index 75f824b..bb1cd38 100644 --- a/internal/application/cpdaily/school/school_fetcher.go +++ b/internal/application/cpdaily/school/school_fetcher.go @@ -16,7 +16,7 @@ import ( ) func GetSchoolList(ctx context.Context) []CpdailySchoolBriefInfo { - response, err := httpclient.Cpdaily.R(). + response, err := httpclient.Cpdaily.Clone(ctx).R(). WithContext(ctx). Get("https://static.campushoy.com/apicache/tenantListSort") @@ -52,7 +52,7 @@ func GetSchoolList(ctx context.Context) []CpdailySchoolBriefInfo { } func GetSchoolDetail(ctx context.Context, tenantId string) SchoolDetailInfo { - response, err := httpclient.Cpdaily.R().Clone(ctx). + response, err := httpclient.Cpdaily.Clone(ctx).R(). SetHeaders(map[string]string{ "deviceType": "2", "CpdailyClientType": "CPDAILY", diff --git a/internal/application/httpclient/cpdaily.go b/internal/application/httpclient/cpdaily.go index 7f669f5..594278e 100644 --- a/internal/application/httpclient/cpdaily.go +++ b/internal/application/httpclient/cpdaily.go @@ -24,3 +24,25 @@ func init() { Cpdaily.SetProxy("http://127.0.0.1:9000") } } + +// NewCpdailyClient 创建一个全新的独立 client 实例,避免 Clone 可能的浅拷贝问题 +// 每个实例都是完全独立的,适用于并发场景,不会共享状态 +func NewCpdailyClient() *resty.Client { + client := resty.New(). + SetCookieJar(nil). + SetTimeout(30*time.Second). + SetDoNotParseResponse(true). + SetTLSClientConfig(&tls.Config{ + InsecureSkipVerify: true, + }). + SetHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36") + + // 根据调试模式设置代理和调试选项 + if !utils.IsDebug() { + client.SetDebug(false) + } else { + client.SetProxy("http://127.0.0.1:9000") + } + + return client +}