forked from Angey40/BaiduPCS-Go
/
baidupcs.go
247 lines (215 loc) · 6.62 KB
/
baidupcs.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
// Package baidupcs BaiduPCS RESTful API 工具包
package baidupcs
import (
"errors"
"github.com/iikira/BaiduPCS-Go/baidupcs/pcserror"
"github.com/iikira/BaiduPCS-Go/pcsverbose"
"github.com/iikira/BaiduPCS-Go/requester"
"net/http"
"net/http/cookiejar"
"net/url"
"strconv"
)
const (
// OperationGetUK 获取UK
OperationGetUK = "获取UK"
// OperationQuotaInfo 获取当前用户空间配额信息
OperationQuotaInfo = "获取当前用户空间配额信息"
// OperationFilesDirectoriesMeta 获取文件/目录的元信息
OperationFilesDirectoriesMeta = "获取文件/目录的元信息"
// OperationFilesDirectoriesList 获取目录下的文件列表
OperationFilesDirectoriesList = "获取目录下的文件列表"
// OperationSearch 搜索
OperationSearch = "搜索"
// OperationRemove 删除文件/目录
OperationRemove = "删除文件/目录"
// OperationMkdir 创建目录
OperationMkdir = "创建目录"
// OperationRename 重命名文件/目录
OperationRename = "重命名文件/目录"
// OperationCopy 拷贝文件/目录
OperationCopy = "拷贝文件/目录"
// OperationMove 移动文件/目录
OperationMove = "移动文件/目录"
// OperationRapidUpload 秒传文件
OperationRapidUpload = "秒传文件"
// OperationUpload 上传单个文件
OperationUpload = "上传单个文件"
// OperationUploadTmpFile 分片上传—文件分片及上传
OperationUploadTmpFile = "分片上传—文件分片及上传"
// OperationUploadCreateSuperFile 分片上传—合并分片文件
OperationUploadCreateSuperFile = "分片上传—合并分片文件"
// OperationUploadPrecreate 分片上传—Precreate
OperationUploadPrecreate = "分片上传—Precreate"
// OperationUploadSuperfile2 分片上传—Superfile2
OperationUploadSuperfile2 = "分片上传—Superfile2"
// OperationDownloadFile 下载单个文件
OperationDownloadFile = "下载单个文件"
// OperationDownloadStreamFile 下载流式文件
OperationDownloadStreamFile = "下载流式文件"
// OperationLocateDownload 提取下载链接
OperationLocateDownload = "提取下载链接"
// OperationCloudDlAddTask 添加离线下载任务
OperationCloudDlAddTask = "添加离线下载任务"
// OperationCloudDlQueryTask 精确查询离线下载任务
OperationCloudDlQueryTask = "精确查询离线下载任务"
// OperationCloudDlListTask 查询离线下载任务列表
OperationCloudDlListTask = "查询离线下载任务列表"
// OperationCloudDlCancelTask 取消离线下载任务
OperationCloudDlCancelTask = "取消离线下载任务"
// OperationCloudDlDeleteTask 删除离线下载任务
OperationCloudDlDeleteTask = "删除离线下载任务"
// OperationCloudDlClearTask 清空离线下载任务记录
OperationCloudDlClearTask = "清空离线下载任务记录"
// OperationShareSet 创建分享链接
OperationShareSet = "创建分享链接"
// OperationShareCancel 取消分享
OperationShareCancel = "取消分享"
// OperationShareList 列出分享列表
OperationShareList = "列出分享列表"
// PCSBaiduCom pcs api地址
PCSBaiduCom = "pcs.baidu.com"
// PanBaiduCom 网盘首页api地址
PanBaiduCom = "pan.baidu.com"
// NetdiskUA 网盘客户端ua
NetdiskUA = "netdisk;7.8.1;Red;android-android;4.3"
)
var (
baiduPCSVerbose = pcsverbose.New("BAIDUPCS")
)
type (
// BaiduPCS 百度 PCS API 详情
BaiduPCS struct {
appID int // app_id
isHTTPS bool // 是否启用https
client *requester.HTTPClient // http 客户端
}
userInfoJSON struct {
*pcserror.PanErrorInfo
Records []struct {
Uk int64 `json:"uk"`
} `json:"records"`
}
)
// NewPCS 提供app_id, 百度BDUSS, 返回 BaiduPCS 对象
func NewPCS(appID int, bduss string) *BaiduPCS {
client := requester.NewHTTPClient()
pcsURL := &url.URL{
Scheme: "http",
Host: PCSBaiduCom,
}
cookies := []*http.Cookie{
&http.Cookie{
Name: "BDUSS",
Value: bduss,
},
}
jar, _ := cookiejar.New(nil)
jar.SetCookies(pcsURL, cookies)
jar.SetCookies((&url.URL{
Scheme: "http",
Host: PanBaiduCom,
}), cookies)
client.SetCookiejar(jar)
return &BaiduPCS{
appID: appID,
client: client,
}
}
// NewPCSWithClient 提供app_id, 自定义客户端, 返回 BaiduPCS 对象
func NewPCSWithClient(appID int, client *requester.HTTPClient) *BaiduPCS {
pcs := &BaiduPCS{
appID: appID,
client: client,
}
return pcs
}
// NewPCSWithCookieStr 提供app_id, cookie 字符串, 返回 BaiduPCS 对象
func NewPCSWithCookieStr(appID int, cookieStr string) *BaiduPCS {
pcs := &BaiduPCS{
appID: appID,
client: requester.NewHTTPClient(),
}
cookies := requester.ParseCookieStr(cookieStr)
jar, _ := cookiejar.New(nil)
jar.SetCookies(pcs.URL(), cookies)
pcs.client.SetCookiejar(jar)
return pcs
}
func (pcs *BaiduPCS) lazyInit() {
if pcs.client == nil {
pcs.client = requester.NewHTTPClient()
}
}
// SetAPPID 设置app_id
func (pcs *BaiduPCS) SetAPPID(appID int) {
pcs.appID = appID
}
// SetUserAgent 设置 User-Agent
func (pcs *BaiduPCS) SetUserAgent(ua string) {
pcs.client.SetUserAgent(ua)
}
// SetHTTPS 是否启用https连接
func (pcs *BaiduPCS) SetHTTPS(https bool) {
pcs.isHTTPS = https
}
// URL 返回 url
func (pcs *BaiduPCS) URL() *url.URL {
return &url.URL{
Scheme: GetHTTPScheme(pcs.isHTTPS),
Host: PCSBaiduCom,
}
}
func (pcs *BaiduPCS) generatePCSURL(subPath, method string, param ...map[string]string) *url.URL {
pcsURL := pcs.URL()
pcsURL.Path = "/rest/2.0/pcs/" + subPath
uv := pcsURL.Query()
uv.Set("app_id", strconv.Itoa(pcs.appID))
uv.Set("method", method)
for k := range param {
for k2 := range param[k] {
uv.Set(k2, param[k][k2])
}
}
pcsURL.RawQuery = uv.Encode()
return pcsURL
}
func (pcs *BaiduPCS) generatePCSURL2(subPath, method string, param ...map[string]string) *url.URL {
pcsURL2 := &url.URL{
Scheme: GetHTTPScheme(pcs.isHTTPS),
Host: PanBaiduCom,
Path: "/rest/2.0/" + subPath,
}
uv := pcsURL2.Query()
uv.Set("app_id", "250528")
uv.Set("method", method)
for k := range param {
for k2 := range param[k] {
uv.Set(k2, param[k][k2])
}
}
pcsURL2.RawQuery = uv.Encode()
return pcsURL2
}
// UK 获取用户 UK
func (pcs *BaiduPCS) UK() (uk int64, pcsError pcserror.Error) {
dataReadCloser, pcsError := pcs.PrepareUK()
if pcsError != nil {
return
}
defer dataReadCloser.Close()
errInfo := pcserror.NewPanErrorInfo(OperationGetUK)
jsonData := userInfoJSON{
PanErrorInfo: errInfo,
}
pcsError = handleJSONParse(OperationGetUK, dataReadCloser, &jsonData)
if pcsError != nil {
return
}
if len(jsonData.Records) != 1 {
errInfo.ErrType = pcserror.ErrTypeOthers
errInfo.Err = errors.New("Unknown remote data")
return 0, errInfo
}
return jsonData.Records[0].Uk, nil
}