From cd502278357a7ee7f0f21b7cc7054f4179d492b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=AE=E5=87=89?= <927625802@qq.com> Date: Tue, 30 Nov 2021 21:30:50 +0800 Subject: [PATCH] :sparkler: support lanzou --- drivers/lanzou.go | 235 +++++++++++++++++++++++++++++++++++++++ drivers/lanzou_driver.go | 163 +++++++++++++++++++++++++++ model/file.go | 4 +- 3 files changed, 401 insertions(+), 1 deletion(-) create mode 100644 drivers/lanzou.go create mode 100644 drivers/lanzou_driver.go diff --git a/drivers/lanzou.go b/drivers/lanzou.go new file mode 100644 index 00000000..2839b4bc --- /dev/null +++ b/drivers/lanzou.go @@ -0,0 +1,235 @@ +package drivers + +import ( + "fmt" + "github.com/Xhofe/alist/conf" + "github.com/Xhofe/alist/model" + "github.com/Xhofe/alist/utils" + "github.com/go-resty/resty/v2" + log "github.com/sirupsen/logrus" + "path/filepath" + "regexp" + "strconv" +) + +var lanzouClient = resty.New() + +type LanZouFile struct { + Name string `json:"name"` + NameAll string `json:"name_all"` + Id string `json:"id"` + FolId string `json:"fol_id"` + Size string `json:"size"` + Time string `json:"time"` + Folder bool +} + +func (driver *Lanzou) FormatFile(file *LanZouFile) *model.File { + f := &model.File{ + Id: file.Id, + Name: file.Name, + Driver: driver.Config().Name, + SizeStr: file.Size, + TimeStr: file.Time, + } + if file.Folder { + f.Type = conf.FOLDER + f.Id = file.FolId + } else { + f.Name = file.NameAll + f.Type = utils.GetFileType(filepath.Ext(file.NameAll)) + } + return f +} + +type LanZouFilesResp struct { + Zt int `json:"zt"` + Info interface{} `json:"info"` + Text []LanZouFile `json:"text"` +} + +func (driver *Lanzou) GetFiles(folderId string, account *model.Account) ([]LanZouFile, error) { + if account.OnedriveType == "cookie" { + files := make([]LanZouFile, 0) + var resp LanZouFilesResp + // folders + res, err := lanzouClient.R().SetResult(&resp).SetHeader("Cookie", account.AccessToken). + SetFormData(map[string]string{ + "task": "47", + "folder_id": folderId, + }).Post("https://pc.woozooo.com/doupload.php") + if err != nil { + return nil, err + } + log.Debug(res.String()) + if resp.Zt != 1 && resp.Zt != 2 { + return nil, fmt.Errorf("%v", resp.Info) + } + for _, file := range resp.Text { + file.Folder = true + files = append(files, file) + } + // files + pg := 1 + for { + _, err = lanzouClient.R().SetResult(&resp).SetHeader("Cookie", account.AccessToken). + SetFormData(map[string]string{ + "task": "5", + "folder_id": folderId, + "pg": strconv.Itoa(pg), + }).Post("https://pc.woozooo.com/doupload.php") + if err != nil { + return nil, err + } + if resp.Zt != 1 { + return nil, fmt.Errorf("%v", resp.Info) + } + if len(resp.Text) == 0 { + break + } + files = append(files, resp.Text...) + pg++ + } + return files, nil + } else { + return driver.GetFilesByUrl(account) + } +} + +func (driver *Lanzou) GetFilesByUrl(account *model.Account) ([]LanZouFile, error) { + files := make([]LanZouFile, 0) + shareUrl := account.SiteUrl + res, err := lanzouClient.R().Get(shareUrl) + if err != nil { + return nil, err + } + lxArr := regexp.MustCompile(`'lx':(.+?),`).FindStringSubmatch(res.String()) + if len(lxArr) == 0 { + return nil, fmt.Errorf("get empty page") + } + lx := lxArr[1] + fid := regexp.MustCompile(`'fid':(.+?),`).FindStringSubmatch(res.String())[1] + uid := regexp.MustCompile(`'uid':'(.+?)',`).FindStringSubmatch(res.String())[1] + rep := regexp.MustCompile(`'rep':'(.+?)',`).FindStringSubmatch(res.String())[1] + up := regexp.MustCompile(`'up':(.+?),`).FindStringSubmatch(res.String())[1] + ls := regexp.MustCompile(`'ls':(.+?),`).FindStringSubmatch(res.String())[1] + tName := regexp.MustCompile(`'t':(.+?),`).FindStringSubmatch(res.String())[1] + kName := regexp.MustCompile(`'k':(.+?),`).FindStringSubmatch(res.String())[1] + t := regexp.MustCompile(`var ` + tName + ` = '(.+?)';`).FindStringSubmatch(res.String())[1] + k := regexp.MustCompile(`var ` + kName + ` = '(.+?)';`).FindStringSubmatch(res.String())[1] + pg := 1 + for { + var resp LanZouFilesResp + res, err = lanzouClient.R().SetResult(&resp).SetFormData(map[string]string{ + "lx": lx, + "fid": fid, + "uid": uid, + "pg": strconv.Itoa(pg), + "rep": rep, + "t": t, + "k": k, + "up": up, + "ls": ls, + "pwd": account.Password, + }).Post("https://wwa.lanzouo.com/filemoreajax.php") + if err != nil { + log.Debug(err) + break + } + log.Debug(res.String()) + if resp.Zt != 1 { + return nil, fmt.Errorf("%v", resp.Info) + } + if len(resp.Text) == 0 { + break + } + pg++ + files = append(files, resp.Text...) + } + return files,nil +} + +//type LanzouDownInfo struct { +// FId string `json:"f_id"` +// IsNewd string `json:"is_newd"` +//} + +// 获取下载页面的ID +func (driver *Lanzou) GetDownPageId(fileId string, account *model.Account) (string, error) { + var resp LanZouFilesResp + res, err := lanzouClient.R().SetResult(&resp).SetHeader("Cookie", account.AccessToken). + SetFormData(map[string]string{ + "task": "22", + "file_id": fileId, + }).Post("https://pc.woozooo.com/doupload.php") + if err != nil { + return "", err + } + log.Debug(res.String()) + if resp.Zt != 1 { + return "", fmt.Errorf("%v", resp.Info) + } + info, ok := resp.Info.(map[string]interface{}) + 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 { + Dom string `json:"dom"` + Url string `json:"url"` + Zt int `json:"zt"` +} + +func (driver *Lanzou) GetLink(downId string) (string, error) { + res, err := lanzouClient.R().Get("https://wwa.lanzouo.com/" + downId) + if err != nil { + return "", err + } + iframe := regexp.MustCompile(`