p123client 0.0.6.10.2__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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: p123client
3
- Version: 0.0.6.10.2
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
- 需要先安装 [fastapi](https://pypi.org/project/blacksheep/)
402
+ 需要先安装 [blacksheep](https://www.neoteroi.dev/blacksheep/)
403
403
 
404
404
  ```console
405
405
  pip install 'blacksheep[uvicorn]'
@@ -2,7 +2,7 @@
2
2
  # encoding: utf-8
3
3
 
4
4
  __author__ = "ChenyangGao <https://chenyanggao.github.io>"
5
- __version__ = (0, 0, 6)
5
+ __version__ = (0, 0, 7)
6
6
 
7
7
  from .client import *
8
8
  from .const import *
@@ -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 upload_url(
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 upload_url(
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 upload_url(
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/v1/file/get_upload_url
4663
+ POST https://open-api.123pan.com/upload/v2/file/create
4537
4664
 
4538
4665
  .. note::
4539
- 有多个分片时,轮流分别根据序号获取下载链接,然后 PUT 方法上传分片。由于上传链接会过期,所以没必要提前获取一大批
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列表/文件管理/上传/V1/获取上传地址&上传分片
4682
+ /API列表/文件管理/上传/V2(推荐)/创建文件
4544
4683
 
4545
- https://123yunpan.yuque.com/org-wiki-123yunpan-muaork/cr6ced/sonz9n085gnz0n3m
4684
+ https://123yunpan.yuque.com/org-wiki-123yunpan-muaork/cr6ced/txow0iqviqsgotfl
4546
4685
 
4547
4686
  :payload:
4548
- - preuploadID: str 💡 预上传 id
4549
- - sliceNo: int 💡 分片序号,从 1 开始自增
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/v1/file/get_upload_url", base_url)
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 upload_complete(
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 upload_complete(
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 upload_complete(
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/upload_complete
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/hkdmcmvg437rfu6x
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
- "async": bool, # 是否需要异步查询上传结果
4657
- "completed": bool, # 上传是否完成
4862
+ "completed": bool, # 上传合并是否完成,如果为 False,请至少 1 秒后再发起轮询
4658
4863
  "fileID": int, # 上传的文件 id
4659
4864
  }
4660
4865
  """
4661
- api = complete_url("/upload/v1/file/upload_complete", base_url)
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 upload_result(
4872
+ def upload_single(
4668
4873
  self,
4669
- payload: str | dict,
4874
+ payload: dict,
4670
4875
  /,
4671
- base_url: str | Callable[[], str] = DEFAULT_OPEN_BASE_URL,
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 upload_result(
4884
+ def upload_single(
4679
4885
  self,
4680
- payload: str | dict,
4886
+ payload: dict,
4681
4887
  /,
4682
- base_url: str | Callable[[], str] = DEFAULT_OPEN_BASE_URL,
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 upload_result(
4895
+ def upload_single(
4689
4896
  self,
4690
- payload: str | dict,
4897
+ payload: dict,
4691
4898
  /,
4692
- base_url: str | Callable[[], str] = DEFAULT_OPEN_BASE_URL,
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/v1/file/upload_async_result
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列表/文件管理/上传/V1/异步轮询获取上传结果
4919
+ /API列表/文件管理/上传/V2(推荐)/单步上传
4704
4920
 
4705
- https://123yunpan.yuque.com/org-wiki-123yunpan-muaork/cr6ced/qgcosr6adkmm51h7
4921
+ https://123yunpan.yuque.com/org-wiki-123yunpan-muaork/cr6ced/xhiht1uh3yp92pzc
4706
4922
 
4707
4923
  :payload:
4708
- - preuploadID: str 💡 预上传 id
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, # 上传合并是否完成,如果为 False,请至少 1 秒后再发起轮询
4717
- "fileID": int, # 上传的文件 id
4938
+ "completed": bool, # 是否上传完成(如果 "completed" "true" 时,则说明上传完成)
4939
+ "fileID": int, # 文件 ID。当 123 云盘已有该文件,则会发生秒传。此时会将文件 ID 字段返回。唯一
4718
4940
  }
4719
4941
  """
4720
- api = complete_url("/upload/v1/file/upload_async_result", base_url)
4721
- if not isinstance(payload, dict):
4722
- payload = {"preuploadID": payload}
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列表/文件管理/上传/v1/💡上传流程说明
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: 只有在使用密码登录和client_id登录的情况下,即使 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: 消息通知列表和操作
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "p123client"
3
- version = "0.0.6.10.2"
3
+ version = "0.0.7"
4
4
  description = "Python 123 webdisk client."
5
5
  authors = ["ChenyangGao <wosiwujm@gmail.com>"]
6
6
  license = "MIT"
@@ -359,7 +359,7 @@ print(get_downurl(client, "123://torrentgalaxy.db|1976025090|582aa8bfb0ad8e6f512
359
359
 
360
360
  ### 4. 直链服务
361
361
 
362
- 需要先安装 [fastapi](https://pypi.org/project/blacksheep/)
362
+ 需要先安装 [blacksheep](https://www.neoteroi.dev/blacksheep/)
363
363
 
364
364
  ```console
365
365
  pip install 'blacksheep[uvicorn]'
File without changes