fix(thunder,189pc): some known problems

pull/2046/head
foxxorcat 2022-10-17 00:54:39 +08:00
parent 7a95850c1b
commit 0e99e7e9b9
4 changed files with 47 additions and 44 deletions

View File

@ -15,6 +15,7 @@ type Addition struct {
Type string `json:"type" type:"select" options:"personal,family" default:"personal"` Type string `json:"type" type:"select" options:"personal,family" default:"personal"`
FamilyID string `json:"family_id"` FamilyID string `json:"family_id"`
RapidUpload bool `json:"rapid_upload"` RapidUpload bool `json:"rapid_upload"`
NonuseOrc bool `json:"nonuse_orc"`
} }
var config = driver.Config{ var config = driver.Config{

View File

@ -186,20 +186,19 @@ func (y *Yun189PC) getFiles(ctx context.Context, fileId string) ([]model.Obj, er
func (y *Yun189PC) login() (err error) { func (y *Yun189PC) login() (err error) {
// 初始化登陆所需参数 // 初始化登陆所需参数
if y.loginParam == nil { if y.loginParam == nil || !y.NonuseOrc {
if err = y.initLoginParam(); err != nil { if err = y.initLoginParam(); err != nil {
// 验证码也通过错误返回 // 验证码也通过错误返回
return err return err
} }
} }
defer func() { defer func() {
// 销毁验证码 // 销毁验证码
y.VCode = "" y.VCode = ""
// 销毁登陆参数 // 销毁登陆参数
y.loginParam = nil y.loginParam = nil
// 遇到错误,重新加载登陆参数 // 遇到错误,重新加载登陆参数
if err != nil { if err != nil && y.NonuseOrc {
if err1 := y.initLoginParam(); err1 != nil { if err1 := y.initLoginParam(); err1 != nil {
err = fmt.Errorf("err1: %s \nerr2: %s", err, err1) 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.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.RsaUsername = encryptConf.Data.Pre + RsaEncrypt(param.jRsaKey, y.Username)
param.RsaPassword = encryptConf.Data.Pre + RsaEncrypt(param.jRsaKey, y.Password) 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 = &param y.loginParam = &param
if res.String() != "0" {
imgRes, err := y.client.R(). imgRes, err := y.client.R().
SetQueryParams(map[string]string{ SetQueryParams(map[string]string{
"token": param.CaptchaToken, "token": param.CaptchaToken,
"REQID": param.ReqId, "REQID": param.ReqId,
"rnd": fmt.Sprint(timestamp()), "rnd": fmt.Sprint(timestamp()),
}). }).
Get(AUTH_URL + "/api/logbox/oauth2/picCaptcha.do") Get(AUTH_URL + "/api/logbox/oauth2/picCaptcha.do")
if err != nil { if err != nil {
return fmt.Errorf("failed to obtain verification code") 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(). return fmt.Errorf(`need img validate code: <img src="data:image/png;base64,%s"/>`, base64.StdEncoding.EncodeToString(imgRes.Body()))
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 nil return nil
} }

View File

@ -59,13 +59,18 @@ func (x *Thunder) Init(ctx context.Context, storage model.Storage) (err error) {
"j", "j",
"4scKJNdd7F27Hv7tbt", "4scKJNdd7F27Hv7tbt",
}, },
DeviceID: "9aa5c268e7bcfc197a9ad88e2fb330e5", DeviceID: utils.GetMD5Encode(x.Username + x.Password),
ClientID: "Xp6vsxz_7IYVw2BB", ClientID: "Xp6vsxz_7IYVw2BB",
ClientSecret: "Xp6vsy4tN9toTVdMSpomVdXpRmES", ClientSecret: "Xp6vsy4tN9toTVdMSpomVdXpRmES",
ClientVersion: "7.51.0.8196", ClientVersion: "7.51.0.8196",
PackageName: "com.xunlei.downloadprovider", 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)", 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)", 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 { refreshTokenFunc: func() error {
// 通过RefreshToken刷新 // 通过RefreshToken刷新
@ -88,7 +93,6 @@ func (x *Thunder) Init(ctx context.Context, storage model.Storage) (err error) {
ctoekn := strings.TrimSpace(x.CaptchaToken) ctoekn := strings.TrimSpace(x.CaptchaToken)
if ctoekn != "" { if ctoekn != "" {
x.SetCaptchaToken(ctoekn) x.SetCaptchaToken(ctoekn)
x.CaptchaToken = ""
} }
// 防止重复登录 // 防止重复登录
@ -139,7 +143,7 @@ func (x *ThunderExpert) Init(ctx context.Context, storage model.Storage) (err er
Common: &Common{ Common: &Common{
client: base.NewRestyClient(), client: base.NewRestyClient(),
DeviceID: x.DeviceID, DeviceID: utils.GetMD5Encode(x.DeviceID),
ClientID: x.ClientID, ClientID: x.ClientID,
ClientSecret: x.ClientSecret, ClientSecret: x.ClientSecret,
ClientVersion: x.ClientVersion, ClientVersion: x.ClientVersion,
@ -147,12 +151,16 @@ func (x *ThunderExpert) Init(ctx context.Context, storage model.Storage) (err er
UserAgent: x.UserAgent, UserAgent: x.UserAgent,
DownloadUserAgent: x.DownloadUserAgent, DownloadUserAgent: x.DownloadUserAgent,
UseVideoUrl: x.UseVideoUrl, UseVideoUrl: x.UseVideoUrl,
refreshCTokenCk: func(token string) {
x.CaptchaToken = token
op.MustSaveDriverStorage(x)
},
}, },
} }
if x.CaptchaToken != "" { if x.CaptchaToken != "" {
x.SetCaptchaToken(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 // 仅修改验证码token
if x.CaptchaToken != "" { if x.CaptchaToken != "" {
x.SetCaptchaToken(x.CaptchaToken) x.SetCaptchaToken(x.CaptchaToken)
x.CaptchaToken = ""
} }
x.XunLeiCommon.UserAgent = x.UserAgent x.XunLeiCommon.UserAgent = x.UserAgent
x.XunLeiCommon.DownloadUserAgent = x.DownloadUserAgent x.XunLeiCommon.DownloadUserAgent = x.DownloadUserAgent

View File

@ -53,6 +53,9 @@ type Common struct {
UserAgent string UserAgent string
DownloadUserAgent string DownloadUserAgent string
UseVideoUrl bool UseVideoUrl bool
// 验证码token刷新成功回调
refreshCTokenCk func(token string)
} }
func (c *Common) SetCaptchaToken(captchaToken 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 != "" { 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 == "" { if resp.CaptchaToken == "" {
return fmt.Errorf("empty captchaToken") return fmt.Errorf("empty captchaToken")
} }
if c.refreshCTokenCk != nil {
c.refreshCTokenCk(resp.CaptchaToken)
}
c.SetCaptchaToken(resp.CaptchaToken) c.SetCaptchaToken(resp.CaptchaToken)
return nil return nil
} }