aioqzone 1.9.4.dev7__tar.gz → 1.9.4.dev8__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 (137) hide show
  1. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/PKG-INFO +1 -1
  2. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/pyproject.toml +2 -2
  3. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/src/aioqzone/api/login/__init__.py +15 -0
  4. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/src/aioqzone/api/login/_base.py +5 -2
  5. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/src/qqqr/constant.py +2 -1
  6. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/src/qqqr/utils/net.py +10 -1
  7. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/test/api/test_loginman.py +16 -1
  8. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/uv.lock +2 -2
  9. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/.github/dependabot.yml +0 -0
  10. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/.github/workflows/auto-pr.yml +0 -0
  11. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/.github/workflows/build.yml +0 -0
  12. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/.github/workflows/codeql-analysis.yml +0 -0
  13. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/.github/workflows/sphinx.yml +0 -0
  14. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/.github/workflows/test.yml +0 -0
  15. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/.gitignore +0 -0
  16. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/.pre-commit-config.yaml +0 -0
  17. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/CONTRIBUTING.md +0 -0
  18. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/LICENSE +0 -0
  19. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/README.md +0 -0
  20. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/README_en.md +0 -0
  21. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/cliff.toml +0 -0
  22. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/doc/source/_static/penguin-blob.webp +0 -0
  23. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/doc/source/_static/teaencoder.ts +0 -0
  24. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/doc/source/aioqzone/api/h5.rst +0 -0
  25. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/doc/source/aioqzone/api/index.rst +0 -0
  26. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/doc/source/aioqzone/api/login.rst +0 -0
  27. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/doc/source/aioqzone/exception.rst +0 -0
  28. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/doc/source/aioqzone/index.rst +0 -0
  29. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/doc/source/aioqzone/messages.rst +0 -0
  30. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/doc/source/aioqzone/model/api.rst +0 -0
  31. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/doc/source/aioqzone/model/index.rst +0 -0
  32. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/doc/source/aioqzone/model/protocol.rst +0 -0
  33. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/doc/source/aioqzone/reference.rst +0 -0
  34. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/doc/source/conf.py +0 -0
  35. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/doc/source/disclaimers.rst +0 -0
  36. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/doc/source/index.rst +0 -0
  37. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/doc/source/locale/zh_CN/LC_MESSAGES/aioqzone/api/h5.po +0 -0
  38. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/doc/source/locale/zh_CN/LC_MESSAGES/aioqzone/api/index.po +0 -0
  39. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/doc/source/locale/zh_CN/LC_MESSAGES/aioqzone/api/login.po +0 -0
  40. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/doc/source/locale/zh_CN/LC_MESSAGES/aioqzone/api/web.po +0 -0
  41. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/doc/source/locale/zh_CN/LC_MESSAGES/aioqzone/exception.po +0 -0
  42. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/doc/source/locale/zh_CN/LC_MESSAGES/aioqzone/index.po +0 -0
  43. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/doc/source/locale/zh_CN/LC_MESSAGES/aioqzone/messages.po +0 -0
  44. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/doc/source/locale/zh_CN/LC_MESSAGES/aioqzone/model/api.po +0 -0
  45. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/doc/source/locale/zh_CN/LC_MESSAGES/aioqzone/model/index.po +0 -0
  46. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/doc/source/locale/zh_CN/LC_MESSAGES/aioqzone/model/protocol.po +0 -0
  47. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/doc/source/locale/zh_CN/LC_MESSAGES/aioqzone/model/response.po +0 -0
  48. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/doc/source/locale/zh_CN/LC_MESSAGES/aioqzone/reference.po +0 -0
  49. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/doc/source/locale/zh_CN/LC_MESSAGES/disclaimers.po +0 -0
  50. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/doc/source/locale/zh_CN/LC_MESSAGES/index.po +0 -0
  51. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/doc/source/locale/zh_CN/LC_MESSAGES/qqqr/base.po +0 -0
  52. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/doc/source/locale/zh_CN/LC_MESSAGES/qqqr/exception.po +0 -0
  53. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/doc/source/locale/zh_CN/LC_MESSAGES/qqqr/index.po +0 -0
  54. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/doc/source/locale/zh_CN/LC_MESSAGES/qqqr/jsjson.po +0 -0
  55. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/doc/source/locale/zh_CN/LC_MESSAGES/qqqr/qr/index.po +0 -0
  56. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/doc/source/locale/zh_CN/LC_MESSAGES/qqqr/qr/login.po +0 -0
  57. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/doc/source/locale/zh_CN/LC_MESSAGES/qqqr/qr/type.po +0 -0
  58. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/doc/source/locale/zh_CN/LC_MESSAGES/qqqr/up/captcha/capsess.po +0 -0
  59. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/doc/source/locale/zh_CN/LC_MESSAGES/qqqr/up/captcha/captcha.po +0 -0
  60. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/doc/source/locale/zh_CN/LC_MESSAGES/qqqr/up/captcha/index.po +0 -0
  61. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/doc/source/locale/zh_CN/LC_MESSAGES/qqqr/up/captcha/jigsaw.po +0 -0
  62. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/doc/source/locale/zh_CN/LC_MESSAGES/qqqr/up/encrypt.po +0 -0
  63. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/doc/source/locale/zh_CN/LC_MESSAGES/qqqr/up/index.po +0 -0
  64. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/doc/source/locale/zh_CN/LC_MESSAGES/qqqr/up/login.po +0 -0
  65. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/doc/source/locale/zh_CN/LC_MESSAGES/qqqr/up/type.po +0 -0
  66. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/doc/source/locale/zh_CN/LC_MESSAGES/reference.po +0 -0
  67. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/doc/source/qqqr/base.rst +0 -0
  68. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/doc/source/qqqr/exception.rst +0 -0
  69. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/doc/source/qqqr/index.rst +0 -0
  70. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/doc/source/qqqr/jsjson.rst +0 -0
  71. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/doc/source/qqqr/qr/index.rst +0 -0
  72. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/doc/source/qqqr/qr/login.rst +0 -0
  73. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/doc/source/qqqr/qr/type.rst +0 -0
  74. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/doc/source/qqqr/up/captcha/capsess.rst +0 -0
  75. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/doc/source/qqqr/up/captcha/captcha.rst +0 -0
  76. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/doc/source/qqqr/up/captcha/index.rst +0 -0
  77. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/doc/source/qqqr/up/encrypt.rst +0 -0
  78. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/doc/source/qqqr/up/index.rst +0 -0
  79. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/doc/source/qqqr/up/login.rst +0 -0
  80. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/doc/source/qqqr/up/type.rst +0 -0
  81. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/src/aioqzone/__init__.py +0 -0
  82. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/src/aioqzone/api/__init__.py +0 -0
  83. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/src/aioqzone/api/h5/__init__.py +0 -0
  84. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/src/aioqzone/api/h5/model.py +0 -0
  85. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/src/aioqzone/exception.py +0 -0
  86. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/src/aioqzone/message.py +0 -0
  87. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/src/aioqzone/model/__init__.py +0 -0
  88. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/src/aioqzone/model/api/__init__.py +0 -0
  89. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/src/aioqzone/model/api/feed.py +0 -0
  90. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/src/aioqzone/model/api/profile.py +0 -0
  91. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/src/aioqzone/model/api/request.py +0 -0
  92. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/src/aioqzone/model/api/response.py +0 -0
  93. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/src/aioqzone/model/protocol/__init__.py +0 -0
  94. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/src/aioqzone/model/protocol/config.py +0 -0
  95. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/src/aioqzone/model/protocol/entity.py +0 -0
  96. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/src/aioqzone/utils/__init__.py +0 -0
  97. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/src/aioqzone/utils/entity.py +0 -0
  98. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/src/aioqzone/utils/regex.py +0 -0
  99. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/src/aioqzone/utils/retry.py +0 -0
  100. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/src/aioqzone/utils/time.py +0 -0
  101. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/src/qqqr/__init__.py +0 -0
  102. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/src/qqqr/base.py +0 -0
  103. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/src/qqqr/exception.py +0 -0
  104. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/src/qqqr/message.py +0 -0
  105. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/src/qqqr/py.typed +0 -0
  106. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/src/qqqr/qr/__init__.py +0 -0
  107. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/src/qqqr/qr/type.py +0 -0
  108. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/src/qqqr/type.py +0 -0
  109. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/src/qqqr/up/__init__.py +0 -0
  110. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/src/qqqr/up/_model.py +0 -0
  111. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/src/qqqr/up/captcha/__init__.py +0 -0
  112. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/src/qqqr/up/captcha/_model.py +0 -0
  113. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/src/qqqr/up/captcha/capsess.py +0 -0
  114. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/src/qqqr/up/captcha/click/__init__.py +0 -0
  115. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/src/qqqr/up/captcha/click/_types.py +0 -0
  116. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/src/qqqr/up/captcha/pil_utils.py +0 -0
  117. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/src/qqqr/up/captcha/select/__init__.py +0 -0
  118. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/src/qqqr/up/captcha/select/_types.py +0 -0
  119. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/src/qqqr/up/captcha/slide/__init__.py +0 -0
  120. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/src/qqqr/up/captcha/slide/_types.py +0 -0
  121. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/src/qqqr/up/encrypt.py +0 -0
  122. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/src/qqqr/up/h5.py +0 -0
  123. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/src/qqqr/up/web.py +0 -0
  124. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/src/qqqr/utils/encrypt.py +0 -0
  125. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/src/qqqr/utils/iter.py +0 -0
  126. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/src/qqqr/utils/jsjson.py +0 -0
  127. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/test/api/__init__.py +0 -0
  128. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/test/api/conftest.py +0 -0
  129. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/test/api/test_h5.py +0 -0
  130. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/test/conftest.py +0 -0
  131. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/test/login_logic/__init__.py +0 -0
  132. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/test/login_logic/test_captcha.py +0 -0
  133. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/test/login_logic/test_qr.py +0 -0
  134. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/test/login_logic/test_up.py +0 -0
  135. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/test/utils/test_entity.py +0 -0
  136. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/test/utils/test_json.py +0 -0
  137. {aioqzone-1.9.4.dev7 → aioqzone-1.9.4.dev8}/test/utils/test_time.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: aioqzone
3
- Version: 1.9.4.dev7
3
+ Version: 1.9.4.dev8
4
4
  Summary: A Python wrapper for Qzone login and H5 APIs.
5
5
  Project-URL: Homepage, https://github.com/aioqzone/aioqzone
6
6
  Project-URL: Repository, https://github.com/aioqzone/aioqzone
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "aioqzone"
3
- version = "1.9.4.dev7"
3
+ version = "1.9.4.dev8"
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~=1.1.0"]
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.
@@ -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/116.0.0.0 Mobile 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/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 not "=;" in i:
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.dev6"
119
+ version = "1.9.4.dev8"
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 = "~=1.1.0" },
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