From 912ec361dbf7fa696976ee954058e4f4880939bb Mon Sep 17 00:00:00 2001 From: zijiren233 Date: Wed, 1 Nov 2023 17:04:00 +0800 Subject: [PATCH] Feat: bilibili client ctx --- server/handlers/vendors/bilibili/login.go | 10 ++++---- vendors/bilibili/client.go | 17 +++++++++---- vendors/bilibili/login.go | 29 ++++++++++++++--------- 3 files changed, 36 insertions(+), 20 deletions(-) diff --git a/server/handlers/vendors/bilibili/login.go b/server/handlers/vendors/bilibili/login.go index fc8ae89b..8ac13544 100644 --- a/server/handlers/vendors/bilibili/login.go +++ b/server/handlers/vendors/bilibili/login.go @@ -14,7 +14,7 @@ import ( ) func NewQRCode(ctx *gin.Context) { - r, err := bilibili.NewQRCode() + r, err := bilibili.NewQRCode(ctx) if err != nil { ctx.AbortWithStatusJSON(http.StatusInternalServerError, model.NewApiErrorResp(err)) return @@ -46,7 +46,7 @@ func LoginWithQR(ctx *gin.Context) { return } - cookie, err := bilibili.LoginWithQRCode(req.Key) + cookie, err := bilibili.LoginWithQRCode(ctx, req.Key) if err != nil { ctx.AbortWithStatusJSON(http.StatusBadRequest, model.NewApiErrorResp(err)) return @@ -62,7 +62,7 @@ func LoginWithQR(ctx *gin.Context) { } func NewCaptcha(ctx *gin.Context) { - r, err := bilibili.NewCaptcha() + r, err := bilibili.NewCaptcha(ctx) if err != nil { ctx.AbortWithStatusJSON(http.StatusInternalServerError, model.NewApiErrorResp(err)) return @@ -103,7 +103,7 @@ func NewSMS(ctx *gin.Context) { ctx.AbortWithStatusJSON(http.StatusBadRequest, model.NewApiErrorResp(err)) return } - r, err := bilibili.NewSMS(req.Telephone, req.Token, req.Challenge, req.Validate_) + r, err := bilibili.NewSMS(ctx, req.Telephone, req.Token, req.Challenge, req.Validate_) if err != nil { ctx.AbortWithStatusJSON(http.StatusInternalServerError, model.NewApiErrorResp(err)) return @@ -142,7 +142,7 @@ func LoginWithSMS(ctx *gin.Context) { ctx.AbortWithStatusJSON(http.StatusBadRequest, model.NewApiErrorResp(err)) return } - c, err := bilibili.LoginWithSMS(req.Telephone, req.Code, req.CaptchaKey) + c, err := bilibili.LoginWithSMS(ctx, req.Telephone, req.Code, req.CaptchaKey) if err != nil { ctx.AbortWithStatusJSON(http.StatusInternalServerError, model.NewApiErrorResp(err)) return diff --git a/vendors/bilibili/client.go b/vendors/bilibili/client.go index 9f4c172a..a0fc89fe 100644 --- a/vendors/bilibili/client.go +++ b/vendors/bilibili/client.go @@ -1,6 +1,7 @@ package bilibili import ( + "context" "errors" "io" "net/http" @@ -12,6 +13,7 @@ type Client struct { httpClient *http.Client cookies []*http.Cookie buvid3 *http.Cookie + ctx context.Context } type ClientConfig func(*Client) @@ -22,15 +24,22 @@ func WithHttpClient(httpClient *http.Client) ClientConfig { } } +func WithContext(ctx context.Context) ClientConfig { + return func(c *Client) { + c.ctx = ctx + } +} + func NewClient(cookies []*http.Cookie, conf ...ClientConfig) (*Client, error) { cli := &Client{ httpClient: http.DefaultClient, cookies: cookies, + ctx: context.Background(), } for _, v := range conf { v(cli) } - c, err := newBuvid3() + c, err := newBuvid3(cli.ctx) if err != nil { return nil, err } @@ -38,8 +47,8 @@ func NewClient(cookies []*http.Cookie, conf ...ClientConfig) (*Client, error) { return cli, nil } -func newBuvid3() (*http.Cookie, error) { - req, err := http.NewRequest(http.MethodGet, "https://www.bilibili.com/", nil) +func newBuvid3(ctx context.Context) (*http.Cookie, error) { + req, err := http.NewRequestWithContext(ctx, http.MethodGet, "https://www.bilibili.com/", nil) if err != nil { return nil, err } @@ -90,7 +99,7 @@ func (c *Client) NewRequest(method, url string, body io.Reader, conf ...RequestO return nil, err } } - req, err = http.NewRequest(method, url, body) + req, err = http.NewRequestWithContext(c.ctx, method, url, body) if err != nil { return nil, err } diff --git a/vendors/bilibili/login.go b/vendors/bilibili/login.go index 4f555814..b663bcf0 100644 --- a/vendors/bilibili/login.go +++ b/vendors/bilibili/login.go @@ -1,6 +1,7 @@ package bilibili import ( + "context" "fmt" "net/http" "net/url" @@ -15,11 +16,13 @@ type RQCode struct { Key string `json:"key"` } -func NewQRCode() (*RQCode, error) { - req, err := http.NewRequest(http.MethodGet, "https://passport.bilibili.com/x/passport-login/web/qrcode/generate", nil) +func NewQRCode(ctx context.Context) (*RQCode, error) { + req, err := http.NewRequestWithContext(ctx, http.MethodGet, "https://passport.bilibili.com/x/passport-login/web/qrcode/generate", nil) if err != nil { return nil, err } + req.Header.Set("Referer", "https://passport.bilibili.com/login") + req.Header.Set("User-Agent", utils.UA) resp, err := http.DefaultClient.Do(req) if err != nil { return nil, err @@ -38,11 +41,12 @@ func NewQRCode() (*RQCode, error) { } // return SESSDATA cookie -func LoginWithQRCode(key string) (*http.Cookie, error) { - req, err := http.NewRequest(http.MethodGet, fmt.Sprintf("https://passport.bilibili.com/x/passport-login/web/qrcode/auth?oauthKey=%s", key), nil) +func LoginWithQRCode(ctx context.Context, key string) (*http.Cookie, error) { + req, err := http.NewRequestWithContext(ctx, http.MethodGet, fmt.Sprintf("https://passport.bilibili.com/x/passport-login/web/qrcode/poll?qrcode_key=%s", key), nil) if err != nil { return nil, err } + req.Header.Set("Referer", "https://passport.bilibili.com/login") req.Header.Set("User-Agent", utils.UA) resp, err := http.DefaultClient.Do(req) if err != nil { @@ -63,11 +67,12 @@ type CaptchaResp struct { Challenge string `json:"challenge"` } -func NewCaptcha() (*CaptchaResp, error) { - req, err := http.NewRequest(http.MethodGet, "https://passport.bilibili.com/x/passport-login/captcha", nil) +func NewCaptcha(ctx context.Context) (*CaptchaResp, error) { + req, err := http.NewRequestWithContext(ctx, http.MethodGet, "https://passport.bilibili.com/x/passport-login/captcha", nil) if err != nil { return nil, err } + req.Header.Set("Referer", "https://passport.bilibili.com/login") req.Header.Set("User-Agent", utils.UA) resp, err := http.DefaultClient.Do(req) if err != nil { @@ -110,8 +115,8 @@ type sms struct { } `json:"data"` } -func NewSMS(tel, token, challenge, validate string) (captchaKey string, err error) { - buvid3, err := newBuvid3() +func NewSMS(ctx context.Context, tel, token, challenge, validate string) (captchaKey string, err error) { + buvid3, err := newBuvid3(ctx) if err != nil { return "", err } @@ -124,10 +129,11 @@ func NewSMS(tel, token, challenge, validate string) (captchaKey string, err erro data.Set("validate", validate) data.Set("seccode", fmt.Sprintf("%s|jordan", validate)) - req, err := http.NewRequest(http.MethodPost, "https://passport.bilibili.com/x/passport-login/web/sms/send", strings.NewReader(data.Encode())) + req, err := http.NewRequestWithContext(ctx, http.MethodPost, "https://passport.bilibili.com/x/passport-login/web/sms/send", strings.NewReader(data.Encode())) if err != nil { return "", err } + req.Header.Set("Referer", "https://passport.bilibili.com/login") req.Header.Set("User-Agent", utils.UA) req.Header.Set("Content-Type", "application/x-www-form-urlencoded") req.AddCookie(buvid3) @@ -144,7 +150,7 @@ func NewSMS(tel, token, challenge, validate string) (captchaKey string, err erro return sms.Data.CaptchaKey, nil } -func LoginWithSMS(tel, code, captchaKey string) (*http.Cookie, error) { +func LoginWithSMS(ctx context.Context, tel, code, captchaKey string) (*http.Cookie, error) { data := url.Values{} data.Set("cid", "86") data.Set("tel", tel) @@ -152,10 +158,11 @@ func LoginWithSMS(tel, code, captchaKey string) (*http.Cookie, error) { data.Set("source", "main-fe-header") data.Set("captcha_key", captchaKey) - req, err := http.NewRequest(http.MethodPost, "https://passport.bilibili.com/x/passport-login/web/login/sms", strings.NewReader(data.Encode())) + req, err := http.NewRequestWithContext(ctx, http.MethodPost, "https://passport.bilibili.com/x/passport-login/web/login/sms", strings.NewReader(data.Encode())) if err != nil { return nil, err } + req.Header.Set("Referer", "https://passport.bilibili.com/login") req.Header.Set("User-Agent", utils.UA) req.Header.Set("Content-Type", "application/x-www-form-urlencoded") resp, err := http.DefaultClient.Do(req)