-
Notifications
You must be signed in to change notification settings - Fork 1
/
baidupcs.go
221 lines (193 loc) · 5.89 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
// Package baidupcs BaiduPCS RESTful API 工具包
package baidupcs
import (
"errors"
"github.com/iikira/BaiduPCS-Go/pcsverbose"
"github.com/iikira/BaiduPCS-Go/requester"
"github.com/iikira/baidu-tools/pan"
"github.com/json-iterator/go"
"net/http"
"net/http/cookiejar"
"net/url"
"strconv"
)
const (
// OperationGetUK 获取UK
OperationGetUK = "获取UK"
// OperationQuotaInfo 获取当前用户空间配额信息
OperationQuotaInfo = "获取当前用户空间配额信息"
// OperationFilesDirectoriesMeta 获取文件/目录的元信息
OperationFilesDirectoriesMeta = "获取文件/目录的元信息"
// OperationFilesDirectoriesList 获取目录下的文件列表
OperationFilesDirectoriesList = "获取目录下的文件列表"
// OperationRemove 删除文件/目录
OperationRemove = "删除文件/目录"
// OperationMkdir 创建目录
OperationMkdir = "创建目录"
// OperationRename 重命名文件/目录
OperationRename = "重命名文件/目录"
// OperationCopy 拷贝文件/目录
OperationCopy = "拷贝文件/目录"
// OperationMove 移动文件/目录
OperationMove = "移动文件/目录"
// OperationRapidUpload 秒传文件
OperationRapidUpload = "秒传文件"
// OperationUpload 上传单个文件
OperationUpload = "上传单个文件"
// OperationUploadTmpFile 分片上传—文件分片及上传
OperationUploadTmpFile = "分片上传—文件分片及上传"
// OperationUploadCreateSuperFile 分片上传—合并分片文件
OperationUploadCreateSuperFile = "分片上传—合并分片文件"
// OperationDownloadFile 下载单个文件
OperationDownloadFile = "下载单个文件"
// OperationDownloadStreamFile 下载流式文件
OperationDownloadStreamFile = "下载流式文件"
// OperationLocateDownload 提取下载链接
OperationLocateDownload = "提取下载链接"
// OperationCloudDlAddTask 添加离线下载任务
OperationCloudDlAddTask = "添加离线下载任务"
// OperationCloudDlQueryTask 精确查询离线下载任务
OperationCloudDlQueryTask = "精确查询离线下载任务"
// OperationCloudDlListTask 查询离线下载任务列表
OperationCloudDlListTask = "查询离线下载任务列表"
// OperationCloudDlCancelTask 取消离线下载任务
OperationCloudDlCancelTask = "取消离线下载任务"
// OperationCloudDlDeleteTask 删除离线下载任务
OperationCloudDlDeleteTask = "删除离线下载任务"
// OperationShareSet 创建分享链接
OperationShareSet = "创建分享链接"
// OperationShareCancel 取消分享
OperationShareCancel = "取消分享"
// OperationShareList 列出分享列表
OperationShareList = "列出分享列表"
)
var (
baiduPCSVerbose = pcsverbose.New("BAIDUPCS")
)
// BaiduPCS 百度 PCS API 详情
type BaiduPCS struct {
appID int // app_id
isHTTPS bool // 是否启用https
client *requester.HTTPClient // http 客户端
}
// NewPCS 提供app_id, 百度BDUSS, 返回 BaiduPCS 对象
func NewPCS(appID int, bduss string) *BaiduPCS {
client := requester.NewHTTPClient()
pcsURL := &url.URL{
Scheme: "http",
Host: "pcs.baidu.com",
}
cookies := []*http.Cookie{
&http.Cookie{
Name: "BDUSS",
Value: bduss,
},
}
jar, _ := cookiejar.New(nil)
jar.SetCookies(pcsURL, cookies)
jar.SetCookies((&url.URL{
Scheme: "http",
Host: "pan.baidu.com",
}), 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
}
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
}
func (pcs *BaiduPCS) generatePCSURL(subPath, method string, param ...map[string]string) *url.URL {
pcsURL := &url.URL{
Scheme: GetHTTPScheme(pcs.isHTTPS),
Host: "pcs.baidu.com",
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: "pan.baidu.com",
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 Error) {
pcs.lazyInit()
pcsURL := GetHTTPScheme(pcs.isHTTPS) + "://pan.baidu.com/api/user/getinfo?need_selfinfo=1"
errInfo := NewErrorInfo(OperationGetUK)
body, err := pcs.client.Fetch("GET", pcsURL, nil, map[string]string{
"User-Agent": "netdisk;8.3.1",
})
if err != nil {
errInfo.errType = ErrTypeNetError
errInfo.err = err
return 0, errInfo
}
jsonData := struct {
pan.RemoteErrInfo
Records []struct {
Uk int64 `json:"uk"`
} `json:"records"`
}{}
err = jsoniter.Unmarshal(body, &jsonData)
if err != nil {
errInfo.jsonError(err)
return 0, errInfo
}
if jsonData.ErrNo != 0 {
jsonData.RemoteErrInfo.ParseErrMsg()
errInfo.ErrCode = jsonData.RemoteErrInfo.ErrNo
errInfo.ErrMsg = jsonData.RemoteErrInfo.ErrMsg
return 0, errInfo
}
if len(jsonData.Records) != 1 {
errInfo.errType = ErrTypeOthers
errInfo.err = errors.New("Unknown remote data")
return 0, errInfo
}
return jsonData.Records[0].Uk, nil
}