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"`
|
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{
|
||||||
|
|
|
@ -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,21 +302,8 @@ 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 = ¶m
|
y.loginParam = ¶m
|
||||||
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,
|
||||||
|
@ -328,19 +314,22 @@ func (y *Yun189PC) initLoginParam() error {
|
||||||
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 {
|
||||||
// 尝试使用ocr
|
if setting.GetStr(conf.OcrApi) != "" && !y.NonuseOrc {
|
||||||
vRes, err := base.RestyClient.R().
|
vRes, err := base.RestyClient.R().
|
||||||
SetMultipartField("image", "validateCode.png", "image/png", bytes.NewReader(imgRes.Body())).
|
SetMultipartField("image", "validateCode.png", "image/png", bytes.NewReader(imgRes.Body())).
|
||||||
Post(setting.GetStr(conf.OcrApi))
|
Post(setting.GetStr(conf.OcrApi))
|
||||||
if err == nil && jsoniter.Get(vRes.Body(), "status").ToInt() == 200 {
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if jsoniter.Get(vRes.Body(), "status").ToInt() == 200 {
|
||||||
y.VCode = jsoniter.Get(vRes.Body(), "result").ToString()
|
y.VCode = jsoniter.Get(vRes.Body(), "result").ToString()
|
||||||
|
return nil
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ocr无法处理,返回验证码图片给前端
|
// 返回验证码图片给前端
|
||||||
if len(y.VCode) != 4 {
|
return fmt.Errorf(`need img validate code: <img src="data:image/png;base64,%s"/>`, base64.StdEncoding.EncodeToString(imgRes.Body()))
|
||||||
return fmt.Errorf("need validate code: data:image/png;base64,%s", base64.StdEncoding.EncodeToString(res.Body()))
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue