p123client 0.0.6.9.2__tar.gz → 0.0.6.9.3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {p123client-0.0.6.9.2 → p123client-0.0.6.9.3}/PKG-INFO +110 -23
- {p123client-0.0.6.9.2 → p123client-0.0.6.9.3}/p123client/client.py +1 -1
- {p123client-0.0.6.9.2 → p123client-0.0.6.9.3}/pyproject.toml +1 -1
- {p123client-0.0.6.9.2 → p123client-0.0.6.9.3}/readme.md +109 -22
- {p123client-0.0.6.9.2 → p123client-0.0.6.9.3}/LICENSE +0 -0
- {p123client-0.0.6.9.2 → p123client-0.0.6.9.3}/p123client/__init__.py +0 -0
- {p123client-0.0.6.9.2 → p123client-0.0.6.9.3}/p123client/const.py +0 -0
- {p123client-0.0.6.9.2 → p123client-0.0.6.9.3}/p123client/exception.py +0 -0
- {p123client-0.0.6.9.2 → p123client-0.0.6.9.3}/p123client/py.typed +0 -0
- {p123client-0.0.6.9.2 → p123client-0.0.6.9.3}/p123client/tool/__init__.py +0 -0
- {p123client-0.0.6.9.2 → p123client-0.0.6.9.3}/p123client/type.py +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: p123client
|
3
|
-
Version: 0.0.6.9.
|
3
|
+
Version: 0.0.6.9.3
|
4
4
|
Summary: Python 123 webdisk client.
|
5
5
|
Home-page: https://github.com/ChenyangGao/p123client
|
6
6
|
License: MIT
|
@@ -45,7 +45,7 @@ Description-Content-Type: text/markdown
|
|
45
45
|

|
46
46
|

