fix: cookie lanzou file with password

pull/761/head
Xhofe 2022-03-11 19:48:32 +08:00
parent 40567dee0e
commit 19d0a88b55
3 changed files with 60 additions and 18 deletions

View File

@ -125,13 +125,19 @@ func (driver Lanzou) Link(args base.Args, account *model.Account) (*base.Link, e
} }
log.Debugf("down file: %+v", file) log.Debugf("down file: %+v", file)
downId := file.Id downId := file.Id
pwd := ""
if account.InternalType == "cookie" { if account.InternalType == "cookie" {
downId, err = driver.GetDownPageId(file.Id, account) downId, pwd, err = driver.GetDownPageId(file.Id, account)
if err != nil { if err != nil {
return nil, err return nil, err
} }
} }
url, err := driver.GetLink(downId, account) var url string
//if pwd != "" {
//url, err = driver.GetLinkWithPassword(downId, pwd, account)
//} else {
url, err = driver.GetLink(downId, pwd, account)
//}
if err != nil { if err != nil {
return nil, err return nil, err
} }

View File

@ -165,29 +165,21 @@ func (driver *Lanzou) GetFilesByUrl(account *model.Account) ([]LanZouFile, error
//} //}
// GetDownPageId 获取下载页面的ID // GetDownPageId 获取下载页面的ID
func (driver *Lanzou) GetDownPageId(fileId string, account *model.Account) (string, error) { func (driver *Lanzou) GetDownPageId(fileId string, account *model.Account) (string, string, error) {
var resp LanZouFilesResp var resp DownPageResp
res, err := base.RestyClient.R().SetResult(&resp).SetHeader("Cookie", account.AccessToken). res, err := base.RestyClient.R().SetResult(&resp).SetHeader("Cookie", account.AccessToken).
SetFormData(map[string]string{ SetFormData(map[string]string{
"task": "22", "task": "22",
"file_id": fileId, "file_id": fileId,
}).Post("https://pc.woozooo.com/doupload.php") }).Post("https://pc.woozooo.com/doupload.php")
if err != nil { if err != nil {
return "", err return "", "", err
} }
log.Debug(res.String()) log.Debug(res.String())
if resp.Zt != 1 { if resp.Zt != 1 {
return "", fmt.Errorf("%v", resp.Info) return "", "", fmt.Errorf("%v", resp.Info)
} }
info, ok := resp.Info.(map[string]interface{}) return resp.Info.FId, resp.Info.Pwd, nil
if !ok {
return "", fmt.Errorf("%v", resp.Info)
}
fid, ok := info["f_id"].(string)
if !ok {
return "", fmt.Errorf("%v", info["f_id"])
}
return fid, nil
} }
type LanzouLinkResp struct { type LanzouLinkResp struct {
@ -196,7 +188,7 @@ type LanzouLinkResp struct {
Zt int `json:"zt"` Zt int `json:"zt"`
} }
func (driver *Lanzou) GetLink(downId string, account *model.Account) (string, error) { func (driver *Lanzou) GetLink(downId string, pwd string, account *model.Account) (string, error) {
shareUrl := account.SiteUrl shareUrl := account.SiteUrl
u, err := url.Parse(shareUrl) u, err := url.Parse(shareUrl)
if err != nil { if err != nil {
@ -209,7 +201,7 @@ func (driver *Lanzou) GetLink(downId string, account *model.Account) (string, er
} }
iframe := regexp.MustCompile(`<iframe class="ifr2" name=".{2,20}" src="(.+?)"`).FindStringSubmatch(res.String()) iframe := regexp.MustCompile(`<iframe class="ifr2" name=".{2,20}" src="(.+?)"`).FindStringSubmatch(res.String())
if len(iframe) == 0 { if len(iframe) == 0 {
return "", fmt.Errorf("get down empty page") return driver.GetLinkWithPassword(downId, pwd, res.String(), account)
} }
iframeUrl := fmt.Sprintf("https://%s%s", u.Host, iframe[1]) iframeUrl := fmt.Sprintf("https://%s%s", u.Host, iframe[1])
res, err = base.RestyClient.R().Get(iframeUrl) res, err = base.RestyClient.R().Get(iframeUrl)
@ -254,7 +246,38 @@ func (driver *Lanzou) GetLink(downId string, account *model.Account) (string, er
if resp.Zt == 1 { if resp.Zt == 1 {
return resp.Dom + "/file/" + resp.Url, nil return resp.Dom + "/file/" + resp.Url, nil
} }
return "", fmt.Errorf("can't get link") return "", fmt.Errorf("failed get link")
}
func (driver *Lanzou) GetLinkWithPassword(downId string, pwd string, html string, account *model.Account) (string, error) {
shareUrl := account.SiteUrl
u, err := url.Parse(shareUrl)
if err != nil {
return "", err
}
if html == "" {
log.Debugln(fmt.Sprintf("https://%s/%s", u.Host, downId))
res, err := base.RestyClient.R().Get(fmt.Sprintf("https://%s/%s", u.Host, downId))
if err != nil {
return "", err
}
html = res.String()
}
data := regexp.MustCompile(`data : '(.+?)'\+pwd,`).FindStringSubmatch(html)[1] + pwd
var resp LanzouLinkResp
_, err = base.RestyClient.R().SetResult(&resp).SetHeaders(map[string]string{
"Referer": fmt.Sprintf("https://%s/%s", u.Host, downId),
"Origin": "https://" + u.Host,
"content-type": "application/x-www-form-urlencoded",
}).SetBody(data).Post(fmt.Sprintf("https://%s/ajaxm.php", u.Host))
if err != nil {
return "", err
}
if resp.Zt == 1 {
return resp.Dom + "/file/" + resp.Url, nil
}
return "", fmt.Errorf("failed get link with password")
} }
func init() { func init() {

13
drivers/lanzou/types.go Normal file
View File

@ -0,0 +1,13 @@
package lanzou
type DownPageResp struct {
Zt int `json:"zt"`
Info struct {
Pwd string `json:"pwd"`
Onof string `json:"onof"`
FId string `json:"f_id"`
Taoc string `json:"taoc"`
IsNewd string `json:"is_newd"`
} `json:"info"`
Text interface{} `json:"text"`
}