Skip to content

Commit

Permalink
Merge branch 'main-3.9.5'
Browse files Browse the repository at this point in the history
* main-3.9.5: (27 commits)
  Update prepare.go
  Update cloud_dl.go
  修复转存失败问题
  v3.9.5
  del bdstoken
  Update util.go
  随机修改文件名
  rtype=3
  恢复秒传功能
  fix qjfoidnh#244, qjfoidnh#295
  v3.9.4
  Update README.md
  v3.9.3
  v3.9.2
  fix rapidupload
  fix rapidupload
  v3.9.1
  Create xpanerrorinfo.go
  update rapidupload
  fix rapidupload
  ...
  • Loading branch information
chenrenwei committed May 10, 2024
2 parents 07e8c26 + caa18a3 commit 1165370
Show file tree
Hide file tree
Showing 27 changed files with 644 additions and 248 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ jobs:
- name: Setup Go environment
uses: actions/[email protected]
with:
go-version: 1.16
go-version: 1.17
- name: Cache downloaded module
uses: actions/cache@v2
with:
Expand Down
110 changes: 64 additions & 46 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,10 +40,7 @@ iikira/BaiduPCS-Go was largely inspired by [GangZhuo/BaiduPCS](https://github.co
* [下载文件/目录](#下载文件目录)
* [上传文件/目录](#上传文件目录)
* [获取下载直链](#获取下载直链)
* [手动秒传文件](#手动秒传文件)
* [修复文件MD5](#修复文件MD5)
* [获取本地文件的秒传信息](#获取本地文件的秒传信息)
* [导出文件/目录](#导出文件目录)
* [创建目录](#创建目录)
* [删除文件/目录](#删除文件目录)
* [拷贝文件/目录](#拷贝文件目录)
Expand Down Expand Up @@ -93,13 +90,52 @@ iikira/BaiduPCS-Go was largely inspired by [GangZhuo/BaiduPCS](https://github.co

[上传](#上传文件目录)本地文件, 支持上传大文件(>2GB), 支持多个文件或目录上传;

[转存](#转存文件目录)其他用户分享的文件, 支持公开、带密码的分享链接, 支持常见的几种秒传链接;
[转存](#转存文件目录)其他用户分享的文件, 支持带密码的分享链接;

[导出](#导出文件目录)网盘内的文件秒传链接, 可选导出BaiduPCS-Go原生格式或通用格式;

[离线下载](#离线下载), 支持http/https/ftp/电驴/磁力链协议.

# 版本更新
**2023.09.30** v3.9.5
- 恢复秒传转存功能, 使用前需设置accessToken, 参见setastoken --help
- 本地文件上传用秒传无须accessToken
- fix #301
- fix #302

**2023.09.06** v3.9.5-beta
- 恢复了秒传转存(支持长短链), 感谢油猴脚本开发者tousakarin的贡献
- 新秒传接口需要开发者授权, 稳定性未知, 该测试版本仅供有秒传强需求的用户试用, 请谨慎更新

**2023.09.05** v3.9.4
- fix #244, 修复断点上传时偶发崩溃
- 优化本地上传秒传失败时的处理逻辑

**2023.08.26** v3.9.3
- 因官方接口从原理层面封禁秒传, 取消秒传转存功能
- 更新部分使用说明
- 建议使用文件上传功能的用户更新此版本

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

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

**2022.12.04** v3.9.0:
- 优化转存错误提示
- fix #239
- update go version to 1.18

**2022.11.25** v3.8.9:
- fix #234, 继续修复无法转存文件

**2022.11.12** v3.8.8:
- fix #234, 修复无法转存文件

**2022.2.18** v3.8.7:
- fix #175, 在正式上传前即进行文件大小检测

Expand Down Expand Up @@ -249,11 +285,6 @@ cli交互模式下, 光标所在行的前缀应为 `BaiduPCS-Go >`, 如果登录

## 安装

[Homebrew](https://brew.sh/) 用户可以用下面的命令行安装应用:

```sh
brew install baidupcs-go
```

## Windows

Expand Down Expand Up @@ -301,6 +332,7 @@ BaiduPCS-Go update
### 常规登录百度帐号

支持在线验证绑定的手机号或邮箱,
注: 此方式已长期不维护, 建议使用其他登录方式
```
BaiduPCS-Go login
```
Expand Down Expand Up @@ -535,14 +567,6 @@ BaiduPCS-Go d <网盘文件或目录的路径1> <文件或目录2> <文件或目
自动跳过下载重名的文件!


#### 下载模式说明

* pcs: 通过百度网盘的 PCS API 下载(不建议使用)

* stream: 通过百度网盘的 PCS API, 以流式文件的方式下载, 效果同 pcs(不建议使用)

* locate: 默认的下载模式。从百度网盘 Android 客户端, 获取下载链接的方式来下载

#### 例子
```
# 设置保存目录, 保存到 D:\Downloads
Expand Down Expand Up @@ -611,26 +635,6 @@ BaiduPCS-Go locate <文件1> <文件2> ...
BaiduPCS-Go config set -user_agent "netdisk;2.2.51.6;netdisk;10.0.63;PC;android-android"
```

## 手动秒传文件
```
BaiduPCS-Go rapidupload -length=<文件的大小> -md5=<文件的md5值> -slicemd5=<文件前256KB切片的md5值(可选)> -crc32=<文件的crc32值(可选)> <保存的网盘路径, 需包含文件名>
BaiduPCS-Go ru -length=<文件的大小> -md5=<文件的md5值> -slicemd5=<文件前256KB切片的md5值(可选)> -crc32=<文件的crc32值(可选)> <保存的网盘路径, 需包含文件名>
```

注意: 使用此功能秒传文件, 前提是知道文件的大小, md5, 前256KB切片的 md5 (可选), crc32 (可选), 且百度网盘中存在一模一样的文件.

上传的文件将会保存到网盘的目标目录.

遇到同名文件将会自动覆盖!

可能无法秒传 20GB 以上的文件!!

#### 例子:
```
# 如果秒传成功, 则保存到网盘路径 /test
BaiduPCS-Go rapidupload -length=56276137 -md5=fbe082d80e90f90f0fb1f94adbbcfa7f -slicemd5=38c6a75b0ec4499271d4ea38a667ab61 -crc32=314332359 /test
```


## 修复文件MD5
```
Expand Down Expand Up @@ -658,23 +662,35 @@ BaiduPCS-Go fixmd5 /我的资源/1.mp4
```

## 获取本地文件的秒传信息

```
BaiduPCS-Go sumfile <本地文件的路径>
BaiduPCS-Go sf <本地文件的路径>
```

获取本地文件的大小, md5, 前256KB切片的 md5, crc32, 可用于秒传文件.

#### 例子:

```
# 获取 C:\Users\Administrator\Desktop\1.mp4 的秒传信息
BaiduPCS-Go sumfile C:/Users/Administrator/Desktop/1.mp4
```

## 导出文件/目录

```
BaiduPCS-Go export <文件/目录1> <文件/目录2> ...
BaiduPCS-Go ep <文件/目录1> <文件/目录2> ...
```

导出网盘内的文件或目录, 原理为秒传文件, 此操作会生成导出文件或目录的命令.
Expand All @@ -690,18 +706,25 @@ BaiduPCS-Go ep <文件/目录1> <文件/目录2> ...
并不是所有的文件都能导出成功, 程序会列出无法导出的文件列表

#### 例子:

```
# 导出当前工作目录:
BaiduPCS-Go export
# 导出所有文件和目录, 并设置新的根目录为 /root
BaiduPCS-Go export -root=/root /
# 导出 /我的资源
BaiduPCS-Go export /我的资源
# 导出 /我的资源 格式为通用秒传链接格式
BaiduPCS-Go export /我的资源 --link
```

## 创建目录
Expand Down Expand Up @@ -778,21 +801,16 @@ BaiduPCS-Go mv /我的资源/1.mp4 /我的资源/3.mp4
```
# 转存分享链接里的文件到当前目录:
BaiduPCS-Go transfer <分享链接> <提取码>
# 转存通用秒传链接里的文件到当前目录:
BaiduPCS-Go transfer <秒传链接>
```

注意: 公开分享链接不需输入提取码, 支持多个文件/目录; 只支持包含单个文件的秒传链接.

转存文件保存到当前工作目录下, 不支持指定.
注意: 转存文件保存到当前工作目录下, 不支持指定.

#### 例子
```
# 将 https://pan.baidu.com/s/12L_ZZVNxz5f_2CccoyyVrW (提取码edv4) 转存到当前目录
BaiduPCS-Go transfer https://pan.baidu.com/s/12L_ZZVNxz5f_2CccoyyVrW edv4
# 将 E7E7B8613854379642F70230B179F37A#FA690D0AB7C8BC6A62WD1B6B3FC5248F#128859362#test.7z 转存到当前目录
BaiduPCS-Go transfer E7E7B8613854379642F70230B179F37A#FA690D0AB7C8BC6A62WD1B6B3FC5248F#128859362#test.7z
BaiduPCS-Go transfer https://pan.baidu.com/s/12L_ZZVNxz5f_2CccoyyVrW?pwd=edv4
```

## 分享文件/目录
Expand Down Expand Up @@ -978,8 +996,8 @@ BaiduPCS-Go config set -h
# 设置下载文件的储存目录
BaiduPCS-Go config set -savedir D:/Downloads
# 设置下载最大并发量为 150
BaiduPCS-Go config set -max_parallel 150
# 设置下载最大并发量为 15
BaiduPCS-Go config set -max_parallel 15
# 组合设置
BaiduPCS-Go config set -max_parallel 150 -savedir D:/Downloads
Expand Down
65 changes: 54 additions & 11 deletions baidupcs/baidupcs.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,10 @@ import (
const (
// OperationGetUK 获取UK
OperationGetUK = "获取UK"
// OperationGetBDSToken
OperationGetBDSToken = "获取bdstoken"
// OperationGetCursorDiff
OperationGetCursorDiff = "获取cursor后文件列表diff信息"
// OperationQuotaInfo 获取当前用户空间配额信息
OperationQuotaInfo = "获取当前用户空间配额信息"
// OperationFilesDirectoriesMeta 获取文件/目录的元信息
Expand Down Expand Up @@ -131,16 +135,17 @@ var (
type (
// BaiduPCS 百度 PCS API 详情
BaiduPCS struct {
appID int // app_id
isHTTPS bool // 是否启用https
uid uint64 // 百度uid
client *requester.HTTPClient // http 客户端
pcsUA string
pcsAddr string
panUA string
isSetPanUA bool
ph *panhome.PanHome
cacheOpMap cachemap.CacheOpMap
appID int // app_id
isHTTPS bool // 是否启用https
uid uint64 // 百度uid
client *requester.HTTPClient // http 客户端
accessToken string // accessToken
pcsUA string
pcsAddr string
panUA string
isSetPanUA bool
ph *panhome.PanHome
cacheOpMap cachemap.CacheOpMap
}

userInfoJSON struct {
Expand All @@ -149,6 +154,13 @@ type (
Uk int64 `json:"uk"`
} `json:"records"`
}

userVarJSON struct {
*pcserror.PanErrorInfo
Result struct {
BDSToken string `json:"bdstoken"`
} `json:"result"`
}
)

//UpdatePCSCookies 去除重名Cookies, 同名cookeis只保留最新的
Expand Down Expand Up @@ -299,6 +311,11 @@ func (pcs *BaiduPCS) SetUID(uid uint64) {
pcs.uid = uid
}

// SetaccessToken 设置秒传转存用的accesstoken
func (pcs *BaiduPCS) SetaccessToken(accessToken string) {
pcs.accessToken = accessToken
}

// SetStoken 设置stoken
func (pcs *BaiduPCS) SetStoken(stoken string) {
pcs.lazyInit()
Expand Down Expand Up @@ -395,7 +412,6 @@ func (pcs *BaiduPCS) generatePCSURL2(subPath, method string, param ...map[string
}

uv := pcsURL2.Query()
uv.Set("app_id", PanAppID)
uv.Set("method", method)
for k := range param {
for k2 := range param[k] {
Expand Down Expand Up @@ -451,3 +467,30 @@ func (pcs *BaiduPCS) UK() (uk int64, pcsError pcserror.Error) {

return jsonData.Records[0].Uk, nil
}

func (pcs *BaiduPCS) BDSToken() (bdstoken string, pcsError pcserror.Error) {
dataReadCloser, pcsError := pcs.PrepareBDStoken()
if pcsError != nil {
return
}

defer dataReadCloser.Close()

errInfo := pcserror.NewPanErrorInfo(OperationGetBDSToken)
jsonData := userVarJSON{
PanErrorInfo: errInfo,
}

pcsError = pcserror.HandleJSONParse(OperationGetBDSToken, dataReadCloser, &jsonData)
if pcsError != nil {
return
}

if jsonData.Result.BDSToken == "" {
errInfo.ErrType = pcserror.ErrTypeOthers
errInfo.Err = errors.New("Unknown remote data")
return "", errInfo
}

return jsonData.Result.BDSToken, nil
}
29 changes: 11 additions & 18 deletions baidupcs/cloud_dl.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ type (
// cloudDlTaskInfo 用于解析远程返回的JSON
cloudDlTaskInfo struct {
Status string `json:"status"`
TaskID string `json:"task_id"`
FileSize string `json:"file_size"`
FinishedSize string `json:"finished_size"`
CreateTime string `json:"create_time"`
Expand All @@ -59,10 +60,6 @@ type (
Result int `json:"result"`
}

taskIDJSON struct {
TaskID string `json:"task_id"`
}

taskIDInt64JSON struct {
TaskID int64 `json:"task_id"`
}
Expand All @@ -78,7 +75,7 @@ type (
}

cloudDlListTaskJSON struct {
TaskInfo []*taskIDJSON `json:"task_info"`
TaskInfo []*cloudDlTaskInfo `json:"task_info"`
*pcserror.PCSErrInfo
}

Expand Down Expand Up @@ -225,24 +222,20 @@ func (pcs *BaiduPCS) CloudDlListTask() (cl CloudDlTaskList, pcsError pcserror.Er
if len(taskInfo.TaskInfo) <= 0 {
return CloudDlTaskList{}, nil
}

var (
taskID int64
taskIDs = make([]int64, 0, len(taskInfo.TaskInfo))
)
cl = make([]*CloudDlTaskInfo, 0, len(taskInfo.TaskInfo))
var v2 *CloudDlTaskInfo
for _, v := range taskInfo.TaskInfo {
var err error
if v == nil {
continue
}
var err error
if taskID, err = strconv.ParseInt(v.TaskID, 10, 64); err == nil {
taskIDs = append(taskIDs, taskID)
v2 = v.convert()
v2.TaskID, err = strconv.ParseInt(v.TaskID, 10, 64)
if err != nil {
continue
}
}

cl, pcsError = pcs.cloudDlQueryTask(OperationCloudDlListTask, taskIDs)
if pcsError != nil {
return nil, pcsError
v2.ParseText()
cl = append(cl, v2)
}

return cl, nil
Expand Down
Loading

0 comments on commit 1165370

Please sign in to comment.