aioqzone 1.4.2.dev2__tar.gz → 1.4.2.dev5__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.
Files changed (51) hide show
  1. {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/PKG-INFO +2 -2
  2. {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/pyproject.toml +2 -2
  3. {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/src/qqqr/up/captcha/__init__.py +6 -2
  4. {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/src/qqqr/up/web.py +4 -6
  5. {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/src/qqqr/utils/jsjson.py +1 -2
  6. {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/LICENSE +0 -0
  7. {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/README.md +0 -0
  8. {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/src/aioqzone/__init__.py +0 -0
  9. {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/src/aioqzone/api/__init__.py +0 -0
  10. {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/src/aioqzone/api/h5/__init__.py +0 -0
  11. {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/src/aioqzone/api/h5/model.py +0 -0
  12. {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/src/aioqzone/api/h5/raw.py +0 -0
  13. {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/src/aioqzone/api/login/__init__.py +0 -0
  14. {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/src/aioqzone/api/login/_base.py +0 -0
  15. {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/src/aioqzone/exception.py +0 -0
  16. {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/src/aioqzone/message.py +0 -0
  17. {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/src/aioqzone/model/__init__.py +0 -0
  18. {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/src/aioqzone/model/protocol/__init__.py +0 -0
  19. {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/src/aioqzone/model/protocol/config.py +0 -0
  20. {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/src/aioqzone/model/protocol/entity.py +0 -0
  21. {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/src/aioqzone/model/response/__init__.py +0 -0
  22. {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/src/aioqzone/model/response/h5.py +0 -0
  23. {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/src/aioqzone/utils/__init__.py +0 -0
  24. {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/src/aioqzone/utils/entity.py +0 -0
  25. {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/src/aioqzone/utils/regex.py +0 -0
  26. {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/src/aioqzone/utils/retry.py +0 -0
  27. {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/src/aioqzone/utils/time.py +0 -0
  28. {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/src/qqqr/__init__.py +0 -0
  29. {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/src/qqqr/base.py +0 -0
  30. {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/src/qqqr/constant.py +0 -0
  31. {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/src/qqqr/exception.py +0 -0
  32. {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/src/qqqr/message.py +0 -0
  33. {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/src/qqqr/py.typed +0 -0
  34. {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/src/qqqr/qr/__init__.py +0 -0
  35. {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/src/qqqr/qr/type.py +0 -0
  36. {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/src/qqqr/type.py +0 -0
  37. {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/src/qqqr/up/__init__.py +0 -0
  38. {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/src/qqqr/up/_model.py +0 -0
  39. {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/src/qqqr/up/captcha/_model.py +0 -0
  40. {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/src/qqqr/up/captcha/capsess.py +0 -0
  41. {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/src/qqqr/up/captcha/img_utils.py +0 -0
  42. {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/src/qqqr/up/captcha/select/__init__.py +0 -0
  43. {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/src/qqqr/up/captcha/select/_types.py +0 -0
  44. {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/src/qqqr/up/captcha/slide/__init__.py +0 -0
  45. {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/src/qqqr/up/captcha/slide/_types.py +0 -0
  46. {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/src/qqqr/up/captcha/slide/jigsaw.py +0 -0
  47. {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/src/qqqr/up/encrypt.py +0 -0
  48. {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/src/qqqr/up/h5.py +0 -0
  49. {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/src/qqqr/utils/encrypt.py +0 -0
  50. {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/src/qqqr/utils/iter.py +0 -0
  51. {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/src/qqqr/utils/net.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: aioqzone
3
- Version: 1.4.2.dev2
3
+ Version: 1.4.2.dev5
4
4
  Summary: A Python wrapper for Qzone login and H5 APIs.
5
5
  Home-page: https://github.com/aioqzone/aioqzone
6
6
  License: AGPL-3.0
@@ -25,7 +25,7 @@ Requires-Dist: exceptiongroup (>=1.1.1,<2.0.0)
25
25
  Requires-Dist: lxml (>=4.9.1,<5.0.0)
26
26
  Requires-Dist: numpy (>=1.22.3,<2.0.0) ; extra == "captcha"
27
27
  Requires-Dist: pillow (>=10.0.1,<11.0.0) ; extra == "captcha"
28
- Requires-Dist: pychaosvm (>=0.2.3,<0.3.0) ; extra == "captcha"
28
+ Requires-Dist: pychaosvm (>=0.2.7,<0.3.0) ; extra == "captcha"
29
29
  Requires-Dist: pydantic (>=2.0.3,<3.0.0)
30
30
  Requires-Dist: pydantic-settings (>=2.0.2,<3.0.0)
31
31
  Requires-Dist: rsa (>=4.8,<5.0)
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "aioqzone"
3
- version = "1.4.2.dev2"
3
+ version = "1.4.2.dev5"
4
4
  description = "A Python wrapper for Qzone login and H5 APIs."
5
5
  authors = ["aioqzone <zzzzss990315@gmail.com>"]
6
6
  license = "AGPL-3.0"
@@ -40,7 +40,7 @@ tylisten = { version = "^1.1.2", source = "aioqzone-index" }
40
40
 
41
41
  numpy = { version = "^1.22.3", optional = true}
42
42
  pillow = { version = "^10.0.1", optional = true}
43
- pychaosvm = { version = "~0.2.3", optional = true, source = "aioqzone-index" }
43
+ pychaosvm = { version = "~0.2.7", optional = true, source = "aioqzone-index" }
44
44
 
45
45
  [tool.poetry.extras]
46
46
  captcha = ["numpy", "pillow", "pychaosvm"]
@@ -1,4 +1,3 @@
1
- import asyncio
2
1
  import base64
3
2
  import json
4
3
  import logging
@@ -8,7 +7,7 @@ from random import random
8
7
  from time import time
9
8
 
10
9
  from pydantic import ValidationError
11
- from tenacity import retry, retry_if_exception_type, stop_after_attempt
10
+ from tenacity import after_log, retry, retry_if_exception_type, retry_if_result, stop_after_attempt
12
11
 
13
12
  from ...utils.net import ClientAdapter
14
13
  from .._model import VerifyResp
@@ -125,6 +124,11 @@ class Captcha:
125
124
  prehandle = new
126
125
  """alias of :meth:`.new`"""
127
126
 
127
+ @retry(
128
+ stop=stop_after_attempt(2),
129
+ retry=retry_if_result(lambda rst: not rst.ticket),
130
+ after=after_log(log, logging.WARNING),
131
+ )
128
132
  async def verify(self):
129
133
  """
130
134
  :raise NotImplementedError: cannot solve captcha
@@ -6,6 +6,7 @@ from contextlib import suppress
6
6
  from random import choice, random
7
7
  from time import time_ns
8
8
 
9
+ from tenacity import RetryError
9
10
  from yarl import URL
10
11
 
11
12
  import qqqr.message as MT
@@ -325,12 +326,9 @@ class UpWebLogin(_UpHookMixin, LoginBase[UpWebSession]):
325
326
  if solver is None:
326
327
  return
327
328
 
328
- for retry in range(4):
329
+ try:
329
330
  sess.verify_rst = await solver.verify()
330
- if sess.verify_rst.ticket:
331
- break
332
- log.warning(f"ticket is empty. retry={retry}")
333
- else:
331
+ except RetryError as e:
334
332
  from qqqr.constant import captcha_status_description
335
333
 
336
334
  r = sess.verify_rst
@@ -339,7 +337,7 @@ class UpWebLogin(_UpHookMixin, LoginBase[UpWebSession]):
339
337
  StatusCode.NeedCaptcha,
340
338
  captcha_status_description.get(r.code, r.errMessage),
341
339
  subcode=r.code,
342
- )
340
+ ) from e.last_attempt.result()
343
341
 
344
342
  log.info("verify success!")
345
343
  return sess
@@ -1,8 +1,7 @@
1
1
  import ast
2
- import json
3
2
  import logging
4
3
  from textwrap import dedent
5
- from typing import Callable, Dict, List, Union
4
+ from typing import Dict, List, Union
6
5
 
7
6
  logger = logging.getLogger(__name__)
8
7
  JsonDict = Dict[Union[str, int], "JsonValue"]
File without changes
File without changes