aioqzone 1.9.4.dev7__tar.gz → 1.9.4.dev9__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.9.4.dev7 → aioqzone-1.9.4.dev9}/PKG-INFO +1 -1
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/pyproject.toml +2 -2
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/src/aioqzone/api/login/__init__.py +15 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/src/aioqzone/api/login/_base.py +5 -2
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/src/aioqzone/model/api/feed.py +13 -8
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/src/qqqr/constant.py +2 -1
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/src/qqqr/utils/net.py +10 -1
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/test/api/test_loginman.py +16 -1
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/uv.lock +2 -2
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/.github/dependabot.yml +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/.github/workflows/auto-pr.yml +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/.github/workflows/build.yml +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/.github/workflows/codeql-analysis.yml +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/.github/workflows/sphinx.yml +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/.github/workflows/test.yml +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/.gitignore +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/.pre-commit-config.yaml +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/CONTRIBUTING.md +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/LICENSE +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/README.md +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/README_en.md +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/cliff.toml +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/doc/source/_static/penguin-blob.webp +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/doc/source/_static/teaencoder.ts +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/doc/source/aioqzone/api/h5.rst +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/doc/source/aioqzone/api/index.rst +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/doc/source/aioqzone/api/login.rst +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/doc/source/aioqzone/exception.rst +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/doc/source/aioqzone/index.rst +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/doc/source/aioqzone/messages.rst +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/doc/source/aioqzone/model/api.rst +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/doc/source/aioqzone/model/index.rst +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/doc/source/aioqzone/model/protocol.rst +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/doc/source/aioqzone/reference.rst +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/doc/source/conf.py +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/doc/source/disclaimers.rst +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/doc/source/index.rst +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/doc/source/locale/zh_CN/LC_MESSAGES/aioqzone/api/h5.po +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/doc/source/locale/zh_CN/LC_MESSAGES/aioqzone/api/index.po +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/doc/source/locale/zh_CN/LC_MESSAGES/aioqzone/api/login.po +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/doc/source/locale/zh_CN/LC_MESSAGES/aioqzone/api/web.po +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/doc/source/locale/zh_CN/LC_MESSAGES/aioqzone/exception.po +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/doc/source/locale/zh_CN/LC_MESSAGES/aioqzone/index.po +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/doc/source/locale/zh_CN/LC_MESSAGES/aioqzone/messages.po +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/doc/source/locale/zh_CN/LC_MESSAGES/aioqzone/model/api.po +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/doc/source/locale/zh_CN/LC_MESSAGES/aioqzone/model/index.po +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/doc/source/locale/zh_CN/LC_MESSAGES/aioqzone/model/protocol.po +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/doc/source/locale/zh_CN/LC_MESSAGES/aioqzone/model/response.po +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/doc/source/locale/zh_CN/LC_MESSAGES/aioqzone/reference.po +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/doc/source/locale/zh_CN/LC_MESSAGES/disclaimers.po +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/doc/source/locale/zh_CN/LC_MESSAGES/index.po +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/doc/source/locale/zh_CN/LC_MESSAGES/qqqr/base.po +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/doc/source/locale/zh_CN/LC_MESSAGES/qqqr/exception.po +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/doc/source/locale/zh_CN/LC_MESSAGES/qqqr/index.po +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/doc/source/locale/zh_CN/LC_MESSAGES/qqqr/jsjson.po +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/doc/source/locale/zh_CN/LC_MESSAGES/qqqr/qr/index.po +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/doc/source/locale/zh_CN/LC_MESSAGES/qqqr/qr/login.po +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/doc/source/locale/zh_CN/LC_MESSAGES/qqqr/qr/type.po +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/doc/source/locale/zh_CN/LC_MESSAGES/qqqr/up/captcha/capsess.po +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/doc/source/locale/zh_CN/LC_MESSAGES/qqqr/up/captcha/captcha.po +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/doc/source/locale/zh_CN/LC_MESSAGES/qqqr/up/captcha/index.po +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/doc/source/locale/zh_CN/LC_MESSAGES/qqqr/up/captcha/jigsaw.po +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/doc/source/locale/zh_CN/LC_MESSAGES/qqqr/up/encrypt.po +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/doc/source/locale/zh_CN/LC_MESSAGES/qqqr/up/index.po +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/doc/source/locale/zh_CN/LC_MESSAGES/qqqr/up/login.po +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/doc/source/locale/zh_CN/LC_MESSAGES/qqqr/up/type.po +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/doc/source/locale/zh_CN/LC_MESSAGES/reference.po +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/doc/source/qqqr/base.rst +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/doc/source/qqqr/exception.rst +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/doc/source/qqqr/index.rst +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/doc/source/qqqr/jsjson.rst +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/doc/source/qqqr/qr/index.rst +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/doc/source/qqqr/qr/login.rst +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/doc/source/qqqr/qr/type.rst +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/doc/source/qqqr/up/captcha/capsess.rst +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/doc/source/qqqr/up/captcha/captcha.rst +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/doc/source/qqqr/up/captcha/index.rst +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/doc/source/qqqr/up/encrypt.rst +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/doc/source/qqqr/up/index.rst +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/doc/source/qqqr/up/login.rst +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/doc/source/qqqr/up/type.rst +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/src/aioqzone/__init__.py +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/src/aioqzone/api/__init__.py +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/src/aioqzone/api/h5/__init__.py +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/src/aioqzone/api/h5/model.py +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/src/aioqzone/exception.py +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/src/aioqzone/message.py +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/src/aioqzone/model/__init__.py +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/src/aioqzone/model/api/__init__.py +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/src/aioqzone/model/api/profile.py +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/src/aioqzone/model/api/request.py +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/src/aioqzone/model/api/response.py +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/src/aioqzone/model/protocol/__init__.py +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/src/aioqzone/model/protocol/config.py +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/src/aioqzone/model/protocol/entity.py +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/src/aioqzone/utils/__init__.py +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/src/aioqzone/utils/entity.py +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/src/aioqzone/utils/regex.py +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/src/aioqzone/utils/retry.py +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/src/aioqzone/utils/time.py +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/src/qqqr/__init__.py +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/src/qqqr/base.py +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/src/qqqr/exception.py +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/src/qqqr/message.py +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/src/qqqr/py.typed +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/src/qqqr/qr/__init__.py +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/src/qqqr/qr/type.py +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/src/qqqr/type.py +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/src/qqqr/up/__init__.py +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/src/qqqr/up/_model.py +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/src/qqqr/up/captcha/__init__.py +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/src/qqqr/up/captcha/_model.py +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/src/qqqr/up/captcha/capsess.py +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/src/qqqr/up/captcha/click/__init__.py +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/src/qqqr/up/captcha/click/_types.py +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/src/qqqr/up/captcha/pil_utils.py +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/src/qqqr/up/captcha/select/__init__.py +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/src/qqqr/up/captcha/select/_types.py +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/src/qqqr/up/captcha/slide/__init__.py +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/src/qqqr/up/captcha/slide/_types.py +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/src/qqqr/up/encrypt.py +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/src/qqqr/up/h5.py +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/src/qqqr/up/web.py +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/src/qqqr/utils/encrypt.py +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/src/qqqr/utils/iter.py +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/src/qqqr/utils/jsjson.py +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/test/api/__init__.py +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/test/api/conftest.py +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/test/api/test_h5.py +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/test/conftest.py +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/test/login_logic/__init__.py +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/test/login_logic/test_captcha.py +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/test/login_logic/test_qr.py +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/test/login_logic/test_up.py +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/test/utils/test_entity.py +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/test/utils/test_json.py +0 -0
- {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/test/utils/test_time.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "aioqzone"
|
|
3
|
-
version = "1.9.4.
|
|
3
|
+
version = "1.9.4.dev9"
|
|
4
4
|
description = "A Python wrapper for Qzone login and H5 APIs."
|
|
5
5
|
authors = [{ name = "aioqzone" }]
|
|
6
6
|
maintainers = [
|
|
@@ -37,7 +37,7 @@ Documentation = "https://aioqzone.github.io/aioqzone"
|
|
|
37
37
|
"Discussion" = "https://t.me/aioqzone_chatroom"
|
|
38
38
|
|
|
39
39
|
[dependency-groups]
|
|
40
|
-
test = ["pytest>=8.2.0", "pytest-asyncio
|
|
40
|
+
test = ["pytest>=8.2.0", "pytest-asyncio>=1.1,<1.3"]
|
|
41
41
|
dev = ["pre-commit", "ruff"]
|
|
42
42
|
doc = [
|
|
43
43
|
"Sphinx>=7.0.1; python_version>='3.9' and python_version<'3.11'",
|
|
@@ -10,6 +10,7 @@ import typing as t
|
|
|
10
10
|
from aiohttp import ClientError
|
|
11
11
|
from tenacity import TryAgain, retry, retry_if_exception_type, stop_after_attempt, wait_exponential
|
|
12
12
|
from tylisten import FutureStore
|
|
13
|
+
from typing_extensions import Self
|
|
13
14
|
|
|
14
15
|
from aioqzone.exception import UnexpectedLoginError
|
|
15
16
|
from aioqzone.model import QrLoginConfig, UpLoginConfig
|
|
@@ -30,6 +31,7 @@ __all__ = [
|
|
|
30
31
|
]
|
|
31
32
|
|
|
32
33
|
|
|
34
|
+
@t.final
|
|
33
35
|
class ConstLoginMan(Loginable):
|
|
34
36
|
"""A basic login manager which uses external provided cookie."""
|
|
35
37
|
|
|
@@ -46,6 +48,19 @@ class ConstLoginMan(Loginable):
|
|
|
46
48
|
async def _new_cookie(self) -> t.Dict[str, str]:
|
|
47
49
|
return self.cookie
|
|
48
50
|
|
|
51
|
+
@classmethod
|
|
52
|
+
def from_loginable(cls, loginable: Loginable) -> Self:
|
|
53
|
+
"""Create a :class:`.ConstLoginMan` from another :class:`.Loginable` instance.
|
|
54
|
+
|
|
55
|
+
:param loginable: any :class:`.Loginable` instance
|
|
56
|
+
:return: a :class:`.ConstLoginMan` instance
|
|
57
|
+
|
|
58
|
+
.. versionadded:: 1.9.4.dev8
|
|
59
|
+
"""
|
|
60
|
+
return cls(
|
|
61
|
+
loginable.uin, cookie=loginable.cookie, ch_login_notify=loginable.ch_login_notify
|
|
62
|
+
)
|
|
63
|
+
|
|
49
64
|
|
|
50
65
|
class UpLoginManager(Loginable):
|
|
51
66
|
def __init__(
|
|
@@ -14,12 +14,15 @@ class Loginable(ABC):
|
|
|
14
14
|
|
|
15
15
|
last_login: float = 0
|
|
16
16
|
"""Last login time stamp. 0 represents no login since created."""
|
|
17
|
+
cookie: Dict[str, str]
|
|
18
|
+
"""Cached cookie."""
|
|
19
|
+
ch_login_notify: FutureStore
|
|
20
|
+
"""Future Store for emit login events."""
|
|
17
21
|
|
|
18
22
|
def __init__(self, uin: int, ch_login_notify: Optional[FutureStore] = None) -> None:
|
|
19
23
|
super().__init__()
|
|
20
24
|
self.uin = uin
|
|
21
25
|
self.cookie: Dict[str, str] = {}
|
|
22
|
-
"""Cached cookie."""
|
|
23
26
|
self.lock = asyncio.Lock()
|
|
24
27
|
self.ch_login_notify = ch_login_notify or FutureStore()
|
|
25
28
|
|
|
@@ -33,7 +36,7 @@ class Loginable(ABC):
|
|
|
33
36
|
:meta public:
|
|
34
37
|
:return: cookie dict
|
|
35
38
|
"""
|
|
36
|
-
return
|
|
39
|
+
return {}
|
|
37
40
|
|
|
38
41
|
async def new_cookie(self) -> bool:
|
|
39
42
|
"""Get a new cookie dict, which means cached cookie is not allowed.
|
|
@@ -29,21 +29,24 @@ class RightInfo(BaseModel):
|
|
|
29
29
|
allow_uins: t.List = Field(default_factory=list)
|
|
30
30
|
|
|
31
31
|
|
|
32
|
-
class
|
|
32
|
+
class ContentCommon(BaseModel):
|
|
33
33
|
time: int
|
|
34
34
|
appid: int
|
|
35
35
|
typeid: int = Field(alias="feedstype")
|
|
36
36
|
curkey: t.Union[HttpUrl, str] = Field(alias="curlikekey", union_mode="left_to_right")
|
|
37
37
|
orgkey: t.Union[HttpUrl, str] = Field(alias="orglikekey", union_mode="left_to_right")
|
|
38
|
+
|
|
39
|
+
subid: int = 0
|
|
40
|
+
originaltype: int = 0
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
class FeedCommon(ContentCommon):
|
|
38
44
|
ugckey: str
|
|
39
45
|
"""an underscore-joined string including `uin`, `appid`, `ugcrightkey`"""
|
|
40
46
|
ugcrightkey: str
|
|
41
47
|
"""an identifier, for most 311 feeds, it equals to cellid (fid)."""
|
|
42
|
-
right_info: RightInfo
|
|
43
|
-
wup_feeds_type: int
|
|
44
|
-
|
|
45
|
-
subid: int = 0
|
|
46
|
-
originaltype: int = 0
|
|
48
|
+
right_info: RightInfo = Field(default_factory=RightInfo)
|
|
49
|
+
wup_feeds_type: int = 0
|
|
47
50
|
|
|
48
51
|
|
|
49
52
|
class UserInfo(BaseModel):
|
|
@@ -224,8 +227,10 @@ class ShareInfo(BaseModel):
|
|
|
224
227
|
# return v
|
|
225
228
|
|
|
226
229
|
|
|
227
|
-
class Share(
|
|
228
|
-
common: FeedCommon = Field(
|
|
230
|
+
class Share(BaseModel):
|
|
231
|
+
common: t.Union[FeedCommon, ContentCommon] = Field(
|
|
232
|
+
validation_alias="cell_comm", union_mode="left_to_right"
|
|
233
|
+
)
|
|
229
234
|
|
|
230
235
|
|
|
231
236
|
class FeedOriginal(HasFid, HasCommon, HasUserInfo, HasSummary, HasMedia):
|
|
@@ -7,7 +7,8 @@ from enum import IntEnum
|
|
|
7
7
|
from .type import APPID, Proxy
|
|
8
8
|
|
|
9
9
|
UA = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0"
|
|
10
|
-
AndroidUA = "Mozilla/5.0 (Linux; Android 13; SM-G981B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/
|
|
10
|
+
AndroidUA = "Mozilla/5.0 (Linux; Android 13; SM-G981B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Mobile Safari/537.36 Edg/140.0.0.0"
|
|
11
|
+
IOS_UA = "Mozilla/5.0 (iPhone; CPU iPhone OS 18_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.5 Mobile/15E148 Safari/604.1 Edg/140.0.0.0"
|
|
11
12
|
|
|
12
13
|
QzoneProxy = Proxy(
|
|
13
14
|
"https://qzs.qzone.qq.com/qzone/v5/loginsucc.html?para=izone",
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
from http.cookies import SimpleCookie
|
|
2
|
+
from random import random
|
|
3
|
+
from secrets import token_hex
|
|
2
4
|
from typing import Dict
|
|
3
5
|
|
|
4
6
|
from aiohttp import ClientResponse as Response
|
|
@@ -33,7 +35,7 @@ def get_all_cookie(response: Response) -> Dict[str, str]:
|
|
|
33
35
|
"""An adapter to get all response cookies from a response object."""
|
|
34
36
|
cookies = SimpleCookie()
|
|
35
37
|
for i in response.headers.getall("Set-Cookie"):
|
|
36
|
-
if
|
|
38
|
+
if "=;" not in i:
|
|
37
39
|
cookies.load(i)
|
|
38
40
|
return {k: v.value for k, v in cookies.items() if v.value}
|
|
39
41
|
|
|
@@ -42,3 +44,10 @@ def use_mobile_ua(client: ClientAdapter):
|
|
|
42
44
|
from ..constant import AndroidUA
|
|
43
45
|
|
|
44
46
|
client.headers["User-Agent"] = AndroidUA
|
|
47
|
+
client.cookie_jar.update_cookies(
|
|
48
|
+
{
|
|
49
|
+
"_qimei_fingerprint": token_hex(32),
|
|
50
|
+
"_qimei_uuid42": token_hex(42),
|
|
51
|
+
"_qpsvr_localtk": f"{random():.16f}",
|
|
52
|
+
}
|
|
53
|
+
)
|
|
@@ -20,7 +20,6 @@ from qqqr.exception import TencentLoginError, UserBreak
|
|
|
20
20
|
from qqqr.utils.net import ClientAdapter
|
|
21
21
|
|
|
22
22
|
if TYPE_CHECKING:
|
|
23
|
-
from qqqr.utils.net import ClientAdapter
|
|
24
23
|
from test.conftest import test_env
|
|
25
24
|
|
|
26
25
|
pytestmark = pytest.mark.asyncio(loop_scope="module")
|
|
@@ -119,3 +118,19 @@ class TestQR:
|
|
|
119
118
|
assert qr.uin == pool[0]
|
|
120
119
|
assert qr.cookie
|
|
121
120
|
assert qr.gtk > 0
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
@skip_ci
|
|
124
|
+
async def test_const(client: ClientAdapter, qr: QrLoginManager):
|
|
125
|
+
from aioqzone.api.h5 import QzoneH5API
|
|
126
|
+
from aioqzone.api.login import ConstLoginMan
|
|
127
|
+
|
|
128
|
+
api = QzoneH5API(client, qr)
|
|
129
|
+
resp1 = await api.index()
|
|
130
|
+
assert resp1.qzonetoken
|
|
131
|
+
assert qr.cookie
|
|
132
|
+
api = QzoneH5API(client, ConstLoginMan.from_loginable(qr), retry_if_login_expire=False)
|
|
133
|
+
assert isinstance(api.login, ConstLoginMan)
|
|
134
|
+
assert api.login.cookie
|
|
135
|
+
resp2 = await api.index()
|
|
136
|
+
assert resp2.vFeeds
|
|
@@ -116,7 +116,7 @@ wheels = [
|
|
|
116
116
|
|
|
117
117
|
[[package]]
|
|
118
118
|
name = "aioqzone"
|
|
119
|
-
version = "1.9.4.
|
|
119
|
+
version = "1.9.4.dev9"
|
|
120
120
|
source = { editable = "." }
|
|
121
121
|
dependencies = [
|
|
122
122
|
{ name = "aiohttp" },
|
|
@@ -184,7 +184,7 @@ doc = [
|
|
|
184
184
|
]
|
|
185
185
|
test = [
|
|
186
186
|
{ name = "pytest", specifier = ">=8.2.0" },
|
|
187
|
-
{ name = "pytest-asyncio", specifier = "
|
|
187
|
+
{ name = "pytest-asyncio", specifier = ">=1.1,<1.3" },
|
|
188
188
|
]
|
|
189
189
|
|
|
190
190
|
[[package]]
|
|
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
|
{aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/doc/source/locale/zh_CN/LC_MESSAGES/aioqzone/api/h5.po
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/doc/source/locale/zh_CN/LC_MESSAGES/aioqzone/api/web.po
RENAMED
|
File without changes
|
|
File without changes
|
{aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/doc/source/locale/zh_CN/LC_MESSAGES/aioqzone/index.po
RENAMED
|
File without changes
|
{aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/doc/source/locale/zh_CN/LC_MESSAGES/aioqzone/messages.po
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/doc/source/locale/zh_CN/LC_MESSAGES/disclaimers.po
RENAMED
|
File without changes
|
|
File without changes
|
{aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/doc/source/locale/zh_CN/LC_MESSAGES/qqqr/base.po
RENAMED
|
File without changes
|
{aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/doc/source/locale/zh_CN/LC_MESSAGES/qqqr/exception.po
RENAMED
|
File without changes
|
{aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/doc/source/locale/zh_CN/LC_MESSAGES/qqqr/index.po
RENAMED
|
File without changes
|
{aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/doc/source/locale/zh_CN/LC_MESSAGES/qqqr/jsjson.po
RENAMED
|
File without changes
|
{aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/doc/source/locale/zh_CN/LC_MESSAGES/qqqr/qr/index.po
RENAMED
|
File without changes
|
{aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/doc/source/locale/zh_CN/LC_MESSAGES/qqqr/qr/login.po
RENAMED
|
File without changes
|
{aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/doc/source/locale/zh_CN/LC_MESSAGES/qqqr/qr/type.po
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/doc/source/locale/zh_CN/LC_MESSAGES/qqqr/up/encrypt.po
RENAMED
|
File without changes
|
{aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/doc/source/locale/zh_CN/LC_MESSAGES/qqqr/up/index.po
RENAMED
|
File without changes
|
{aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/doc/source/locale/zh_CN/LC_MESSAGES/qqqr/up/login.po
RENAMED
|
File without changes
|
{aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/doc/source/locale/zh_CN/LC_MESSAGES/qqqr/up/type.po
RENAMED
|
File without changes
|
{aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev9}/doc/source/locale/zh_CN/LC_MESSAGES/reference.po
RENAMED
|
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
|
|
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
|