p123client 0.0.6.10.1__tar.gz → 0.0.7__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.10.1 → p123client-0.0.7}/PKG-INFO +2 -2
- {p123client-0.0.6.10.1 → p123client-0.0.7}/p123client/__init__.py +1 -1
- {p123client-0.0.6.10.1 → p123client-0.0.7}/p123client/client.py +417 -66
- {p123client-0.0.6.10.1 → p123client-0.0.7}/pyproject.toml +1 -1
- {p123client-0.0.6.10.1 → p123client-0.0.7}/readme.md +1 -1
- {p123client-0.0.6.10.1 → p123client-0.0.7}/LICENSE +0 -0
- {p123client-0.0.6.10.1 → p123client-0.0.7}/p123client/const.py +0 -0
- {p123client-0.0.6.10.1 → p123client-0.0.7}/p123client/exception.py +0 -0
- {p123client-0.0.6.10.1 → p123client-0.0.7}/p123client/py.typed +0 -0
- {p123client-0.0.6.10.1 → p123client-0.0.7}/p123client/tool/__init__.py +0 -0
- {p123client-0.0.6.10.1 → p123client-0.0.7}/p123client/type.py +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: p123client
|
3
|
-
Version: 0.0.
|
3
|
+
Version: 0.0.7
|
4
4
|
Summary: Python 123 webdisk client.
|
5
5
|
Home-page: https://github.com/ChenyangGao/p123client
|
6
6
|
License: MIT
|
@@ -399,7 +399,7 @@ print(get_downurl(client, "123://torrentgalaxy.db|1976025090|582aa8bfb0ad8e6f512
|
|
399
399
|
|
400
400
|
### 4. 直链服务
|
401
401
|
|
402
|
-
需要先安装 [
|
402
|
+
需要先安装 [blacksheep](https://www.neoteroi.dev/blacksheep/)
|
403
403
|
|
404
404
|
```console
|
405
405
|
pip install 'blacksheep[uvicorn]'
|
@@ -505,7 +505,7 @@ class P123OpenClient:
|
|
505
505
|
client_id: str = "",
|
506
506
|
client_secret: str = "",
|
507
507
|
replace: bool | Self = False,
|
508
|
-
base_url: str | Callable[[], str] =
|
508
|
+
base_url: str | Callable[[], str] = DEFAULT_OPEN_BASE_URL,
|
509
509
|
*,
|
510
510
|
async_: Literal[False] = False,
|
511
511
|
**request_kwargs,
|
@@ -519,7 +519,7 @@ class P123OpenClient:
|
|
519
519
|
client_id: str = "",
|
520
520
|
client_secret: str = "",
|
521
521
|
replace: bool | Self = False,
|
522
|
-
base_url: str | Callable[[], str] =
|
522
|
+
base_url: str | Callable[[], str] = DEFAULT_OPEN_BASE_URL,
|
523
523
|
*,
|
524
524
|
async_: Literal[True],
|
525
525
|
**request_kwargs,
|
@@ -532,7 +532,7 @@ class P123OpenClient:
|
|
532
532
|
client_id: str = "",
|
533
533
|
client_secret: str = "",
|
534
534
|
replace: bool | Self = False,
|
535
|
-
base_url: str | Callable[[], str] =
|
535
|
+
base_url: str | Callable[[], str] = DEFAULT_OPEN_BASE_URL,
|
536
536
|
*,
|
537
537
|
async_: Literal[False, True] = False,
|
538
538
|
**request_kwargs,
|
@@ -674,7 +674,7 @@ class P123OpenClient:
|
|
674
674
|
client_secret: str,
|
675
675
|
redirect_uri: str,
|
676
676
|
token: str,
|
677
|
-
base_url: str | Callable[[], str] =
|
677
|
+
base_url: str | Callable[[], str] = DEFAULT_OPEN_BASE_URL,
|
678
678
|
*,
|
679
679
|
async_: Literal[False] = False,
|
680
680
|
**request_kwargs,
|
@@ -688,7 +688,7 @@ class P123OpenClient:
|
|
688
688
|
client_secret: str,
|
689
689
|
redirect_uri: str,
|
690
690
|
token: str,
|
691
|
-
base_url: str | Callable[[], str] =
|
691
|
+
base_url: str | Callable[[], str] = DEFAULT_OPEN_BASE_URL,
|
692
692
|
*,
|
693
693
|
async_: Literal[True],
|
694
694
|
**request_kwargs,
|
@@ -701,7 +701,7 @@ class P123OpenClient:
|
|
701
701
|
client_secret: str,
|
702
702
|
redirect_uri: str,
|
703
703
|
token: str,
|
704
|
-
base_url: str | Callable[[], str] =
|
704
|
+
base_url: str | Callable[[], str] = DEFAULT_OPEN_BASE_URL,
|
705
705
|
*,
|
706
706
|
async_: Literal[False, True] = False,
|
707
707
|
**request_kwargs,
|
@@ -745,7 +745,7 @@ class P123OpenClient:
|
|
745
745
|
cls,
|
746
746
|
/,
|
747
747
|
refresh_token: str,
|
748
|
-
base_url: str | Callable[[], str] =
|
748
|
+
base_url: str | Callable[[], str] = DEFAULT_OPEN_BASE_URL,
|
749
749
|
*,
|
750
750
|
async_: Literal[False] = False,
|
751
751
|
**request_kwargs,
|
@@ -756,7 +756,7 @@ class P123OpenClient:
|
|
756
756
|
cls,
|
757
757
|
/,
|
758
758
|
refresh_token: str,
|
759
|
-
base_url: str | Callable[[], str] =
|
759
|
+
base_url: str | Callable[[], str] = DEFAULT_OPEN_BASE_URL,
|
760
760
|
*,
|
761
761
|
async_: Literal[True],
|
762
762
|
**request_kwargs,
|
@@ -766,7 +766,7 @@ class P123OpenClient:
|
|
766
766
|
cls,
|
767
767
|
/,
|
768
768
|
refresh_token: str,
|
769
|
-
base_url: str | Callable[[], str] =
|
769
|
+
base_url: str | Callable[[], str] = DEFAULT_OPEN_BASE_URL,
|
770
770
|
*,
|
771
771
|
async_: Literal[False, True] = False,
|
772
772
|
**request_kwargs,
|
@@ -4424,6 +4424,125 @@ class P123OpenClient:
|
|
4424
4424
|
|
4425
4425
|
########## Upload API ##########
|
4426
4426
|
|
4427
|
+
@overload
|
4428
|
+
def upload_complete(
|
4429
|
+
self,
|
4430
|
+
payload: str | dict,
|
4431
|
+
/,
|
4432
|
+
base_url: str | Callable[[], str] = DEFAULT_OPEN_BASE_URL,
|
4433
|
+
*,
|
4434
|
+
async_: Literal[False] = False,
|
4435
|
+
**request_kwargs,
|
4436
|
+
) -> dict:
|
4437
|
+
...
|
4438
|
+
@overload
|
4439
|
+
def upload_complete(
|
4440
|
+
self,
|
4441
|
+
payload: str | dict,
|
4442
|
+
/,
|
4443
|
+
base_url: str | Callable[[], str] = DEFAULT_OPEN_BASE_URL,
|
4444
|
+
*,
|
4445
|
+
async_: Literal[True],
|
4446
|
+
**request_kwargs,
|
4447
|
+
) -> Coroutine[Any, Any, dict]:
|
4448
|
+
...
|
4449
|
+
def upload_complete(
|
4450
|
+
self,
|
4451
|
+
payload: str | dict,
|
4452
|
+
/,
|
4453
|
+
base_url: str | Callable[[], str] = DEFAULT_OPEN_BASE_URL,
|
4454
|
+
*,
|
4455
|
+
async_: Literal[False, True] = False,
|
4456
|
+
**request_kwargs,
|
4457
|
+
) -> dict | Coroutine[Any, Any, dict]:
|
4458
|
+
"""上传完毕
|
4459
|
+
|
4460
|
+
POST https://open-api.123pan.com/upload/v1/file/upload_complete
|
4461
|
+
|
4462
|
+
.. admonition:: Reference
|
4463
|
+
|
4464
|
+
/API列表/文件管理/上传/V1(旧)/上传完毕
|
4465
|
+
|
4466
|
+
https://123yunpan.yuque.com/org-wiki-123yunpan-muaork/cr6ced/hkdmcmvg437rfu6x
|
4467
|
+
|
4468
|
+
:payload:
|
4469
|
+
- preuploadID: str 💡 预上传 id
|
4470
|
+
|
4471
|
+
:return:
|
4472
|
+
返回的数据说明如下:
|
4473
|
+
|
4474
|
+
.. code:: python
|
4475
|
+
|
4476
|
+
{
|
4477
|
+
"async": bool, # 是否需要异步查询上传结果
|
4478
|
+
"completed": bool, # 上传是否完成
|
4479
|
+
"fileID": int, # 上传的文件 id
|
4480
|
+
}
|
4481
|
+
"""
|
4482
|
+
api = complete_url("/upload/v1/file/upload_complete", base_url)
|
4483
|
+
if not isinstance(payload, dict):
|
4484
|
+
payload = {"preuploadID": payload}
|
4485
|
+
return self.request(api, "POST", json=payload, async_=async_, **request_kwargs)
|
4486
|
+
|
4487
|
+
@overload
|
4488
|
+
def upload_complete_v2(
|
4489
|
+
self,
|
4490
|
+
payload: str | dict,
|
4491
|
+
/,
|
4492
|
+
base_url: str | Callable[[], str] = DEFAULT_OPEN_BASE_URL,
|
4493
|
+
*,
|
4494
|
+
async_: Literal[False] = False,
|
4495
|
+
**request_kwargs,
|
4496
|
+
) -> dict:
|
4497
|
+
...
|
4498
|
+
@overload
|
4499
|
+
def upload_complete_v2(
|
4500
|
+
self,
|
4501
|
+
payload: str | dict,
|
4502
|
+
/,
|
4503
|
+
base_url: str | Callable[[], str] = DEFAULT_OPEN_BASE_URL,
|
4504
|
+
*,
|
4505
|
+
async_: Literal[True],
|
4506
|
+
**request_kwargs,
|
4507
|
+
) -> Coroutine[Any, Any, dict]:
|
4508
|
+
...
|
4509
|
+
def upload_complete_v2(
|
4510
|
+
self,
|
4511
|
+
payload: str | dict,
|
4512
|
+
/,
|
4513
|
+
base_url: str | Callable[[], str] = DEFAULT_OPEN_BASE_URL,
|
4514
|
+
*,
|
4515
|
+
async_: Literal[False, True] = False,
|
4516
|
+
**request_kwargs,
|
4517
|
+
) -> dict | Coroutine[Any, Any, dict]:
|
4518
|
+
"""上传完毕
|
4519
|
+
|
4520
|
+
POST https://open-api.123pan.com/upload/v2/file/upload_complete
|
4521
|
+
|
4522
|
+
.. admonition:: Reference
|
4523
|
+
|
4524
|
+
/API列表/文件管理/上传/V2(推荐)/上传完毕
|
4525
|
+
|
4526
|
+
https://123yunpan.yuque.com/org-wiki-123yunpan-muaork/cr6ced/fzzc5o8gok517720
|
4527
|
+
|
4528
|
+
:payload:
|
4529
|
+
- preuploadID: str 💡 预上传 id
|
4530
|
+
|
4531
|
+
:return:
|
4532
|
+
返回的数据说明如下:
|
4533
|
+
|
4534
|
+
.. code:: python
|
4535
|
+
|
4536
|
+
{
|
4537
|
+
"completed": bool, # 上传是否完成
|
4538
|
+
"fileID": int, # 上传的文件 id
|
4539
|
+
}
|
4540
|
+
"""
|
4541
|
+
api = complete_url("/upload/v2/file/upload_complete", base_url)
|
4542
|
+
if not isinstance(payload, dict):
|
4543
|
+
payload = {"preuploadID": payload}
|
4544
|
+
return self.request(api, "POST", json=payload, async_=async_, **request_kwargs)
|
4545
|
+
|
4427
4546
|
@overload
|
4428
4547
|
def upload_create(
|
4429
4548
|
self,
|
@@ -4465,9 +4584,17 @@ class P123OpenClient:
|
|
4465
4584
|
- 开发者上传单文件大小限制 10 GB
|
4466
4585
|
- 不会重名
|
4467
4586
|
|
4587
|
+
.. note::
|
4588
|
+
/API列表/文件管理/上传/V1(旧)/💡上传流程说明
|
4589
|
+
|
4590
|
+
https://123yunpan.yuque.com/org-wiki-123yunpan-muaork/cr6ced/il16qi0opiel4889
|
4591
|
+
|
4592
|
+
1. 请求创建文件接口,接口返回的 "reuse" 为 "true" 时,表示秒传成功,上传结束。
|
4593
|
+
2. 非秒传情况将会返回预上传ID ``preuploadID`` 与分片大小 ``sliceSize``,请将文件根据分片大小切分。
|
4594
|
+
|
4468
4595
|
.. admonition:: Reference
|
4469
4596
|
|
4470
|
-
/API列表/文件管理/上传/V1
|
4597
|
+
/API列表/文件管理/上传/V1(旧)/创建文件
|
4471
4598
|
|
4472
4599
|
https://123yunpan.yuque.com/org-wiki-123yunpan-muaork/cr6ced/lrfuu3qe7q1ul8ig
|
4473
4600
|
|
@@ -4501,7 +4628,7 @@ class P123OpenClient:
|
|
4501
4628
|
return self.request(api, "POST", json=payload, async_=async_, **request_kwargs)
|
4502
4629
|
|
4503
4630
|
@overload
|
4504
|
-
def
|
4631
|
+
def upload_create_v2(
|
4505
4632
|
self,
|
4506
4633
|
payload: dict,
|
4507
4634
|
/,
|
@@ -4512,7 +4639,7 @@ class P123OpenClient:
|
|
4512
4639
|
) -> dict:
|
4513
4640
|
...
|
4514
4641
|
@overload
|
4515
|
-
def
|
4642
|
+
def upload_create_v2(
|
4516
4643
|
self,
|
4517
4644
|
payload: dict,
|
4518
4645
|
/,
|
@@ -4522,7 +4649,7 @@ class P123OpenClient:
|
|
4522
4649
|
**request_kwargs,
|
4523
4650
|
) -> Coroutine[Any, Any, dict]:
|
4524
4651
|
...
|
4525
|
-
def
|
4652
|
+
def upload_create_v2(
|
4526
4653
|
self,
|
4527
4654
|
payload: dict,
|
4528
4655
|
/,
|
@@ -4531,26 +4658,105 @@ class P123OpenClient:
|
|
4531
4658
|
async_: Literal[False, True] = False,
|
4532
4659
|
**request_kwargs,
|
4533
4660
|
) -> dict | Coroutine[Any, Any, dict]:
|
4534
|
-
"""
|
4661
|
+
"""创建文件
|
4535
4662
|
|
4536
|
-
POST https://open-api.123pan.com/upload/
|
4663
|
+
POST https://open-api.123pan.com/upload/v2/file/create
|
4537
4664
|
|
4538
4665
|
.. note::
|
4539
|
-
|
4666
|
+
- 文件名要小于 256 个字符且不能包含以下字符:``"\\/:*?|><``
|
4667
|
+
- 文件名不能全部是空格
|
4668
|
+
- 开发者上传单文件大小限制 10 GB
|
4669
|
+
- 不会重名
|
4670
|
+
|
4671
|
+
.. note::
|
4672
|
+
/API列表/文件管理/上传/V2(推荐)/💡上传流程说明
|
4673
|
+
|
4674
|
+
https://123yunpan.yuque.com/org-wiki-123yunpan-muaork/cr6ced/xogi45g7okqk7svr#uqhyW
|
4675
|
+
|
4676
|
+
1. 调用创建文件接口,接口返回的 "reuse" 为 "true" 时,表示秒传成功,上传结束。
|
4677
|
+
2. 非秒传情况将会返回预上传ID ``preuploadID`` 与分片大小 ``sliceSize``,请将文件根据分片大小切分。
|
4678
|
+
3. 非秒传情况下返回 "servers" 为后续上传文件的对应域名(重要),多个任选其一。
|
4540
4679
|
|
4541
4680
|
.. admonition:: Reference
|
4542
4681
|
|
4543
|
-
/API列表/文件管理/上传/
|
4682
|
+
/API列表/文件管理/上传/V2(推荐)/创建文件
|
4544
4683
|
|
4545
|
-
https://123yunpan.yuque.com/org-wiki-123yunpan-muaork/cr6ced/
|
4684
|
+
https://123yunpan.yuque.com/org-wiki-123yunpan-muaork/cr6ced/txow0iqviqsgotfl
|
4546
4685
|
|
4547
4686
|
:payload:
|
4548
|
-
-
|
4549
|
-
-
|
4687
|
+
- containDir: "false" | "true" = "false" 💡 上传文件是否包含路径
|
4688
|
+
- filename: str 💡 文件名,但 ``containDir`` 为 "true" 时,视为路径
|
4689
|
+
- duplicate: 0 | 1 | 2 = 0 💡 处理同名:0: 跳过/报错 1: 保留/后缀编号 2: 替换/覆盖
|
4690
|
+
- etag: str 💡 文件 md5
|
4691
|
+
- parentFileID: int = 0 💡 父目录 id,根目录是 0
|
4692
|
+
- size: int 💡 文件大小,单位:字节
|
4693
|
+
|
4694
|
+
:return:
|
4695
|
+
返回的数据说明如下:
|
4696
|
+
|
4697
|
+
.. code:: python
|
4698
|
+
|
4699
|
+
{
|
4700
|
+
"fileID": str, # 上传后的文件 id。当已有相同 ``size`` 和 ``etag`` 的文件时,会发生秒传
|
4701
|
+
"preuploadID": str, # 预上传 id。当 ``reuse`` 为 "true" 时,该字段不存在
|
4702
|
+
"reuse": bool, # 是否秒传,返回 "true" 时表示文件已上传成功
|
4703
|
+
"sliceSize": int, # 分片大小,必须按此大小生成文件分片再上传。当 ``reuse`` 为 "true" 时,该字段不存在
|
4704
|
+
"servers": list[str], # 上传地址,多个任选其一
|
4705
|
+
}
|
4550
4706
|
"""
|
4551
|
-
api = complete_url("/upload/
|
4707
|
+
api = complete_url("/upload/v2/file/create", base_url)
|
4708
|
+
payload = dict_to_lower_merge(payload, {
|
4709
|
+
"parentFileId": 0,
|
4710
|
+
"containDir": "false",
|
4711
|
+
})
|
4712
|
+
if "duplicate" in payload and not payload["duplicate"]:
|
4713
|
+
del payload["duplicate"]
|
4552
4714
|
return self.request(api, "POST", json=payload, async_=async_, **request_kwargs)
|
4553
4715
|
|
4716
|
+
@overload
|
4717
|
+
def upload_domain(
|
4718
|
+
self,
|
4719
|
+
/,
|
4720
|
+
base_url: str | Callable[[], str] = DEFAULT_OPEN_BASE_URL,
|
4721
|
+
*,
|
4722
|
+
async_: Literal[False] = False,
|
4723
|
+
**request_kwargs,
|
4724
|
+
) -> dict:
|
4725
|
+
...
|
4726
|
+
@overload
|
4727
|
+
def upload_domain(
|
4728
|
+
self,
|
4729
|
+
/,
|
4730
|
+
base_url: str | Callable[[], str] = DEFAULT_OPEN_BASE_URL,
|
4731
|
+
*,
|
4732
|
+
async_: Literal[True],
|
4733
|
+
**request_kwargs,
|
4734
|
+
) -> Coroutine[Any, Any, dict]:
|
4735
|
+
...
|
4736
|
+
def upload_domain(
|
4737
|
+
self,
|
4738
|
+
/,
|
4739
|
+
base_url: str | Callable[[], str] = DEFAULT_OPEN_BASE_URL,
|
4740
|
+
*,
|
4741
|
+
async_: Literal[False, True] = False,
|
4742
|
+
**request_kwargs,
|
4743
|
+
) -> dict | Coroutine[Any, Any, dict]:
|
4744
|
+
"""获取上传域名
|
4745
|
+
|
4746
|
+
GET https://open-api.123pan.com/upload/v2/file/domain
|
4747
|
+
|
4748
|
+
.. admonition:: Reference
|
4749
|
+
|
4750
|
+
/API列表/文件管理/上传/V2(推荐)/获取上传域名
|
4751
|
+
|
4752
|
+
https://123yunpan.yuque.com/org-wiki-123yunpan-muaork/cr6ced/agn8lolktbqie7p9
|
4753
|
+
|
4754
|
+
:payload:
|
4755
|
+
- preuploadID: str 💡 预上传 id
|
4756
|
+
"""
|
4757
|
+
api = complete_url("/upload/v2/file/domain", base_url)
|
4758
|
+
return self.request(api, async_=async_, **request_kwargs)
|
4759
|
+
|
4554
4760
|
@overload
|
4555
4761
|
def upload_list(
|
4556
4762
|
self,
|
@@ -4591,7 +4797,7 @@ class P123OpenClient:
|
|
4591
4797
|
|
4592
4798
|
.. admonition:: Reference
|
4593
4799
|
|
4594
|
-
/API列表/文件管理/上传/V1
|
4800
|
+
/API列表/文件管理/上传/V1(旧)/列举已上传分片(非必需)
|
4595
4801
|
|
4596
4802
|
https://123yunpan.yuque.com/org-wiki-123yunpan-muaork/cr6ced/dd28ws4bfn644cny
|
4597
4803
|
|
@@ -4604,7 +4810,7 @@ class P123OpenClient:
|
|
4604
4810
|
return self.request(api, "POST", json=payload, async_=async_, **request_kwargs)
|
4605
4811
|
|
4606
4812
|
@overload
|
4607
|
-
def
|
4813
|
+
def upload_result(
|
4608
4814
|
self,
|
4609
4815
|
payload: str | dict,
|
4610
4816
|
/,
|
@@ -4615,7 +4821,7 @@ class P123OpenClient:
|
|
4615
4821
|
) -> dict:
|
4616
4822
|
...
|
4617
4823
|
@overload
|
4618
|
-
def
|
4824
|
+
def upload_result(
|
4619
4825
|
self,
|
4620
4826
|
payload: str | dict,
|
4621
4827
|
/,
|
@@ -4625,7 +4831,7 @@ class P123OpenClient:
|
|
4625
4831
|
**request_kwargs,
|
4626
4832
|
) -> Coroutine[Any, Any, dict]:
|
4627
4833
|
...
|
4628
|
-
def
|
4834
|
+
def upload_result(
|
4629
4835
|
self,
|
4630
4836
|
payload: str | dict,
|
4631
4837
|
/,
|
@@ -4634,15 +4840,15 @@ class P123OpenClient:
|
|
4634
4840
|
async_: Literal[False, True] = False,
|
4635
4841
|
**request_kwargs,
|
4636
4842
|
) -> dict | Coroutine[Any, Any, dict]:
|
4637
|
-
"""
|
4843
|
+
"""异步轮询获取上传结果
|
4638
4844
|
|
4639
|
-
POST https://open-api.123pan.com/upload/v1/file/
|
4845
|
+
POST https://open-api.123pan.com/upload/v1/file/upload_async_result
|
4640
4846
|
|
4641
4847
|
.. admonition:: Reference
|
4642
4848
|
|
4643
|
-
/API列表/文件管理/上传/V1
|
4849
|
+
/API列表/文件管理/上传/V1(旧)/异步轮询获取上传结果
|
4644
4850
|
|
4645
|
-
https://123yunpan.yuque.com/org-wiki-123yunpan-muaork/cr6ced/
|
4851
|
+
https://123yunpan.yuque.com/org-wiki-123yunpan-muaork/cr6ced/qgcosr6adkmm51h7
|
4646
4852
|
|
4647
4853
|
:payload:
|
4648
4854
|
- preuploadID: str 💡 预上传 id
|
@@ -4653,59 +4859,75 @@ class P123OpenClient:
|
|
4653
4859
|
.. code:: python
|
4654
4860
|
|
4655
4861
|
{
|
4656
|
-
"
|
4657
|
-
"completed": bool, # 上传是否完成
|
4862
|
+
"completed": bool, # 上传合并是否完成,如果为 False,请至少 1 秒后再发起轮询
|
4658
4863
|
"fileID": int, # 上传的文件 id
|
4659
4864
|
}
|
4660
4865
|
"""
|
4661
|
-
api = complete_url("/upload/v1/file/
|
4866
|
+
api = complete_url("/upload/v1/file/upload_async_result", base_url)
|
4662
4867
|
if not isinstance(payload, dict):
|
4663
4868
|
payload = {"preuploadID": payload}
|
4664
4869
|
return self.request(api, "POST", json=payload, async_=async_, **request_kwargs)
|
4665
4870
|
|
4666
4871
|
@overload
|
4667
|
-
def
|
4872
|
+
def upload_single(
|
4668
4873
|
self,
|
4669
|
-
payload:
|
4874
|
+
payload: dict,
|
4670
4875
|
/,
|
4671
|
-
|
4876
|
+
file: Buffer | SupportsRead[Buffer] | Iterable[Buffer],
|
4877
|
+
base_url: str | Callable[[], str] = "https://openapi-upload.123242.com",
|
4672
4878
|
*,
|
4673
4879
|
async_: Literal[False] = False,
|
4674
4880
|
**request_kwargs,
|
4675
4881
|
) -> dict:
|
4676
4882
|
...
|
4677
4883
|
@overload
|
4678
|
-
def
|
4884
|
+
def upload_single(
|
4679
4885
|
self,
|
4680
|
-
payload:
|
4886
|
+
payload: dict,
|
4681
4887
|
/,
|
4682
|
-
|
4888
|
+
file: Buffer | SupportsRead[Buffer] | Iterable[Buffer] | AsyncIterable[Buffer],
|
4889
|
+
base_url: str | Callable[[], str] = "https://openapi-upload.123242.com",
|
4683
4890
|
*,
|
4684
4891
|
async_: Literal[True],
|
4685
4892
|
**request_kwargs,
|
4686
4893
|
) -> Coroutine[Any, Any, dict]:
|
4687
4894
|
...
|
4688
|
-
def
|
4895
|
+
def upload_single(
|
4689
4896
|
self,
|
4690
|
-
payload:
|
4897
|
+
payload: dict,
|
4691
4898
|
/,
|
4692
|
-
|
4899
|
+
file: Buffer | SupportsRead[Buffer] | Iterable[Buffer] | AsyncIterable[Buffer],
|
4900
|
+
base_url: str | Callable[[], str] = "https://openapi-upload.123242.com",
|
4693
4901
|
*,
|
4694
4902
|
async_: Literal[False, True] = False,
|
4695
4903
|
**request_kwargs,
|
4696
4904
|
) -> dict | Coroutine[Any, Any, dict]:
|
4697
|
-
"""
|
4905
|
+
"""单步上传
|
4698
4906
|
|
4699
|
-
POST https://open-api.123pan.com/upload/
|
4907
|
+
POST https://open-api.123pan.com/upload/v2/file/single/create
|
4908
|
+
|
4909
|
+
.. note::
|
4910
|
+
- 文件名要小于 256 个字符且不能包含以下任何字符:``"\\/:*?|><``
|
4911
|
+
- 文件名不能全部是空格
|
4912
|
+
- 请求头包含 ``Content-Type: multipart/form-data``
|
4913
|
+
- 此接口限制开发者上传单文件大小为 1 GB
|
4914
|
+
- 上传域名是 ``client.upload_domain_open`` 响应中的域名
|
4915
|
+
- 此接口用于实现小文件单步上传一次 HTTP 请求交互即可完成上传
|
4700
4916
|
|
4701
4917
|
.. admonition:: Reference
|
4702
4918
|
|
4703
|
-
/API列表/文件管理/上传/
|
4919
|
+
/API列表/文件管理/上传/V2(推荐)/单步上传
|
4704
4920
|
|
4705
|
-
https://123yunpan.yuque.com/org-wiki-123yunpan-muaork/cr6ced/
|
4921
|
+
https://123yunpan.yuque.com/org-wiki-123yunpan-muaork/cr6ced/xhiht1uh3yp92pzc
|
4706
4922
|
|
4707
4923
|
:payload:
|
4708
|
-
-
|
4924
|
+
- containDir: "false" | "true" = "false" 💡 上传文件是否包含路径
|
4925
|
+
- filename: str 💡 文件名,但 ``containDir`` 为 "true" 时,视为路径
|
4926
|
+
- duplicate: 0 | 1 | 2 = 0 💡 处理同名:0: 跳过/报错 1: 保留/后缀编号 2: 替换/覆盖
|
4927
|
+
- etag: str 💡 文件 md5
|
4928
|
+
- parentFileID: int = 0 💡 父目录 id,根目录是 0
|
4929
|
+
- size: int 💡 文件大小,单位:字节
|
4930
|
+
- file: Any 💡 分片二进制流(请单独传递 ``file`` 参数)
|
4709
4931
|
|
4710
4932
|
:return:
|
4711
4933
|
返回的数据说明如下:
|
@@ -4713,16 +4935,153 @@ class P123OpenClient:
|
|
4713
4935
|
.. code:: python
|
4714
4936
|
|
4715
4937
|
{
|
4716
|
-
"completed": bool, #
|
4717
|
-
"fileID": int, #
|
4938
|
+
"completed": bool, # 是否上传完成(如果 "completed" 为 "true" 时,则说明上传完成)
|
4939
|
+
"fileID": int, # 文件 ID。当 123 云盘已有该文件,则会发生秒传。此时会将文件 ID 字段返回。唯一
|
4718
4940
|
}
|
4719
4941
|
"""
|
4720
|
-
|
4721
|
-
|
4722
|
-
|
4942
|
+
payload = dict_to_lower_merge(payload, {
|
4943
|
+
"parentFileId": "0",
|
4944
|
+
"containDir": "false",
|
4945
|
+
})
|
4946
|
+
if "duplicate" in payload and not payload["duplicate"]:
|
4947
|
+
del payload["duplicate"]
|
4948
|
+
for k, v in payload.items():
|
4949
|
+
if not isinstance(v, str):
|
4950
|
+
payload[k] = str(v)
|
4951
|
+
if async_:
|
4952
|
+
headers, request_kwargs["data"] = encode_multipart_data_async(payload, {"file": file})
|
4953
|
+
else:
|
4954
|
+
headers, request_kwargs["data"] = encode_multipart_data(payload, {"file": file}) # type: ignore
|
4955
|
+
request_kwargs["headers"] = {**(request_kwargs.get("headers") or {}), **headers}
|
4956
|
+
return self.request(
|
4957
|
+
"/upload/v2/file/single/create",
|
4958
|
+
"POST",
|
4959
|
+
base_url=base_url,
|
4960
|
+
async_=async_,
|
4961
|
+
**request_kwargs,
|
4962
|
+
)
|
4963
|
+
|
4964
|
+
@overload
|
4965
|
+
def upload_slice(
|
4966
|
+
self,
|
4967
|
+
payload: dict,
|
4968
|
+
/,
|
4969
|
+
slice: Buffer | SupportsRead[Buffer] | Iterable[Buffer],
|
4970
|
+
base_url: str | Callable[[], str] = "https://openapi-upload.123242.com",
|
4971
|
+
*,
|
4972
|
+
async_: Literal[False] = False,
|
4973
|
+
**request_kwargs,
|
4974
|
+
) -> dict:
|
4975
|
+
...
|
4976
|
+
@overload
|
4977
|
+
def upload_slice(
|
4978
|
+
self,
|
4979
|
+
payload: dict,
|
4980
|
+
/,
|
4981
|
+
slice: Buffer | SupportsRead[Buffer] | Iterable[Buffer] | AsyncIterable[Buffer],
|
4982
|
+
base_url: str | Callable[[], str] = "https://openapi-upload.123242.com",
|
4983
|
+
*,
|
4984
|
+
async_: Literal[True],
|
4985
|
+
**request_kwargs,
|
4986
|
+
) -> Coroutine[Any, Any, dict]:
|
4987
|
+
...
|
4988
|
+
def upload_slice(
|
4989
|
+
self,
|
4990
|
+
payload: dict,
|
4991
|
+
/,
|
4992
|
+
slice: Buffer | SupportsRead[Buffer] | Iterable[Buffer] | AsyncIterable[Buffer],
|
4993
|
+
base_url: str | Callable[[], str] = "https://openapi-upload.123242.com",
|
4994
|
+
*,
|
4995
|
+
async_: Literal[False, True] = False,
|
4996
|
+
**request_kwargs,
|
4997
|
+
) -> dict | Coroutine[Any, Any, dict]:
|
4998
|
+
"""上传文件文件
|
4999
|
+
|
5000
|
+
POST https://open-api.123pan.com/upload/v2/file/slice
|
5001
|
+
|
5002
|
+
.. note::
|
5003
|
+
- 上传域名是创建文件接口响应中的 "servers"
|
5004
|
+
- 请求头包含 ``Content-Type: multipart/form-data``
|
5005
|
+
|
5006
|
+
.. admonition:: Reference
|
5007
|
+
|
5008
|
+
/API列表/文件管理/上传/V2(推荐)/上传分片
|
5009
|
+
|
5010
|
+
https://123yunpan.yuque.com/org-wiki-123yunpan-muaork/cr6ced/txow0iqviqsgotfl
|
5011
|
+
|
5012
|
+
:payload:
|
5013
|
+
- preuploadID: str 💡 预上传ID
|
5014
|
+
- sliceNo: int 💡 分片序号,从 1 开始自增
|
5015
|
+
- sliceMD5: str 💡 当前分片 md5
|
5016
|
+
- slice: Any 💡 分片二进制流(请单独传递 ``slice`` 参数)
|
5017
|
+
"""
|
5018
|
+
payload["sliceNo"] = str(payload.get("sliceNo", 1))
|
5019
|
+
if async_:
|
5020
|
+
headers, request_kwargs["data"] = encode_multipart_data_async(payload, {"slice": slice})
|
5021
|
+
else:
|
5022
|
+
headers, request_kwargs["data"] = encode_multipart_data(payload, {"slice": slice}) # type: ignore
|
5023
|
+
request_kwargs["headers"] = {**(request_kwargs.get("headers") or {}), **headers}
|
5024
|
+
return self.request(
|
5025
|
+
"/upload/v2/file/slice",
|
5026
|
+
"POST",
|
5027
|
+
base_url=base_url,
|
5028
|
+
async_=async_,
|
5029
|
+
**request_kwargs,
|
5030
|
+
)
|
5031
|
+
|
5032
|
+
@overload
|
5033
|
+
def upload_url(
|
5034
|
+
self,
|
5035
|
+
payload: dict,
|
5036
|
+
/,
|
5037
|
+
base_url: str | Callable[[], str] = DEFAULT_OPEN_BASE_URL,
|
5038
|
+
*,
|
5039
|
+
async_: Literal[False] = False,
|
5040
|
+
**request_kwargs,
|
5041
|
+
) -> dict:
|
5042
|
+
...
|
5043
|
+
@overload
|
5044
|
+
def upload_url(
|
5045
|
+
self,
|
5046
|
+
payload: dict,
|
5047
|
+
/,
|
5048
|
+
base_url: str | Callable[[], str] = DEFAULT_OPEN_BASE_URL,
|
5049
|
+
*,
|
5050
|
+
async_: Literal[True],
|
5051
|
+
**request_kwargs,
|
5052
|
+
) -> Coroutine[Any, Any, dict]:
|
5053
|
+
...
|
5054
|
+
def upload_url(
|
5055
|
+
self,
|
5056
|
+
payload: dict,
|
5057
|
+
/,
|
5058
|
+
base_url: str | Callable[[], str] = DEFAULT_OPEN_BASE_URL,
|
5059
|
+
*,
|
5060
|
+
async_: Literal[False, True] = False,
|
5061
|
+
**request_kwargs,
|
5062
|
+
) -> dict | Coroutine[Any, Any, dict]:
|
5063
|
+
"""获取上传地址&上传分片
|
5064
|
+
|
5065
|
+
POST https://open-api.123pan.com/upload/v1/file/get_upload_url
|
5066
|
+
|
5067
|
+
.. note::
|
5068
|
+
有多个分片时,轮流分别根据序号获取下载链接,然后 PUT 方法上传分片。由于上传链接会过期,所以没必要提前获取一大批
|
5069
|
+
|
5070
|
+
.. admonition:: Reference
|
5071
|
+
|
5072
|
+
/API列表/文件管理/上传/V1(旧)/获取上传地址&上传分片
|
5073
|
+
|
5074
|
+
https://123yunpan.yuque.com/org-wiki-123yunpan-muaork/cr6ced/sonz9n085gnz0n3m
|
5075
|
+
|
5076
|
+
:payload:
|
5077
|
+
- preuploadID: str 💡 预上传 id
|
5078
|
+
- sliceNo: int 💡 分片序号,从 1 开始自增
|
5079
|
+
"""
|
5080
|
+
api = complete_url("/upload/v1/file/get_upload_url", base_url)
|
4723
5081
|
return self.request(api, "POST", json=payload, async_=async_, **request_kwargs)
|
4724
5082
|
|
4725
|
-
# TODO: 如果已经有 md5 和
|
5083
|
+
# TODO: 如果已经有 md5 和 大小,则先尝试直接上传,而不是打开文件,等确定不能妙传,再打开文件
|
5084
|
+
# TODO: 支持 v2 接口,以及上传单个文件的接口(可以设定一个参数,是否优先用 upload_single,只要文件大小在 1 GB 内)
|
4726
5085
|
@overload
|
4727
5086
|
def upload_file(
|
4728
5087
|
self,
|
@@ -4785,7 +5144,7 @@ class P123OpenClient:
|
|
4785
5144
|
|
4786
5145
|
.. admonition:: Reference
|
4787
5146
|
|
4788
|
-
/API列表/文件管理/上传/
|
5147
|
+
/API列表/文件管理/上传/V1(旧)/💡上传流程说明
|
4789
5148
|
|
4790
5149
|
https://123yunpan.yuque.com/org-wiki-123yunpan-muaork/cr6ced/il16qi0opiel4889
|
4791
5150
|
|
@@ -5150,10 +5509,15 @@ class P123OpenClient:
|
|
5150
5509
|
transcode_upload_open = transcode_upload
|
5151
5510
|
transcode_video_open = transcode_video
|
5152
5511
|
upload_complete_open = upload_complete
|
5512
|
+
upload_complete_v2_open = upload_complete_v2
|
5153
5513
|
upload_create_open = upload_create
|
5514
|
+
upload_create_v2_open = upload_create_v2
|
5515
|
+
upload_domain_open = upload_domain
|
5154
5516
|
upload_file_open = upload_file
|
5155
5517
|
upload_list_open = upload_list
|
5156
5518
|
upload_result_open = upload_result
|
5519
|
+
upload_single_open = upload_single
|
5520
|
+
upload_slice_open = upload_slice
|
5157
5521
|
upload_url_open = upload_url
|
5158
5522
|
user_info_open = user_info
|
5159
5523
|
|
@@ -9903,16 +10267,3 @@ with temp_globals():
|
|
9903
10267
|
except KeyError:
|
9904
10268
|
CLIENT_API_METHODS_MAP[api] = [name]
|
9905
10269
|
|
9906
|
-
|
9907
|
-
# TODO: 只有在使用密码登录的情况下,即使 token 失效,也可以重新登录(在有账号和密码的情况下,遇到 401 报错,会自动重新登录(需要加锁))
|
9908
|
-
# TODO: 新的上传方法需要封装:https://123yunpan.yuque.com/org-wiki-123yunpan-muaork/cr6ced/xogi45g7okqk7svr
|
9909
|
-
# TODO: 对于某些工具的接口封装,例如 重复文件清理
|
9910
|
-
# TODO: 同步空间
|
9911
|
-
# TODO: 直链空间
|
9912
|
-
# TODO: 图床
|
9913
|
-
# TODO: 视频转码
|
9914
|
-
# TODO: 移入保险箱
|
9915
|
-
# TODO: 申诉和申诉列表
|
9916
|
-
# TODO: 歌单(以及批量加入歌单)
|
9917
|
-
# TODO: 最近查看
|
9918
|
-
# TODO: 消息通知列表和操作
|
@@ -359,7 +359,7 @@ print(get_downurl(client, "123://torrentgalaxy.db|1976025090|582aa8bfb0ad8e6f512
|
|
359
359
|
|
360
360
|
### 4. 直链服务
|
361
361
|
|
362
|
-
需要先安装 [
|
362
|
+
需要先安装 [blacksheep](https://www.neoteroi.dev/blacksheep/)
|
363
363
|
|
364
364
|
```console
|
365
365
|
pip install 'blacksheep[uvicorn]'
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|