mirror of https://github.com/Xhofe/alist
				
				
				
			fix(thunder,189pc): some known problems
							parent
							
								
									7a95850c1b
								
							
						
					
					
						commit
						0e99e7e9b9
					
				| 
						 | 
				
			
			@ -15,6 +15,7 @@ type Addition struct {
 | 
			
		|||
	Type           string `json:"type" type:"select" options:"personal,family" default:"personal"`
 | 
			
		||||
	FamilyID       string `json:"family_id"`
 | 
			
		||||
	RapidUpload    bool   `json:"rapid_upload"`
 | 
			
		||||
	NonuseOrc      bool   `json:"nonuse_orc"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var config = driver.Config{
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -186,20 +186,19 @@ func (y *Yun189PC) getFiles(ctx context.Context, fileId string) ([]model.Obj, er
 | 
			
		|||
 | 
			
		||||
func (y *Yun189PC) login() (err error) {
 | 
			
		||||
	// 初始化登陆所需参数
 | 
			
		||||
	if y.loginParam == nil {
 | 
			
		||||
	if y.loginParam == nil || !y.NonuseOrc {
 | 
			
		||||
		if err = y.initLoginParam(); err != nil {
 | 
			
		||||
			// 验证码也通过错误返回
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	defer func() {
 | 
			
		||||
		// 销毁验证码
 | 
			
		||||
		y.VCode = ""
 | 
			
		||||
		// 销毁登陆参数
 | 
			
		||||
		y.loginParam = nil
 | 
			
		||||
		// 遇到错误,重新加载登陆参数
 | 
			
		||||
		if err != nil {
 | 
			
		||||
		if err != nil && y.NonuseOrc {
 | 
			
		||||
			if err1 := y.initLoginParam(); err1 != nil {
 | 
			
		||||
				err = fmt.Errorf("err1: %s \nerr2: %s", err, err1)
 | 
			
		||||
			}
 | 
			
		||||
| 
						 | 
				
			
			@ -303,44 +302,34 @@ func (y *Yun189PC) initLoginParam() error {
 | 
			
		|||
	param.jRsaKey = fmt.Sprintf("-----BEGIN PUBLIC KEY-----\n%s\n-----END PUBLIC KEY-----", encryptConf.Data.PubKey)
 | 
			
		||||
	param.RsaUsername = encryptConf.Data.Pre + RsaEncrypt(param.jRsaKey, y.Username)
 | 
			
		||||
	param.RsaPassword = encryptConf.Data.Pre + RsaEncrypt(param.jRsaKey, y.Password)
 | 
			
		||||
 | 
			
		||||
	// 判断是否需要验证码
 | 
			
		||||
	res, err = y.client.R().
 | 
			
		||||
		SetFormData(map[string]string{
 | 
			
		||||
			"appKey":      APP_ID,
 | 
			
		||||
			"accountType": ACCOUNT_TYPE,
 | 
			
		||||
			"userName":    param.RsaUsername,
 | 
			
		||||
		}).
 | 
			
		||||
		Post(AUTH_URL + "/api/logbox/oauth2/needcaptcha.do")
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	y.loginParam = ¶m
 | 
			
		||||
	if res.String() != "0" {
 | 
			
		||||
		imgRes, err := y.client.R().
 | 
			
		||||
			SetQueryParams(map[string]string{
 | 
			
		||||
				"token": param.CaptchaToken,
 | 
			
		||||
				"REQID": param.ReqId,
 | 
			
		||||
				"rnd":   fmt.Sprint(timestamp()),
 | 
			
		||||
			}).
 | 
			
		||||
			Get(AUTH_URL + "/api/logbox/oauth2/picCaptcha.do")
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return fmt.Errorf("failed to obtain verification code")
 | 
			
		||||
 | 
			
		||||
	imgRes, err := y.client.R().
 | 
			
		||||
		SetQueryParams(map[string]string{
 | 
			
		||||
			"token": param.CaptchaToken,
 | 
			
		||||
			"REQID": param.ReqId,
 | 
			
		||||
			"rnd":   fmt.Sprint(timestamp()),
 | 
			
		||||
		}).
 | 
			
		||||
		Get(AUTH_URL + "/api/logbox/oauth2/picCaptcha.do")
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return fmt.Errorf("failed to obtain verification code")
 | 
			
		||||
	}
 | 
			
		||||
	if imgRes.Size() > 0 {
 | 
			
		||||
		if setting.GetStr(conf.OcrApi) != "" && !y.NonuseOrc {
 | 
			
		||||
			vRes, err := base.RestyClient.R().
 | 
			
		||||
				SetMultipartField("image", "validateCode.png", "image/png", bytes.NewReader(imgRes.Body())).
 | 
			
		||||
				Post(setting.GetStr(conf.OcrApi))
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
			if jsoniter.Get(vRes.Body(), "status").ToInt() == 200 {
 | 
			
		||||
				y.VCode = jsoniter.Get(vRes.Body(), "result").ToString()
 | 
			
		||||
				return nil
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// 尝试使用ocr
 | 
			
		||||
		vRes, err := base.RestyClient.R().
 | 
			
		||||
			SetMultipartField("image", "validateCode.png", "image/png", bytes.NewReader(imgRes.Body())).
 | 
			
		||||
			Post(setting.GetStr(conf.OcrApi))
 | 
			
		||||
		if err == nil && jsoniter.Get(vRes.Body(), "status").ToInt() == 200 {
 | 
			
		||||
			y.VCode = jsoniter.Get(vRes.Body(), "result").ToString()
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// ocr无法处理,返回验证码图片给前端
 | 
			
		||||
		if len(y.VCode) != 4 {
 | 
			
		||||
			return fmt.Errorf("need validate code: data:image/png;base64,%s", base64.StdEncoding.EncodeToString(res.Body()))
 | 
			
		||||
		}
 | 
			
		||||
		// 返回验证码图片给前端
 | 
			
		||||
		return fmt.Errorf(`need img validate code: <img src="data:image/png;base64,%s"/>`, base64.StdEncoding.EncodeToString(imgRes.Body()))
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -59,13 +59,18 @@ func (x *Thunder) Init(ctx context.Context, storage model.Storage) (err error) {
 | 
			
		|||
					"j",
 | 
			
		||||
					"4scKJNdd7F27Hv7tbt",
 | 
			
		||||
				},
 | 
			
		||||
				DeviceID:          "9aa5c268e7bcfc197a9ad88e2fb330e5",
 | 
			
		||||
				DeviceID:          utils.GetMD5Encode(x.Username + x.Password),
 | 
			
		||||
				ClientID:          "Xp6vsxz_7IYVw2BB",
 | 
			
		||||
				ClientSecret:      "Xp6vsy4tN9toTVdMSpomVdXpRmES",
 | 
			
		||||
				ClientVersion:     "7.51.0.8196",
 | 
			
		||||
				PackageName:       "com.xunlei.downloadprovider",
 | 
			
		||||
				UserAgent:         "ANDROID-com.xunlei.downloadprovider/7.51.0.8196 netWorkType/5G appid/40 deviceName/Xiaomi_M2004j7ac deviceModel/M2004J7AC OSVersion/12 protocolVersion/301 platformVersion/10 sdkVersion/220200 Oauth2Client/0.9 (Linux 4_14_186-perf-gddfs8vbb238b) (JAVA 0)",
 | 
			
		||||
				DownloadUserAgent: "Dalvik/2.1.0 (Linux; U; Android 12; M2004J7AC Build/SP1A.210812.016)",
 | 
			
		||||
 | 
			
		||||
				refreshCTokenCk: func(token string) {
 | 
			
		||||
					x.CaptchaToken = token
 | 
			
		||||
					op.MustSaveDriverStorage(x)
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
			refreshTokenFunc: func() error {
 | 
			
		||||
				// 通过RefreshToken刷新
 | 
			
		||||
| 
						 | 
				
			
			@ -88,7 +93,6 @@ func (x *Thunder) Init(ctx context.Context, storage model.Storage) (err error) {
 | 
			
		|||
	ctoekn := strings.TrimSpace(x.CaptchaToken)
 | 
			
		||||
	if ctoekn != "" {
 | 
			
		||||
		x.SetCaptchaToken(ctoekn)
 | 
			
		||||
		x.CaptchaToken = ""
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// 防止重复登录
 | 
			
		||||
| 
						 | 
				
			
			@ -139,7 +143,7 @@ func (x *ThunderExpert) Init(ctx context.Context, storage model.Storage) (err er
 | 
			
		|||
			Common: &Common{
 | 
			
		||||
				client: base.NewRestyClient(),
 | 
			
		||||
 | 
			
		||||
				DeviceID:          x.DeviceID,
 | 
			
		||||
				DeviceID:          utils.GetMD5Encode(x.DeviceID),
 | 
			
		||||
				ClientID:          x.ClientID,
 | 
			
		||||
				ClientSecret:      x.ClientSecret,
 | 
			
		||||
				ClientVersion:     x.ClientVersion,
 | 
			
		||||
| 
						 | 
				
			
			@ -147,12 +151,16 @@ func (x *ThunderExpert) Init(ctx context.Context, storage model.Storage) (err er
 | 
			
		|||
				UserAgent:         x.UserAgent,
 | 
			
		||||
				DownloadUserAgent: x.DownloadUserAgent,
 | 
			
		||||
				UseVideoUrl:       x.UseVideoUrl,
 | 
			
		||||
 | 
			
		||||
				refreshCTokenCk: func(token string) {
 | 
			
		||||
					x.CaptchaToken = token
 | 
			
		||||
					op.MustSaveDriverStorage(x)
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if x.CaptchaToken != "" {
 | 
			
		||||
			x.SetCaptchaToken(x.CaptchaToken)
 | 
			
		||||
			x.CaptchaToken = ""
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// 签名方法
 | 
			
		||||
| 
						 | 
				
			
			@ -206,7 +214,6 @@ func (x *ThunderExpert) Init(ctx context.Context, storage model.Storage) (err er
 | 
			
		|||
		// 仅修改验证码token
 | 
			
		||||
		if x.CaptchaToken != "" {
 | 
			
		||||
			x.SetCaptchaToken(x.CaptchaToken)
 | 
			
		||||
			x.CaptchaToken = ""
 | 
			
		||||
		}
 | 
			
		||||
		x.XunLeiCommon.UserAgent = x.UserAgent
 | 
			
		||||
		x.XunLeiCommon.DownloadUserAgent = x.DownloadUserAgent
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -53,6 +53,9 @@ type Common struct {
 | 
			
		|||
	UserAgent         string
 | 
			
		||||
	DownloadUserAgent string
 | 
			
		||||
	UseVideoUrl       bool
 | 
			
		||||
 | 
			
		||||
	// 验证码token刷新成功回调
 | 
			
		||||
	refreshCTokenCk func(token string)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (c *Common) SetCaptchaToken(captchaToken string) {
 | 
			
		||||
| 
						 | 
				
			
			@ -125,13 +128,16 @@ func (c *Common) refreshCaptchaToken(action string, metas map[string]string) err
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	if resp.Url != "" {
 | 
			
		||||
		return fmt.Errorf("need verify:%s", resp.Url)
 | 
			
		||||
		return fmt.Errorf(`need verify: <a target="_blank" href="%s">Click Here</a>`, resp.Url)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if resp.CaptchaToken == "" {
 | 
			
		||||
		return fmt.Errorf("empty captchaToken")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if c.refreshCTokenCk != nil {
 | 
			
		||||
		c.refreshCTokenCk(resp.CaptchaToken)
 | 
			
		||||
	}
 | 
			
		||||
	c.SetCaptchaToken(resp.CaptchaToken)
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue