diff --git a/README.md b/README.md index 05a716af..1269b0fb 100644 --- a/README.md +++ b/README.md @@ -351,7 +351,7 @@ BaiduPCS-Go d <网盘文件或目录的路径1> <文件或目录2> <文件或目 --save 将下载的文件直接保存到当前工作目录 --saveto value 将下载的文件直接保存到指定的目录 -x 为文件加上执行权限, (windows系统无效) - --mode value 下载模式, 可选值: pcs, stream, locate, locate_pan, share, 默认为 locate, 相关说明见上面的帮助 (default: "locate") + --mode value 下载模式, 可选值: pcs, stream, locate, 默认为 locate, 相关说明见上面的帮助 (default: "locate") -p value 指定下载线程数 (default: 0) -l value 指定同时进行下载文件的数量 (default: 0) --retry value 下载失败最大重试次数 (default: 3) @@ -381,10 +381,6 @@ BaiduPCS-Go d <网盘文件或目录的路径1> <文件或目录2> <文件或目 * locate: 默认的下载模式。从百度网盘 Android 客户端, 获取下载链接的方式来下载 -* locate_pan: 从百度网盘 WEB 首页获取下载链接来下载, 该下载方式需配合第三方服务器, 机密文件切勿使用此下载方式 - -* share: 从网盘文件的分享列表获取文件的下载链接来下载 - #### 例子 ``` # 设置保存目录, 保存到 D:\Downloads diff --git a/baidupcs/dlinkclient/cache.go b/baidupcs/dlinkclient/cache.go deleted file mode 100644 index 2089610f..00000000 --- a/baidupcs/dlinkclient/cache.go +++ /dev/null @@ -1,57 +0,0 @@ -package dlinkclient - -import ( - "github.com/iikira/BaiduPCS-Go/baidupcs/expires" - "github.com/iikira/BaiduPCS-Go/baidupcs/pcserror" - "strconv" - "time" -) - -func (dc *DlinkClient) CacheShareReg(shareURL, passwd string) (short string, dlinkError pcserror.Error) { - data := dc.cacheOpMap.CacheOperation(OperationReg, shareURL+"_"+passwd, func() expires.DataExpires { - short, dlinkError = dc.ShareReg(shareURL, passwd) - if dlinkError != nil { - return nil - } - return expires.NewDataExpires(short, 10*time.Minute) - }) - if dlinkError != nil { - return - } - return data.Data().(string), nil -} - -func (dc *DlinkClient) CacheShareList(short, dir string, page int) (fds []*FileDirectory, dlinkError pcserror.Error) { - data := dc.cacheOpMap.CacheOperation(OperationList, short+"_"+dir+"_"+strconv.Itoa(page), func() expires.DataExpires { - fds, dlinkError = dc.ShareList(short, dir, page) - if dlinkError != nil { - return nil - } - return expires.NewDataExpires(fds, 1*time.Minute) - }) - if dlinkError != nil { - return - } - return data.Data().([]*FileDirectory), nil -} - -func (dc *DlinkClient) cacheLinkRedirect(op string, link string) (nlink string, dlinkError pcserror.Error) { - data := dc.cacheOpMap.CacheOperation(OperationList, link, func() expires.DataExpires { - nlink, dlinkError = dc.linkRedirect(op, link) - if dlinkError != nil { - return nil - } - return expires.NewDataExpires(nlink, 2*time.Minute) - }) - if dlinkError != nil { - return - } - return data.Data().(string), nil -} - -func (dc *DlinkClient) CacheLinkRedirect(link string) (nlink string, dlinkError pcserror.Error) { - return dc.cacheLinkRedirect(OperationRedirect, link) -} -func (dc *DlinkClient) CacheLinkRedirectPr(link string) (nlink string, dlinkError pcserror.Error) { - return dc.cacheLinkRedirect(OperationRedirectPr, link) -} diff --git a/baidupcs/dlinkclient/dlinkclient.go b/baidupcs/dlinkclient/dlinkclient.go deleted file mode 100644 index 2030c9ce..00000000 --- a/baidupcs/dlinkclient/dlinkclient.go +++ /dev/null @@ -1,73 +0,0 @@ -package dlinkclient - -import ( - "github.com/iikira/BaiduPCS-Go/baidupcs/expires/cachemap" - "github.com/iikira/BaiduPCS-Go/requester" - "net/url" -) - -const ( - // DlinkHost 服务器 - DlinkHost = "dlink.iikira.com" - - OperationReg = "注册分享信息" - OperationList = "获取目录下的文件列表" - OperationRedirect = "重定向" - OperationRedirectPr = "重定向(pr)" -) - -// DlinkClient 客户端 -type DlinkClient struct { - client *requester.HTTPClient - cacheOpMap cachemap.CacheOpMap -} - -func NewDlinkClient() *DlinkClient { - return &DlinkClient{} -} - -func (dc *DlinkClient) lazyInit() { - if dc.client == nil { - dc.client = requester.NewHTTPClient() - } -} - -func (dc *DlinkClient) SetClient(client *requester.HTTPClient) { - dc.client = client -} - -func (dc *DlinkClient) genShareURL(method string, param map[string]string) *url.URL { - dlinkURL := url.URL{ - Scheme: "https", - Host: DlinkHost, - Path: "/api/v1.1/pan/share/" + method, - } - - if param != nil { - uv := url.Values{} - for k := range param { - uv.Set(k, param[k]) - } - dlinkURL.RawQuery = uv.Encode() - } - - return &dlinkURL -} - -func (dc *DlinkClient) genCgiBinURL(method string, param map[string]string) *url.URL { - cgiBinURL := url.URL{ - Scheme: "https", - Host: DlinkHost, - Path: "/cgi-bin/" + method, - } - - if param != nil { - uv := url.Values{} - for k := range param { - uv.Set(k, param[k]) - } - cgiBinURL.RawQuery = uv.Encode() - } - - return &cgiBinURL -} diff --git a/baidupcs/dlinkclient/dlinkclient_test.go b/baidupcs/dlinkclient/dlinkclient_test.go deleted file mode 100644 index 3eb4a2d9..00000000 --- a/baidupcs/dlinkclient/dlinkclient_test.go +++ /dev/null @@ -1,37 +0,0 @@ -package dlinkclient_test - -import ( - "fmt" - "github.com/iikira/BaiduPCS-Go/baidupcs/dlinkclient" - "testing" -) - -func TestAll(t *testing.T) { - dc := dlinkclient.NewDlinkClient() - short, err := dc.ShareReg("http://pan.baidu.com/s/1zn1W7VWuMIjTuIbGafUXMA", "") - if err != nil { - fmt.Println(err) - return - } - fmt.Printf("short: %s\n", short) - - list, err := dc.ShareList(short, "/", 1) - if err != nil { - fmt.Println(err) - return - } - for _, f := range list { - fmt.Println(f) - } - - if len(list) <= 0 { - return - } - - nlink, err := dc.LinkRedirect(list[0].Link) - if err != nil { - fmt.Println(err) - return - } - fmt.Printf("redirected link: %s\n", nlink) -} diff --git a/baidupcs/dlinkclient/redirect.go b/baidupcs/dlinkclient/redirect.go deleted file mode 100644 index 4aa00f5c..00000000 --- a/baidupcs/dlinkclient/redirect.go +++ /dev/null @@ -1,56 +0,0 @@ -package dlinkclient - -import ( - "github.com/iikira/Baidu-Login/bdcrypto" - "github.com/iikira/BaiduPCS-Go/baidupcs/pcserror" - "github.com/iikira/BaiduPCS-Go/pcsutil/converter" - "net/http" - "net/url" -) - -func (dc *DlinkClient) linkRedirect(op, link string) (nlink string, dlinkError pcserror.Error) { - dc.lazyInit() - - var ( - u *url.URL - redirectRes = RedirectRes{ - DlinkErrInfo: pcserror.NewDlinkErrInfo(op), - } - uv = url.Values{} - ) - - switch op { - case OperationRedirect: - u = dc.genCgiBinURL("redirect", nil) - uv.Set("link", link) - case OperationRedirectPr: - u = dc.genCgiBinURL("redirect/pr", nil) - uv.Set("link", converter.ToString(bdcrypto.Base64Encode(converter.ToBytes(link)))) - } - - resp, err := dc.client.Req(http.MethodPost, u.String(), uv.Encode(), map[string]string{ - "Content-Type": "application/x-www-form-urlencoded", - }) - if resp != nil { - defer resp.Body.Close() - } - if err != nil { - redirectRes.SetNetError(err) - return "", redirectRes.DlinkErrInfo - } - - dlinkError = pcserror.HandleJSONParse(op, resp.Body, &redirectRes) - if dlinkError != nil { - return - } - - return redirectRes.Link, nil -} - -func (dc *DlinkClient) LinkRedirect(link string) (nlink string, dlinkError pcserror.Error) { - return dc.linkRedirect(OperationRedirect, link) -} - -func (dc *DlinkClient) LinkRedirectPr(link string) (nlink string, dlinkError pcserror.Error) { - return dc.linkRedirect(OperationRedirectPr, link) -} diff --git a/baidupcs/dlinkclient/share.go b/baidupcs/dlinkclient/share.go deleted file mode 100644 index b6128148..00000000 --- a/baidupcs/dlinkclient/share.go +++ /dev/null @@ -1,100 +0,0 @@ -package dlinkclient - -import ( - "github.com/iikira/BaiduPCS-Go/baidupcs/pcserror" - "net/http" - "strconv" -) - -type ( - // FileDirectory 文件/目录信息 - FileDirectory struct { - Path string `json:"path"` - Filename string `json:"filename"` - Ctime int64 `json:"ctime"` - Mtime int64 `json:"mtime"` - MD5 string `json:"md5"` - Size int64 `json:"size"` - Isdir int `json:"isdir"` - Link string `json:"link"` - } - - // FDList 文件列表 - FDList struct { - *pcserror.DlinkErrInfo - List []*FileDirectory `json:"list"` - } - - // RegStat 注册状态 - RegStat struct { - *pcserror.DlinkErrInfo - Short string `json:"short"` - } - - RedirectRes struct { - *pcserror.DlinkErrInfo - Link string `json:"link"` - } -) - -// ShareReg reg -func (dc *DlinkClient) ShareReg(shareLink, pwd string) (short string, dlinkError pcserror.Error) { - dc.lazyInit() - - var ( - u = dc.genShareURL("reg", map[string]string{ - "share_link": shareLink, - "pwd": pwd, - }) - regStat = RegStat{ - DlinkErrInfo: pcserror.NewDlinkErrInfo(OperationReg), - } - ) - - resp, err := dc.client.Req(http.MethodGet, u.String(), nil, nil) - if resp != nil { - defer resp.Body.Close() - } - if err != nil { - regStat.SetNetError(err) - return "", regStat.DlinkErrInfo - } - - dlinkError = pcserror.HandleJSONParse(OperationReg, resp.Body, ®Stat) - if dlinkError != nil { - return - } - - return regStat.Short, nil -} - -func (dc *DlinkClient) ShareList(short, dir string, page int) (fds []*FileDirectory, dlinkError pcserror.Error) { - dc.lazyInit() - - var ( - u = dc.genShareURL("list", map[string]string{ - "short": short, - "dir": dir, - "page": strconv.Itoa(page), - }) - fdList = FDList{ - DlinkErrInfo: pcserror.NewDlinkErrInfo(OperationList), - } - ) - - resp, err := dc.client.Req(http.MethodGet, u.String(), nil, nil) - if resp != nil { - defer resp.Body.Close() - } - if err != nil { - fdList.SetNetError(err) - return nil, fdList.DlinkErrInfo - } - - dlinkError = pcserror.HandleJSONParse(OperationList, resp.Body, &fdList) - if dlinkError != nil { - return - } - - return fdList.List, nil -} diff --git a/internal/pcsconfig/export.go b/internal/pcsconfig/export.go index a6dc62ff..f0023e40 100644 --- a/internal/pcsconfig/export.go +++ b/internal/pcsconfig/export.go @@ -3,14 +3,12 @@ package pcsconfig import ( "fmt" "github.com/iikira/BaiduPCS-Go/baidupcs" - "github.com/iikira/BaiduPCS-Go/baidupcs/dlinkclient" "github.com/iikira/BaiduPCS-Go/pcstable" "github.com/iikira/BaiduPCS-Go/pcsutil/converter" "github.com/iikira/BaiduPCS-Go/requester" "github.com/olekukonko/tablewriter" "os" "strconv" - "time" ) // ActiveUser 获取当前登录的用户 @@ -51,18 +49,6 @@ func (c *PCSConfig) PanHTTPClient() *requester.HTTPClient { return c.httpClientWithUA(c.PanUA) } -// DlinkClient 返回设置好的DlinkClient -func (c *PCSConfig) DlinkClient() *dlinkclient.DlinkClient { - if c.dc == nil { - dc := dlinkclient.NewDlinkClient() - client := c.PanHTTPClient() - client.SetResponseHeaderTimeout(30 * time.Second) - dc.SetClient(client) - c.dc = dc - } - return c.dc -} - // NumLogins 获取登录的用户数量 func (c *PCSConfig) NumLogins() int { return len(c.BaiduUserList) diff --git a/internal/pcsconfig/maniper.go b/internal/pcsconfig/maniper.go index a1d8ad3a..3ab7ee85 100644 --- a/internal/pcsconfig/maniper.go +++ b/internal/pcsconfig/maniper.go @@ -191,9 +191,6 @@ func (c *PCSConfig) SetPanUA(panUA string) { if c.pcs != nil { c.pcs.SetPanUserAgent(panUA) } - if c.dc != nil { - c.dc.SetClient(c.PanHTTPClient()) - } } // SetEnableHTTPS 设置是否启用https @@ -202,9 +199,6 @@ func (c *PCSConfig) SetEnableHTTPS(https bool) { if c.pcs != nil { c.pcs.SetHTTPS(https) } - if c.dc != nil { - c.dc.SetClient(c.PanHTTPClient()) - } } // SetProxy 设置代理 diff --git a/internal/pcsconfig/pcsconfig.go b/internal/pcsconfig/pcsconfig.go index 079a2833..c49064be 100644 --- a/internal/pcsconfig/pcsconfig.go +++ b/internal/pcsconfig/pcsconfig.go @@ -3,7 +3,6 @@ package pcsconfig import ( "github.com/iikira/BaiduPCS-Go/baidupcs" - "github.com/iikira/BaiduPCS-Go/baidupcs/dlinkclient" "github.com/iikira/BaiduPCS-Go/pcsutil" "github.com/iikira/BaiduPCS-Go/pcsutil/jsonhelper" "github.com/iikira/BaiduPCS-Go/pcsverbose" @@ -59,7 +58,6 @@ type PCSConfig struct { fileMu sync.Mutex activeUser *Baidu pcs *baidupcs.BaiduPCS - dc *dlinkclient.DlinkClient } // NewConfig 返回 PCSConfig 指针对象 diff --git a/internal/pcsfunctions/pcsdownload/download_link.go b/internal/pcsfunctions/pcsdownload/download_link.go index 6a1cca13..dd3ea14a 100644 --- a/internal/pcsfunctions/pcsdownload/download_link.go +++ b/internal/pcsfunctions/pcsdownload/download_link.go @@ -4,7 +4,6 @@ import ( "github.com/iikira/BaiduPCS-Go/baidupcs" "github.com/iikira/BaiduPCS-Go/internal/pcsconfig" "net/url" - "strconv" ) func GetLocateDownloadLinks(pcs *baidupcs.BaiduPCS, pcspath string) (dlinks []*url.URL, err error) { @@ -20,25 +19,3 @@ func GetLocateDownloadLinks(pcs *baidupcs.BaiduPCS, pcspath string) (dlinks []*u return us, nil } - -func GetLocatePanLink(pcs *baidupcs.BaiduPCS, fsID int64) (dlink string, err error) { - list, err := pcs.LocatePanAPIDownload(fsID) - if err != nil { - return - } - - var link string - for k := range list { - if strconv.FormatInt(fsID, 10) == list[k].FsID { - link = list[k].Dlink - } - } - - if link == "" { - return "", ErrDlinkNotFound - } - - dc := pcsconfig.Config.DlinkClient() - dlink, err = dc.CacheLinkRedirectPr(link) - return -} diff --git a/internal/pcsfunctions/pcsdownload/download_task_unit.go b/internal/pcsfunctions/pcsdownload/download_task_unit.go index 14b602ae..90d9a914 100644 --- a/internal/pcsfunctions/pcsdownload/download_task_unit.go +++ b/internal/pcsfunctions/pcsdownload/download_task_unit.go @@ -74,8 +74,6 @@ const ( const ( DownloadModeLocate DownloadMode = iota DownloadModePCS - DownloadModeShare - DownloadModeLocatePanAPI DownloadModeStreaming ) @@ -301,44 +299,6 @@ func (dtu *DownloadTaskUnit) locateDownload(result *taskframework.TaskUnitRunRes return } -func (dtu *DownloadTaskUnit) shareDownload(result *taskframework.TaskUnitRunResult) (ok bool) { - dlink, err := GetShareDLink(dtu.PCS, dtu.PcsPath) - switch err { - case nil: - // continue - case ErrShareInfoNotFound: - // 未分享 - // 采用 locate 方式 - fmt.Printf("[%s] 错误: %s, 将使用 locate 下载方式\n", dtu.taskInfo.Id(), err) - dtu.locateDownload(result) - return - default: - // 其他错误 - // 需要重试 - result.ResultMessage = StrDownloadGetDlinkFailed - result.Err = err - dtu.handleError(result) - return - } - - dtu.execPanDownload(dlink, result, &ok) - return -} - -//locatePanAPIDownload 由第三方处理 -func (dtu *DownloadTaskUnit) locatePanAPIDownload(result *taskframework.TaskUnitRunResult) (ok bool) { - dlink, err := GetLocatePanLink(dtu.PCS, dtu.fileInfo.FsID) - if err != nil { - // 获取下载链接失败 - result.ResultMessage = StrDownloadGetDlinkFailed - result.Err = err - dtu.handleError(result) - return - } - dtu.execPanDownload(dlink, result, &ok) - return -} - func (dtu *DownloadTaskUnit) pcsOrStreamingDownload(mode DownloadMode, result *taskframework.TaskUnitRunResult) (ok bool) { dfunc := func(downloadURL string, jar http.CookieJar) error { client := pcsconfig.Config.PCSHTTPClient() @@ -515,10 +475,6 @@ func (dtu *DownloadTaskUnit) Run() (result *taskframework.TaskUnitRunResult) { switch dtu.DownloadMode { case DownloadModeLocate: ok = dtu.locateDownload(result) - case DownloadModeShare: - ok = dtu.shareDownload(result) - case DownloadModeLocatePanAPI: - ok = dtu.locatePanAPIDownload(result) case DownloadModePCS, DownloadModeStreaming: ok = dtu.pcsOrStreamingDownload(dtu.DownloadMode, result) } diff --git a/internal/pcsfunctions/pcsdownload/share.go b/internal/pcsfunctions/pcsdownload/share.go deleted file mode 100644 index 10f61090..00000000 --- a/internal/pcsfunctions/pcsdownload/share.go +++ /dev/null @@ -1,153 +0,0 @@ -package pcsdownload - -import ( - "github.com/iikira/BaiduPCS-Go/baidupcs" - "github.com/iikira/BaiduPCS-Go/internal/pcsconfig" - "path" - "strings" -) - -// GetShareDLink pcspath 为文件的路径, 不是目录 -func GetShareDLink(pcs *baidupcs.BaiduPCS, pcspath string) (dlink string, err error) { - for page := 1; ; page++ { - records, pcsError := pcs.ShareList(page) - if pcsError != nil { - return "", pcsError - } - - // 完成 - if len(records) == 0 { - break - } - - for _, record := range records { - if record == nil { - continue - } - - if record.Status != 0 { // 分享状态异常 - continue - } - - if record.TypicalPath == baidupcs.PathSeparator { //TypicalPath为根目录 - continue - } - - rootSharePath, _ := path.Split(record.TypicalPath) - if rootSharePath == "" { // 分享状态异常 - continue - } - - // 粗略搜索 - if len(record.FsIds) == 1 { - switch record.TypicalCategory { - case -1: // 文件夹 - if strings.HasPrefix(pcspath, record.TypicalPath+baidupcs.PathSeparator) { - dlink, err = GetLinkByRecord(pcs, record, pcspath, true) - return - } - default: // 文件 - if pcspath == record.TypicalPath { - dlink, err = GetLinkByRecord(pcs, record, pcspath, false) - return - } - } - - continue - } - - // 尝试获取 - if strings.HasPrefix(pcspath, rootSharePath) { - dlink, err = GetLinkByRecord(pcs, record, pcspath, false) - if err != nil { - continue - } - return - } - } - } - - if err != nil { - return - } - return "", ErrShareInfoNotFound -} - -// GetShareRecordPasswd 获取Passwd -func GetLinkByRecord(pcs *baidupcs.BaiduPCS, record *baidupcs.ShareRecordInfo, filePath string, skipRoot bool) (dlink string, err error) { - if record.Public == 0 { - // 私密分享 - info, pcsError := pcs.ShareSURLInfo(record.ShareID) - if pcsError != nil { - // 获取错误 - return "", pcsError - } - record.Passwd = info.Pwd - } - return GetLink(record.Shortlink, record.Passwd, filePath, skipRoot) -} - -func GetLink(shareLink, passwd, filePath string, skipRoot bool) (dlink string, err error) { - dc := pcsconfig.Config.DlinkClient() - short, err := dc.CacheShareReg(shareLink, passwd) - if err != nil { - return - } - - var dir string - if skipRoot { - dir = path.Dir(filePath) - } else { - rfl, err := dc.CacheShareList(short, baidupcs.PathSeparator, 1) - if err != nil { - return "", err - } - - for _, rf := range rfl { - if rf.Isdir == 1 { - if strings.HasPrefix(filePath, rf.Path+baidupcs.PathSeparator) { - dir = path.Dir(filePath) - break - } - continue - } - - if rf.Path == filePath { - dlink, err = dc.CacheLinkRedirect(rf.Link) - if err != nil { - return "", ErrDlinkNotFound - } - return dlink, err - } - } - } - - if dir == "" { - return "", ErrDlinkNotFound - } - - for page := 1; ; page++ { - list, err := dc.CacheShareList(short, dir, page) - if err != nil { - return "", err - } - if len(list) == 0 { - break - } - - for _, f := range list { - if f.Path == filePath { - dlink, err = dc.CacheLinkRedirect(f.Link) - if err != nil { - return "", ErrDlinkNotFound - } - return dlink, err - } - } - if len(list) < 100 { - break - } - } - - return "", ErrDlinkNotFound -} diff --git a/main.go b/main.go index 60f43146..fefb0132 100644 --- a/main.go +++ b/main.go @@ -960,8 +960,6 @@ func main() { pcs: 通过百度网盘的 PCS API 下载 stream: 通过百度网盘的 PCS API, 以流式文件的方式下载, 效果同 pcs locate: 默认的下载模式。从百度网盘 Android 客户端, 获取下载链接的方式来下载 - locate_pan: 从百度网盘 WEB 首页获取下载链接来下载, 该下载方式需配合第三方服务器, 机密文件切勿使用此下载方式 - share: 从网盘文件的分享列表获取文件的下载链接来下载 示例: @@ -1010,10 +1008,6 @@ func main() { downloadMode = pcsdownload.DownloadModeStreaming case "locate": downloadMode = pcsdownload.DownloadModeLocate - case "locate_pan": - downloadMode = pcsdownload.DownloadModeLocatePanAPI - case "share": - downloadMode = pcsdownload.DownloadModeShare default: fmt.Println("下载方式解析失败") cli.ShowCommandHelp(c, c.Command.Name) @@ -1064,7 +1058,7 @@ func main() { }, cli.StringFlag{ Name: "mode", - Usage: "下载模式, 可选值: pcs, stream, locate, locate_pan, share, 默认为 locate, 相关说明见上面的帮助", + Usage: "下载模式, 可选值: pcs, stream, locate, 默认为 locate, 相关说明见上面的帮助", Value: "locate", }, cli.IntFlag{