Skip to content

Commit

Permalink
v3.9.2
Browse files Browse the repository at this point in the history
  • Loading branch information
qjfoidnh committed Jun 3, 2023
1 parent 512438b commit 6950b33
Show file tree
Hide file tree
Showing 10 changed files with 91 additions and 41 deletions.
6 changes: 6 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,12 @@ iikira/BaiduPCS-Go was largely inspired by [GangZhuo/BaiduPCS](https://github.co
[离线下载](#离线下载), 支持http/https/ftp/电驴/磁力链协议.

# 版本更新
**2023.06.03** v3.9.2
- 修复秒传链接无法转存, 因官方接口变动秒传已不再支持短链接格式
- 修复上传文件无法使用秒传
- fix #254 支持-f参数输出带密码分享链接
- fix #251 根据mengzonefire同志提供函数增加md5解密

**2023.03.19** v3.9.1
- 修复秒传转存返回错误码9019

Expand Down
1 change: 1 addition & 0 deletions baidupcs/file_directory.go
Original file line number Diff line number Diff line change
Expand Up @@ -311,6 +311,7 @@ func (f *FileDirectory) String() string {
func (fl FileDirectoryList) fixMD5() {
for _, v := range fl {
v.fixMD5()
v.MD5 = DecryptMD5(v.MD5)
}
}

Expand Down
1 change: 0 additions & 1 deletion baidupcs/pcserror/panerrorinfo.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ type (
ErrType ErrType
Err error
ErrNo int `json:"errno"`
// ErrMsg string `json:"err_msg"`
}
)

Expand Down
62 changes: 33 additions & 29 deletions baidupcs/prepare.go
Original file line number Diff line number Diff line change
Expand Up @@ -301,40 +301,23 @@ func (pcs *BaiduPCS) PrepareMove(cpmvJSON ...*CpMvJSON) (dataReadCloser io.ReadC

// prepareRapidUpload 秒传文件, 不进行文件夹检查
func (pcs *BaiduPCS) prepareRapidUpload(targetPath, contentMD5, sliceMD5, crc32 string, length int64) (dataReadCloser io.ReadCloser, pcsError pcserror.Error) {
pcs.lazyInit()
pcsURL := pcs.generatePCSURL("file", "rapidupload", map[string]string{
"path": targetPath, // 上传文件的全路径名
"content-length": strconv.FormatInt(length, 10), // 待秒传的文件长度
"content-md5": contentMD5, // 待秒传的文件的MD5
"slice-md5": sliceMD5, // 待秒传的文件前256kb的MD5
"content-crc32": crc32, // 待秒传文件CRC32
"ondup": "overwrite", // overwrite: 表示覆盖同名文件; newcopy: 表示生成文件副本并进行重命名,命名规则为“文件名_日期.后缀”; skip: 表示跳过同名文件; fail: 表示直接报错
})
pcsURL := pcs.generatePanURL("rapidupload", nil)
baiduPCSVerbose.Infof("%s URL: %s\n", OperationRapidUpload, pcsURL)

dataReadCloser, pcsError = pcs.sendReqReturnReadCloser(reqTypePCS, OperationRapidUpload, http.MethodGet, pcsURL.String(), nil, nil)
return
}

// PrepareRapidUpload 秒传文件, 只返回服务器响应数据和错误信息
func (pcs *BaiduPCS) PrepareRapidUpload(targetPath, contentMD5, sliceMD5, crc32 string, length int64) (dataReadCloser io.ReadCloser, pcsError pcserror.Error) {
pcs.lazyInit()
pcsError = pcs.CheckIsdir(OperationRapidUpload, targetPath, "", length)
if pcsError != nil {
return nil, pcsError
post := map[string]string{
"rtype": "0",
"path": targetPath,
"content-md5": contentMD5,
"slice-md5": sliceMD5,
"content-length": strconv.FormatInt(length, 10),
}
baiduPCSVerbose.Infof("%s URL: %s, Post: %v\n", OperationRapidUpload, pcsURL, post)

return pcs.prepareRapidUpload(targetPath, contentMD5, sliceMD5, crc32, length)
dataReadCloser, pcsError = pcs.sendReqReturnReadCloser(reqTypePan, OperationRapidUpload, http.MethodPost, pcsURL.String(), post, nil)
return
}

// PrepareRapidUploadV2 秒传文件, 新接口
func (pcs *BaiduPCS) PrepareRapidUploadV2(targetPath, contentMD5, sliceMD5 string, length int64) (dataReadCloser io.ReadCloser, pcsError pcserror.Error) {
pcs.lazyInit()
pcsError = pcs.CheckIsdir(OperationRapidUpload, targetPath, "", length)
if pcsError != nil {
return nil, pcsError
}

// prepareRapidUploadV2 秒传文件接口2, 不进行文件夹检查
func (pcs *BaiduPCS) prepareRapidUploadV2(targetPath, contentMD5, sliceMD5, crc32 string, length int64) (dataReadCloser io.ReadCloser, pcsError pcserror.Error) {
pcsURL := pcs.generatePanURL("precreate", nil)
post := map[string]string{
"path": targetPath,
Expand All @@ -358,6 +341,27 @@ func (pcs *BaiduPCS) PrepareRapidUploadV2(targetPath, contentMD5, sliceMD5 strin
return
}

// PrepareRapidUpload 秒传文件旧接口, 只返回服务器响应数据和错误信息
func (pcs *BaiduPCS) PrepareRapidUpload(targetPath, contentMD5, sliceMD5, crc32 string, length int64) (dataReadCloser io.ReadCloser, pcsError pcserror.Error) {
pcs.lazyInit()
pcsError = pcs.CheckIsdir(OperationRapidUpload, targetPath, "", length)
if pcsError != nil {
return nil, pcsError
}

return pcs.prepareRapidUpload(targetPath, contentMD5, sliceMD5, crc32, length)
}

// PrepareRapidUploadV2 秒传文件新接口, 只返回服务器响应数据和错误信息
func (pcs *BaiduPCS) PrepareRapidUploadV2(targetPath, contentMD5, sliceMD5 string, length int64) (dataReadCloser io.ReadCloser, pcsError pcserror.Error) {
pcs.lazyInit()
pcsError = pcs.CheckIsdir(OperationRapidUpload, targetPath, "", length)
if pcsError != nil {
return nil, pcsError
}
return pcs.prepareRapidUploadV2(targetPath, contentMD5, sliceMD5, "", length)
}

// PrepareLocateDownload 获取下载链接, 只返回服务器响应数据和错误信息
func (pcs *BaiduPCS) PrepareLocateDownload(pcspath string) (dataReadCloser io.ReadCloser, pcsError pcserror.Error) {
pcs.lazyInit()
Expand Down
3 changes: 2 additions & 1 deletion baidupcs/share.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ type (
ShareOption struct {
Password string // 密码
Period int // 有效期
IsCombined bool // 是否将密码输出到分享链接
}

// Shared 分享信息
Expand Down Expand Up @@ -70,7 +71,7 @@ var (
// ShareSet 分享文件
func (pcs *BaiduPCS) ShareSet(paths []string, option *ShareOption) (s *Shared, pcsError pcserror.Error) {
if option.Password == "" || len(option.Password) != 4 {
option = &ShareOption{CreatePasswd(), option.Period}
option = &ShareOption{CreatePasswd(), option.Period, option.IsCombined}
}

dataReadCloser, pcsError := pcs.PrepareSharePSet(paths, option.Password, option.Period)
Expand Down
9 changes: 6 additions & 3 deletions baidupcs/upload.go
Original file line number Diff line number Diff line change
Expand Up @@ -116,8 +116,11 @@ func (pcs *BaiduPCS) RapidUpload(targetPath, contentMD5, sliceMD5, crc32 string,
pcs.deleteCache([]string{path.Dir(targetPath)})
}
}()

return pcs.rapidUploadV2(targetPath, strings.ToLower(contentMD5), strings.ToLower(sliceMD5), length)
pcsError = pcs.rapidUploadV2(targetPath, strings.ToLower(contentMD5), strings.ToLower(sliceMD5), length)
if pcsError != nil {
pcsError = pcs.rapidUpload(targetPath, strings.ToLower(contentMD5), strings.ToLower(sliceMD5), "", length)
}
return
}

func (pcs *BaiduPCS) rapidUpload(targetPath, contentMD5, sliceMD5, crc32 string, length int64) (pcsError pcserror.Error) {
Expand All @@ -126,7 +129,7 @@ func (pcs *BaiduPCS) rapidUpload(targetPath, contentMD5, sliceMD5, crc32 string,
return
}
defer dataReadCloser.Close()
return pcserror.DecodePCSJSONError(OperationRapidUpload, dataReadCloser)
return pcserror.DecodePanJSONError(OperationRapidUpload, dataReadCloser)
}

func (pcs *BaiduPCS) rapidUploadV2(targetPath, contentMD5, sliceMD5 string, length int64) (pcsError pcserror.Error) {
Expand Down
28 changes: 28 additions & 0 deletions baidupcs/util.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ import (
"github.com/qjfoidnh/BaiduPCS-Go/pcsutil/converter"
"io"
"path"
"regexp"
"strconv"
"strings"
"time"
)
Expand Down Expand Up @@ -108,3 +110,29 @@ func GetHTTPScheme(https bool) (scheme string) {
}
return "http"
}

func DecryptMD5(rawMD5 string) string {
if len(rawMD5) != 32 {
return rawMD5
}
var keychar string = rawMD5[9:10]
match, _ := regexp.MatchString("[a-f0-9]", keychar)
if match {
return rawMD5
}
sliceFirst := fmt.Sprintf("%x", []rune(rawMD5)[9] -'g')
sliceSecond := rawMD5[0:9] + sliceFirst + rawMD5[10:]
sliceThird := ""
for i := 0; i < len(sliceSecond); i++ {
if sliceSecond[i:i+1] == "-" {
sliceThird += fmt.Sprintf("%x", 15 & i)
continue
}
num, err := strconv.ParseInt(sliceSecond[i:i+1], 16, 64)
if err != nil {
return rawMD5
}
sliceThird += fmt.Sprintf("%x", int(num) ^ (15 & i))
}
return sliceThird[8:16] + sliceThird[0:8] + sliceThird[24:32] + sliceThird[16:24]
}
7 changes: 5 additions & 2 deletions internal/pcscommand/share.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,11 @@ func RunShareSet(paths []string, option *baidupcs.ShareOption) {
fmt.Printf("%s失败: %s\n", baidupcs.OperationShareSet, err)
return
}

fmt.Printf("shareID: %d, 链接: %s, 密码: %s\n", shared.ShareID, shared.Link, shared.Pwd)
if option.IsCombined {
fmt.Printf("shareID: %d, 链接: %s?pwd=%s\n", shared.ShareID, shared.Link, shared.Pwd)
} else {
fmt.Printf("shareID: %d, 链接: %s, 密码: %s\n", shared.ShareID, shared.Link, shared.Pwd)
}
}

// RunShareCancel 执行取消分享
Expand Down
7 changes: 6 additions & 1 deletion main.go
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ const (

var (
// Version 版本号
Version = "v3.9.1-devel"
Version = "v3.9.2-devel"

historyFilePath = filepath.Join(pcsconfig.GetConfigDir(), "pcs_command_history.txt")
reloadFn = func(c *cli.Context) error {
Expand Down Expand Up @@ -1482,6 +1482,7 @@ func main() {
opt := &baidupcs.ShareOption{
Password: c.String("p"),
Period: c.Int("period"),
IsCombined: c.Bool("f"),
}
pcscommand.RunShareSet(c.Args(), opt)
return nil
Expand All @@ -1497,6 +1498,10 @@ func main() {
Usage: "有效天数, 0为永久",
Value: 0,
},
cli.BoolFlag{
Name: "f",
Usage: "输出带密码的完整链接格式",
},
},
},
{
Expand Down
8 changes: 4 additions & 4 deletions versioninfo.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,13 @@
"FileVersion": {
"Major": 3,
"Minor": 9,
"Patch": 1,
"Patch": 2,
"Build": 0
},
"ProductVersion": {
"Major": 3,
"Minor": 9,
"Patch": 1,
"Patch": 2,
"Build": 0
},
"FileFlagsMask": "3f",
Expand All @@ -22,14 +22,14 @@
"Comments": "",
"CompanyName": "qjfoidnh",
"FileDescription": "百度网盘客户端(加强版)",
"FileVersion": "v3.9.1",
"FileVersion": "v3.9.2",
"InternalName": "",
"LegalCopyright": "© 2016-2020 iikira.",
"LegalTrademarks": "",
"OriginalFilename": "",
"PrivateBuild": "",
"ProductName": "BaiduPCS-Go",
"ProductVersion": "v3.9.1",
"ProductVersion": "v3.9.2",
"SpecialBuild": ""
},
"VarFileInfo": {
Expand Down

0 comments on commit 6950b33

Please sign in to comment.