package lanzou import ( "context" "fmt" "net/http" "regexp" "strconv" "strings" "time" "github.com/alist-org/alist/v3/drivers/base" "github.com/alist-org/alist/v3/internal/model" "github.com/alist-org/alist/v3/pkg/utils" "github.com/go-resty/resty/v2" log "github.com/sirupsen/logrus" ) func (d *LanZou) doupload(callback base.ReqCallback, resp interface{}) ([]byte, error) { return d.post(d.BaseUrl+"/doupload.php", func(req *resty.Request) { req.SetQueryParam("uid", d.uid) callback(req) }, resp) } func (d *LanZou) get(url string, callback base.ReqCallback, resp interface{}) ([]byte, error) { return d.request(url, http.MethodGet, callback, false) } func (d *LanZou) post(url string, callback base.ReqCallback, resp interface{}) ([]byte, error) { return d._post(url, callback, resp, false) } func (d *LanZou) _post(url string, callback base.ReqCallback, resp interface{}, up bool) ([]byte, error) { data, err := d.request(url, http.MethodPost, callback, up) if err != nil { return nil, err } switch utils.Json.Get(data, "zt").ToInt() { case 1, 2, 4: if resp != nil { // 返回类型不统一,忽略错误 utils.Json.Unmarshal(data, resp) } return data, nil default: info := utils.Json.Get(data, "inf").ToString() if info == "" { info = utils.Json.Get(data, "info").ToString() } return nil, fmt.Errorf(info) } } func (d *LanZou) request(url string, method string, callback base.ReqCallback, up bool) ([]byte, error) { var req *resty.Request if up { req = upClient.R() } else { req = base.RestyClient.R() } req.SetHeaders(map[string]string{ "Referer": "https://pc.woozooo.com", }) if d.Cookie != "" { req.SetHeader("cookie", d.Cookie) } if callback != nil { callback(req) } res, err := req.Execute(method, url) if err != nil { return nil, err } log.Debugf("lanzou request: url=>%s ,stats=>%d ,body => %s\n", res.Request.URL, res.StatusCode(), res.String()) return res.Body(), err } /* 通过cookie获取数据 */ // 获取文件和文件夹,获取到的文件大小、更改时间不可信 func (d *LanZou) GetFiles(ctx context.Context, folderID string) ([]model.Obj, error) { folders, err := d.getFolders(ctx, folderID) if err != nil { return nil, err } files, err := d.getFiles(ctx, folderID) if err != nil { return nil, err } return append( utils.MustSliceConvert(folders, func(folder FileOrFolder) model.Obj { return folder.ToObj() }), utils.MustSliceConvert(files, func(file FileOrFolder) model.Obj { return file.ToObj() })..., ), nil } // 通过ID获取文件夹 func (d *LanZou) getFolders(ctx context.Context, folderID string) ([]FileOrFolder, error) { var resp FilesOrFoldersResp _, err := d.doupload(func(req *resty.Request) { req.SetContext(ctx) req.SetFormData(map[string]string{ "task": "47", "folder_id": folderID, }) }, &resp) if err != nil { return nil, err } return resp.Text, nil } // 通过ID获取文件 func (d *LanZou) getFiles(ctx context.Context, folderID string) ([]FileOrFolder, error) { files := make([]FileOrFolder, 0) for pg := 1; ; pg++ { var resp FilesOrFoldersResp _, err := d.doupload(func(req *resty.Request) { req.SetContext(ctx) req.SetFormData(map[string]string{ "task": "5", "folder_id": folderID, "pg": strconv.Itoa(pg), }) }, &resp) if err != nil { return nil, err } if len(resp.Text) == 0 { break } files = append(files, resp.Text...) } return files, nil } // 通过ID获取文件夹分享地址 func (d *LanZou) getFolderShareUrlByID(ctx context.Context, fileID string) (share FileShare, err error) { var resp FileShareResp _, err = d.doupload(func(req *resty.Request) { req.SetContext(ctx) req.SetFormData(map[string]string{ "task": "18", "file_id": fileID, }) }, &resp) if err != nil { return } share = resp.Info return } // 通过ID获取文件分享地址 func (d *LanZou) getFileShareUrlByID(ctx context.Context, fileID string) (share FileShare, err error) { var resp FileShareResp _, err = d.doupload(func(req *resty.Request) { req.SetContext(ctx) req.SetFormData(map[string]string{ "task": "22", "file_id": fileID, }) }, &resp) if err != nil { return } share = resp.Info return } /* 通过分享链接获取数据 */ // 判断类容 var isFileReg = regexp.MustCompile(`class="fileinfo"|id="file"|文件描述`) var isFolderReg = regexp.MustCompile(`id="infos"`) // 获取文件文件夹基础信息 var nameFindReg = regexp.MustCompile(`