|
47
47
|
|
48
|
-
## 安装
|
48
|
+
## 0. 安装
|
49
49
|
|
50
50
|
你可以从 [pypi](https://pypi.org/project/p123client/) 安装最新版本
|
51
51
|
|
@@ -53,9 +53,7 @@ Description-Content-Type: text/markdown
|
|
53
53
|
pip install -U p123client
|
54
54
|
```
|
55
55
|
|
56
|
-
##
|
57
|
-
|
58
|
-
### 1. 导入模块和创建实例
|
56
|
+
## 1. 导入模块和创建实例
|
59
57
|
|
60
58
|
导入模块
|
61
59
|
|
@@ -63,7 +61,7 @@ pip install -U p123client
|
|
63
61
|
from p123client import P123Client
|
64
62
|
```
|
65
63
|
|
66
|
-
创建客户端对象,需要传入 JWT <kbd>token</kbd
|
64
|
+
创建客户端对象,需要传入 JWT <kbd>token</kbd>,也就是 `access_token`
|
67
65
|
|
68
66
|
```python
|
69
67
|
token = "..."
|
@@ -78,7 +76,26 @@ password = "..." # 密码
|
|
78
76
|
client = P123Client(passport, password)
|
79
77
|
```
|
80
78
|
|
81
|
-
|
79
|
+
它的这个 <kbd>token</kbd>,就包含了有关信息
|
80
|
+
|
81
|
+
```python
|
82
|
+
from base64 import b64decode
|
83
|
+
from json import loads
|
84
|
+
|
85
|
+
token = client.token
|
86
|
+
|
87
|
+
method, user_info, sign = token.split(".", 2)
|
88
|
+
print("JWT 算法:", loads(b64decode(method)))
|
89
|
+
print("用户信息:", loads(b64decode(user_info+"==")))
|
90
|
+
```
|
91
|
+
|
92
|
+
当你需要刷新此 <kbd>token</kbd> 时:
|
93
|
+
|
94
|
+
- 要么利用另一个 `refresh_token`
|
95
|
+
- 要么直接用这个 <kbd>token</kbd> 授权一次扫码,即可获得新的 <kbd>token</kbd>
|
96
|
+
- 要么重新用账号和密码登录
|
97
|
+
|
98
|
+
## 2. 接口调用
|
82
99
|
|
83
100
|
所有需要直接或间接执行 HTTP 请求的接口,都有同步和异步的调用方式,且默认是采用 POST 发送 JSON 请求数据
|
84
101
|
|
@@ -177,7 +194,7 @@ class MyCustom123Client(P123Client):
|
|
177
194
|
)
|
178
195
|
```
|
179
196
|
|
180
|
-
|
197
|
+
## 3. 检查响应
|
181
198
|
|
182
199
|
接口被调用后,如果返回的是 dict 类型的数据(说明原本是 JSON),则可以用 `p123client.check_response` 执行检查。首先会查看其中名为 "code" 的键的对应值,如果为 0 或 200 或者不存在,则原样返回被检查的数据;否则,抛出一个 `p123client.P123OSError` 的实例。
|
183
200
|
|
@@ -190,7 +207,7 @@ data = check_response(client.method(payload))
|
|
190
207
|
data = check_response(await client.method(payload, async_=True))
|
191
208
|
```
|
192
209
|
|
193
|
-
|
210
|
+
## 4. 辅助工具
|
194
211
|
|
195
212
|
一些简单的封装工具可能是必要的,特别是那种实现起来代码量比较少,可以封装成单个函数的。我把平常使用过程中,积累的一些经验具体化为一组工具函数。这些工具函数分别有着不同的功能,如果组合起来使用,或许能解决很多问题。
|
196
213
|
|
@@ -198,7 +215,9 @@ data = check_response(await client.method(payload, async_=True))
|
|
198
215
|
from p123client import tool
|
199
216
|
```
|
200
217
|
|
201
|
-
|
218
|
+
## 5. 学习案例
|
219
|
+
|
220
|
+
### 1. 创建自定义 uri
|
202
221
|
|
203
222
|
```python
|
204
223
|
from p123client import P123Client
|
@@ -212,7 +231,7 @@ file_id = 15688945
|
|
212
231
|
print(make_uri(client, file_id))
|
213
232
|
```
|
214
233
|
|
215
|
-
|
234
|
+
### 2. 由自定义 uri 转存文件到你的网盘
|
216
235
|
|
217
236
|
```python
|
218
237
|
from p123client import P123Client
|
@@ -225,7 +244,7 @@ uri = "123://torrentgalaxy.db|1976025090|582aa8bfb0ad8e6f512d9661f6243bdd"
|
|
225
244
|
print(upload_uri(client, uri, duplicate=1))
|
226
245
|
```
|
227
246
|
|
228
|
-
|
247
|
+
### 3. 由自定义 uri 获取下载直链
|
229
248
|
|
230
249
|
```python
|
231
250
|
from p123client import P123Client
|
@@ -240,7 +259,7 @@ print(get_downurl(client, "123://torrentgalaxy.db|1976025090|582aa8bfb0ad8e6f512
|
|
240
259
|
print(get_downurl(client, "123://torrentgalaxy.db|1976025090|582aa8bfb0ad8e6f512d9661f6243bdd"))
|
241
260
|
```
|
242
261
|
|
243
|
-
|
262
|
+
### 4. 直链服务
|
244
263
|
|
245
264
|
需要先安装 [fastapi](https://pypi.org/project/fastapi/)
|
246
265
|
|
@@ -289,9 +308,11 @@ if __name__ == "__main__":
|
|
289
308
|
run(app, host="0.0.0.0", port=8123)
|
290
309
|
```
|
291
310
|
|
292
|
-
|
311
|
+
### 5. 遍历文件列表
|
312
|
+
|
313
|
+
导出的文件信息中,有个 `"uri"`,表示文件的自定义链接,前面以 `123://` 开头,你可以替换成 302 服务的地址,例如 `http://localhost:8123/`
|
293
314
|
|
294
|
-
|
315
|
+
#### 1. 遍历网盘中的文件列表
|
295
316
|
|
296
317
|
```python
|
297
318
|
from p123client import P123Client
|
@@ -300,21 +321,87 @@ from p123client.tool import iterdir
|
|
300
321
|
# TODO: 改成你自己的账户和密码
|
301
322
|
client = P123Client(passport="手机号或邮箱", password="登录密码")
|
302
323
|
|
303
|
-
for info in iterdir(client, parent_id=0, max_depth=-1
|
324
|
+
for info in iterdir(client, parent_id=0, max_depth=-1):
|
304
325
|
print(info)
|
305
326
|
```
|
306
327
|
|
307
|
-
|
328
|
+
#### 2. 遍历分享中的文件列表,不含目录
|
308
329
|
|
309
330
|
```python
|
310
331
|
from p123client.tool import share_iterdir
|
311
332
|
|
312
|
-
#
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
333
|
+
# NOTE: 无需登录
|
334
|
+
for info in share_iterdir(
|
335
|
+
"https://www.123684.com/s/oec7Vv-CIYWh?提取码:ZY4K",
|
336
|
+
max_depth=-1,
|
337
|
+
predicate=lambda a: not a["is_dir"],
|
338
|
+
):
|
318
339
|
print(info)
|
319
340
|
```
|
320
341
|
|
342
|
+
#### 3. 导出分享中的文件列表到本地 .json 文件
|
343
|
+
|
344
|
+
```python
|
345
|
+
from orjson import dumps
|
346
|
+
from p123client.tool import share_iterdir
|
347
|
+
|
348
|
+
def export_share_files_json(
|
349
|
+
link: str,
|
350
|
+
path: str = "",
|
351
|
+
cooldown: float = 0,
|
352
|
+
):
|
353
|
+
"""把分享链接中的文件列表导出到 json 文件
|
354
|
+
|
355
|
+
:param link: 分享链接,可以包含提取码
|
356
|
+
:param path: 保存的路径,如果不提供则自动确定
|
357
|
+
:param cooldown: 两次调用之间,冷却的时间(用两次调用开始时的时间差,而不是一次完成到下一次开始的时间差)
|
358
|
+
"""
|
359
|
+
print("< 将拉取:", link)
|
360
|
+
ls: list[dict] = []
|
361
|
+
for i, a in enumerate(share_iterdir(link, max_depth=-1, cooldown=cooldown), 1):
|
362
|
+
ls.append(a)
|
363
|
+
print(i, a)
|
364
|
+
if ls:
|
365
|
+
info = ls[0]
|
366
|
+
if not path:
|
367
|
+
suffix = f"@{info['ShareKey']},{info['SharePwd']}.json"
|
368
|
+
path = f"{info['name'][:255-len(suffix)]}{suffix}"
|
369
|
+
open(path, "wb").write(dumps(ls))
|
370
|
+
print()
|
371
|
+
print("> 已拉取:", link)
|
372
|
+
print("> 已保存:", path)
|
373
|
+
|
374
|
+
export_share_files("https://www.123684.com/s/oec7Vv-CIYWh?提取码:ZY4K")
|
375
|
+
```
|
376
|
+
|
377
|
+
### 6. 最新的操作记录
|
378
|
+
|
379
|
+
在网盘中,你可以按更新时间逆序查询,即可得到最新上传的文件列表
|
380
|
+
|
381
|
+
```python
|
382
|
+
client.fs_list_new({
|
383
|
+
"orderBy": "update_time",
|
384
|
+
"orderDirection": "desc",
|
385
|
+
"SearchData": ".",
|
386
|
+
})
|
387
|
+
```
|
388
|
+
|
389
|
+
更一般的,你可以在[同步空间](https://www.123pan.com/SynchronousSpace/main)中执行文件操作。
|
390
|
+
|
391
|
+
而在拉取文件列表时,需要指定
|
392
|
+
|
393
|
+
```python
|
394
|
+
client.fs_list_new({
|
395
|
+
"operateType": "SyncSpacePage",
|
396
|
+
"event": "syncFileList",
|
397
|
+
"RequestSource": 1,
|
398
|
+
})
|
399
|
+
```
|
400
|
+
|
401
|
+
同步空间中的增删改操作都有[操作记录](https://www.123pan.com/SynchronousSpace/record),你可以用接口
|
402
|
+
|
403
|
+
```python
|
404
|
+
client.fs_sync_log()
|
405
|
+
```
|
406
|
+
|
407
|
+
|
@@ -5577,7 +5577,7 @@ class P123Client(P123OpenClient):
|
|
5577
5577
|
|
5578
5578
|
- operation: bool = <default>
|
5579
5579
|
- operatePlace: int = <default>
|
5580
|
-
- RequestSource: int = <default>
|
5580
|
+
- RequestSource: int = <default> 💡 浏览器中,在同步空间中为 1
|
5581
5581
|
"""
|
5582
5582
|
if isinstance(payload, (int, str)):
|
5583
5583
|
payload = {"fileTrashInfoList": [{"FileId": payload}]}
|
@@ -6,7 +6,7 @@
|
|
6
6
|

|
7
7
|

|
8
8
|
|
9
|
-
## 安装
|
9
|
+
## 0. 安装
|
10
10
|
|
11
11
|
你可以从 [pypi](https://pypi.org/project/p123client/) 安装最新版本
|
12
12
|
|
@@ -14,9 +14,7 @@
|
|
14
14
|
pip install -U p123client
|
15
15
|
```
|
16
16
|
|
17
|
-
##
|
18
|
-
|
19
|
-
### 1. 导入模块和创建实例
|
17
|
+
## 1. 导入模块和创建实例
|
20
18
|
|
21
19
|
导入模块
|
22
20
|
|
@@ -24,7 +22,7 @@ pip install -U p123client
|
|
24
22
|
from p123client import P123Client
|
25
23
|
```
|
26
24
|
|
27
|
-
创建客户端对象,需要传入 JWT <kbd>token</kbd
|
25
|
+
创建客户端对象,需要传入 JWT <kbd>token</kbd>,也就是 `access_token`
|
28
26
|
|
29
27
|
```python
|
30
28
|
token = "..."
|
@@ -39,7 +37,26 @@ password = "..." # 密码
|
|
39
37
|
client = P123Client(passport, password)
|
40
38
|
```
|
41
39
|
|
42
|
-
|
40
|
+
它的这个 <kbd>token</kbd>,就包含了有关信息
|
41
|
+
|
42
|
+
```python
|
43
|
+
from base64 import b64decode
|
44
|
+
from json import loads
|
45
|
+
|
46
|
+
token = client.token
|
47
|
+
|
48
|
+
method, user_info, sign = token.split(".", 2)
|
49
|
+
print("JWT 算法:", loads(b64decode(method)))
|
50
|
+
print("用户信息:", loads(b64decode(user_info+"==")))
|
51
|
+
```
|
52
|
+
|
53
|
+
当你需要刷新此 <kbd>token</kbd> 时:
|
54
|
+
|
55
|
+
- 要么利用另一个 `refresh_token`
|
56
|
+
- 要么直接用这个 <kbd>token</kbd> 授权一次扫码,即可获得新的 <kbd>token</kbd>
|
57
|
+
- 要么重新用账号和密码登录
|
58
|
+
|
59
|
+
## 2. 接口调用
|
43
60
|
|
44
61
|
所有需要直接或间接执行 HTTP 请求的接口,都有同步和异步的调用方式,且默认是采用 POST 发送 JSON 请求数据
|
45
62
|
|
@@ -138,7 +155,7 @@ class MyCustom123Client(P123Client):
|
|
138
155
|
)
|
139
156
|
```
|
140
157
|
|
141
|
-
|
158
|
+
## 3. 检查响应
|
142
159
|
|
143
160
|
接口被调用后,如果返回的是 dict 类型的数据(说明原本是 JSON),则可以用 `p123client.check_response` 执行检查。首先会查看其中名为 "code" 的键的对应值,如果为 0 或 200 或者不存在,则原样返回被检查的数据;否则,抛出一个 `p123client.P123OSError` 的实例。
|
144
161
|
|
@@ -151,7 +168,7 @@ data = check_response(client.method(payload))
|
|
151
168
|
data = check_response(await client.method(payload, async_=True))
|
152
169
|
```
|
153
170
|
|
154
|
-
|
171
|
+
## 4. 辅助工具
|
155
172
|
|
156
173
|
一些简单的封装工具可能是必要的,特别是那种实现起来代码量比较少,可以封装成单个函数的。我把平常使用过程中,积累的一些经验具体化为一组工具函数。这些工具函数分别有着不同的功能,如果组合起来使用,或许能解决很多问题。
|
157
174
|
|
@@ -159,7 +176,9 @@ data = check_response(await client.method(payload, async_=True))
|
|
159
176
|
from p123client import tool
|
160
177
|
```
|
161
178
|
|
162
|
-
|
179
|
+
## 5. 学习案例
|
180
|
+
|
181
|
+
### 1. 创建自定义 uri
|
163
182
|
|
164
183
|
```python
|
165
184
|
from p123client import P123Client
|
@@ -173,7 +192,7 @@ file_id = 15688945
|
|
173
192
|
print(make_uri(client, file_id))
|
174
193
|
```
|
175
194
|
|
176
|
-
|
195
|
+
### 2. 由自定义 uri 转存文件到你的网盘
|
177
196
|
|
178
197
|
```python
|
179
198
|
from p123client import P123Client
|
@@ -186,7 +205,7 @@ uri = "123://torrentgalaxy.db|1976025090|582aa8bfb0ad8e6f512d9661f6243bdd"
|
|
186
205
|
print(upload_uri(client, uri, duplicate=1))
|
187
206
|
```
|
188
207
|
|
189
|
-
|
208
|
+
### 3. 由自定义 uri 获取下载直链
|
190
209
|
|
191
210
|
```python
|
192
211
|
from p123client import P123Client
|
@@ -201,7 +220,7 @@ print(get_downurl(client, "123://torrentgalaxy.db|1976025090|582aa8bfb0ad8e6f512
|
|
201
220
|
print(get_downurl(client, "123://torrentgalaxy.db|1976025090|582aa8bfb0ad8e6f512d9661f6243bdd"))
|
202
221
|
```
|
203
222
|
|
204
|
-
|
223
|
+
### 4. 直链服务
|
205
224
|
|
206
225
|
需要先安装 [fastapi](https://pypi.org/project/fastapi/)
|
207
226
|
|
@@ -250,9 +269,11 @@ if __name__ == "__main__":
|
|
250
269
|
run(app, host="0.0.0.0", port=8123)
|
251
270
|
```
|
252
271
|
|
253
|
-
|
272
|
+
### 5. 遍历文件列表
|
273
|
+
|
274
|
+
导出的文件信息中,有个 `"uri"`,表示文件的自定义链接,前面以 `123://` 开头,你可以替换成 302 服务的地址,例如 `http://localhost:8123/`
|
254
275
|
|
255
|
-
|
276
|
+
#### 1. 遍历网盘中的文件列表
|
256
277
|
|
257
278
|
```python
|
258
279
|
from p123client import P123Client
|
@@ -261,20 +282,86 @@ from p123client.tool import iterdir
|
|
261
282
|
# TODO: 改成你自己的账户和密码
|
262
283
|
client = P123Client(passport="手机号或邮箱", password="登录密码")
|
263
284
|
|
264
|
-
for info in iterdir(client, parent_id=0, max_depth=-1
|
285
|
+
for info in iterdir(client, parent_id=0, max_depth=-1):
|
265
286
|
print(info)
|
266
287
|
```
|
267
288
|
|
268
|
-
|
289
|
+
#### 2. 遍历分享中的文件列表,不含目录
|
269
290
|
|
270
291
|
```python
|
271
292
|
from p123client.tool import share_iterdir
|
272
293
|
|
273
|
-
#
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
294
|
+
# NOTE: 无需登录
|
295
|
+
for info in share_iterdir(
|
296
|
+
"https://www.123684.com/s/oec7Vv-CIYWh?提取码:ZY4K",
|
297
|
+
max_depth=-1,
|
298
|
+
predicate=lambda a: not a["is_dir"],
|
299
|
+
):
|
279
300
|
print(info)
|
280
301
|
```
|
302
|
+
|
303
|
+
#### 3. 导出分享中的文件列表到本地 .json 文件
|
304
|
+
|
305
|
+
```python
|
306
|
+
from orjson import dumps
|
307
|
+
from p123client.tool import share_iterdir
|
308
|
+
|
309
|
+
def export_share_files_json(
|
310
|
+
link: str,
|
311
|
+
path: str = "",
|
312
|
+
cooldown: float = 0,
|
313
|
+
):
|
314
|
+
"""把分享链接中的文件列表导出到 json 文件
|
315
|
+
|
316
|
+
:param link: 分享链接,可以包含提取码
|
317
|
+
:param path: 保存的路径,如果不提供则自动确定
|
318
|
+
:param cooldown: 两次调用之间,冷却的时间(用两次调用开始时的时间差,而不是一次完成到下一次开始的时间差)
|
319
|
+
"""
|
320
|
+
print("< 将拉取:", link)
|
321
|
+
ls: list[dict] = []
|
322
|
+
for i, a in enumerate(share_iterdir(link, max_depth=-1, cooldown=cooldown), 1):
|
323
|
+
ls.append(a)
|
324
|
+
print(i, a)
|
325
|
+
if ls:
|
326
|
+
info = ls[0]
|
327
|
+
if not path:
|
328
|
+
suffix = f"@{info['ShareKey']},{info['SharePwd']}.json"
|
329
|
+
path = f"{info['name'][:255-len(suffix)]}{suffix}"
|
330
|
+
open(path, "wb").write(dumps(ls))
|
331
|
+
print()
|
332
|
+
print("> 已拉取:", link)
|
333
|
+
print("> 已保存:", path)
|
334
|
+
|
335
|
+
export_share_files("https://www.123684.com/s/oec7Vv-CIYWh?提取码:ZY4K")
|
336
|
+
```
|
337
|
+
|
338
|
+
### 6. 最新的操作记录
|
339
|
+
|
340
|
+
在网盘中,你可以按更新时间逆序查询,即可得到最新上传的文件列表
|
341
|
+
|
342
|
+
```python
|
343
|
+
client.fs_list_new({
|
344
|
+
"orderBy": "update_time",
|
345
|
+
"orderDirection": "desc",
|
346
|
+
"SearchData": ".",
|
347
|
+
})
|
348
|
+
```
|
349
|
+
|
350
|
+
更一般的,你可以在[同步空间](https://www.123pan.com/SynchronousSpace/main)中执行文件操作。
|
351
|
+
|
352
|
+
而在拉取文件列表时,需要指定
|
353
|
+
|
354
|
+
```python
|
355
|
+
client.fs_list_new({
|
356
|
+
"operateType": "SyncSpacePage",
|
357
|
+
"event": "syncFileList",
|
358
|
+
"RequestSource": 1,
|
359
|
+
})
|
360
|
+
```
|
361
|
+
|
362
|
+
同步空间中的增删改操作都有[操作记录](https://www.123pan.com/SynchronousSpace/record),你可以用接口
|
363
|
+
|
364
|
+
```python
|
365
|
+
client.fs_sync_log()
|
366
|
+
```
|
367
|
+
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|