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.
- {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/PKG-INFO +2 -2
- {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/pyproject.toml +2 -2
- {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/src/qqqr/up/captcha/__init__.py +6 -2
- {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/src/qqqr/up/web.py +4 -6
- {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/src/qqqr/utils/jsjson.py +1 -2
- {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/LICENSE +0 -0
- {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/README.md +0 -0
- {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/src/aioqzone/__init__.py +0 -0
- {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/src/aioqzone/api/__init__.py +0 -0
- {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/src/aioqzone/api/h5/__init__.py +0 -0
- {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/src/aioqzone/api/h5/model.py +0 -0
- {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/src/aioqzone/api/h5/raw.py +0 -0
- {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/src/aioqzone/api/login/__init__.py +0 -0
- {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/src/aioqzone/api/login/_base.py +0 -0
- {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/src/aioqzone/exception.py +0 -0
- {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/src/aioqzone/message.py +0 -0
- {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/src/aioqzone/model/__init__.py +0 -0
- {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/src/aioqzone/model/protocol/__init__.py +0 -0
- {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/src/aioqzone/model/protocol/config.py +0 -0
- {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/src/aioqzone/model/protocol/entity.py +0 -0
- {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/src/aioqzone/model/response/__init__.py +0 -0
- {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/src/aioqzone/model/response/h5.py +0 -0
- {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/src/aioqzone/utils/__init__.py +0 -0
- {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/src/aioqzone/utils/entity.py +0 -0
- {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/src/aioqzone/utils/regex.py +0 -0
- {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/src/aioqzone/utils/retry.py +0 -0
- {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/src/aioqzone/utils/time.py +0 -0
- {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/src/qqqr/__init__.py +0 -0
- {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/src/qqqr/base.py +0 -0
- {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/src/qqqr/constant.py +0 -0
- {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/src/qqqr/exception.py +0 -0
- {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/src/qqqr/message.py +0 -0
- {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/src/qqqr/py.typed +0 -0
- {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/src/qqqr/qr/__init__.py +0 -0
- {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/src/qqqr/qr/type.py +0 -0
- {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/src/qqqr/type.py +0 -0
- {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/src/qqqr/up/__init__.py +0 -0
- {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/src/qqqr/up/_model.py +0 -0
- {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/src/qqqr/up/captcha/_model.py +0 -0
- {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/src/qqqr/up/captcha/capsess.py +0 -0
- {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/src/qqqr/up/captcha/img_utils.py +0 -0
- {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/src/qqqr/up/captcha/select/__init__.py +0 -0
- {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/src/qqqr/up/captcha/select/_types.py +0 -0
- {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/src/qqqr/up/captcha/slide/__init__.py +0 -0
- {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/src/qqqr/up/captcha/slide/_types.py +0 -0
- {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/src/qqqr/up/captcha/slide/jigsaw.py +0 -0
- {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/src/qqqr/up/encrypt.py +0 -0
- {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/src/qqqr/up/h5.py +0 -0
- {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/src/qqqr/utils/encrypt.py +0 -0
- {aioqzone-1.4.2.dev2 → aioqzone-1.4.2.dev5}/src/qqqr/utils/iter.py +0 -0
- {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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
329
|
+
try:
|
|
329
330
|
sess.verify_rst = await solver.verify()
|
|
330
|
-
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|