aioqzone 1.9.5.dev6__tar.gz → 1.9.6.dev2__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 (139) hide show
  1. {aioqzone-1.9.5.dev6 → aioqzone-1.9.6.dev2}/PKG-INFO +17 -17
  2. {aioqzone-1.9.5.dev6 → aioqzone-1.9.6.dev2}/pyproject.toml +15 -16
  3. {aioqzone-1.9.5.dev6 → aioqzone-1.9.6.dev2}/src/aioqzone/api/h5/model.py +12 -0
  4. {aioqzone-1.9.5.dev6 → aioqzone-1.9.6.dev2}/src/aioqzone/model/api/__init__.py +7 -0
  5. {aioqzone-1.9.5.dev6 → aioqzone-1.9.6.dev2}/src/aioqzone/model/api/request.py +13 -1
  6. {aioqzone-1.9.5.dev6 → aioqzone-1.9.6.dev2}/src/aioqzone/model/api/response.py +5 -5
  7. aioqzone-1.9.5.dev6/.github/dependabot.yml +0 -13
  8. aioqzone-1.9.5.dev6/.github/workflows/auto-pr.yml +0 -37
  9. aioqzone-1.9.5.dev6/.github/workflows/build.yml +0 -36
  10. aioqzone-1.9.5.dev6/.github/workflows/codeql-analysis.yml +0 -59
  11. aioqzone-1.9.5.dev6/.github/workflows/sphinx.yml +0 -72
  12. aioqzone-1.9.5.dev6/.github/workflows/test.yml +0 -52
  13. aioqzone-1.9.5.dev6/.gitignore +0 -28
  14. aioqzone-1.9.5.dev6/.pre-commit-config.yaml +0 -37
  15. aioqzone-1.9.5.dev6/CONTRIBUTING.md +0 -9
  16. aioqzone-1.9.5.dev6/LICENSE +0 -661
  17. aioqzone-1.9.5.dev6/README_en.md +0 -86
  18. aioqzone-1.9.5.dev6/cliff.toml +0 -59
  19. aioqzone-1.9.5.dev6/doc/source/_static/penguin-blob.webp +0 -0
  20. aioqzone-1.9.5.dev6/doc/source/_static/teaencoder.ts +0 -145
  21. aioqzone-1.9.5.dev6/doc/source/aioqzone/api/h5.rst +0 -5
  22. aioqzone-1.9.5.dev6/doc/source/aioqzone/api/index.rst +0 -8
  23. aioqzone-1.9.5.dev6/doc/source/aioqzone/api/login.rst +0 -16
  24. aioqzone-1.9.5.dev6/doc/source/aioqzone/exception.rst +0 -6
  25. aioqzone-1.9.5.dev6/doc/source/aioqzone/index.rst +0 -12
  26. aioqzone-1.9.5.dev6/doc/source/aioqzone/messages.rst +0 -30
  27. aioqzone-1.9.5.dev6/doc/source/aioqzone/model/api.rst +0 -23
  28. aioqzone-1.9.5.dev6/doc/source/aioqzone/model/index.rst +0 -8
  29. aioqzone-1.9.5.dev6/doc/source/aioqzone/model/protocol.rst +0 -26
  30. aioqzone-1.9.5.dev6/doc/source/aioqzone/reference.rst +0 -29
  31. aioqzone-1.9.5.dev6/doc/source/conf.py +0 -81
  32. aioqzone-1.9.5.dev6/doc/source/disclaimers.rst +0 -49
  33. aioqzone-1.9.5.dev6/doc/source/examples.rst +0 -327
  34. aioqzone-1.9.5.dev6/doc/source/index.rst +0 -38
  35. aioqzone-1.9.5.dev6/doc/source/locale/zh_CN/LC_MESSAGES/aioqzone/api/h5.po +0 -349
  36. aioqzone-1.9.5.dev6/doc/source/locale/zh_CN/LC_MESSAGES/aioqzone/api/index.po +0 -22
  37. aioqzone-1.9.5.dev6/doc/source/locale/zh_CN/LC_MESSAGES/aioqzone/api/login.po +0 -250
  38. aioqzone-1.9.5.dev6/doc/source/locale/zh_CN/LC_MESSAGES/aioqzone/api/web.po +0 -488
  39. aioqzone-1.9.5.dev6/doc/source/locale/zh_CN/LC_MESSAGES/aioqzone/exception.po +0 -52
  40. aioqzone-1.9.5.dev6/doc/source/locale/zh_CN/LC_MESSAGES/aioqzone/index.po +0 -22
  41. aioqzone-1.9.5.dev6/doc/source/locale/zh_CN/LC_MESSAGES/aioqzone/messages.po +0 -226
  42. aioqzone-1.9.5.dev6/doc/source/locale/zh_CN/LC_MESSAGES/aioqzone/model/api.po +0 -1033
  43. aioqzone-1.9.5.dev6/doc/source/locale/zh_CN/LC_MESSAGES/aioqzone/model/index.po +0 -24
  44. aioqzone-1.9.5.dev6/doc/source/locale/zh_CN/LC_MESSAGES/aioqzone/model/protocol.po +0 -232
  45. aioqzone-1.9.5.dev6/doc/source/locale/zh_CN/LC_MESSAGES/aioqzone/model/response.po +0 -1023
  46. aioqzone-1.9.5.dev6/doc/source/locale/zh_CN/LC_MESSAGES/aioqzone/reference.po +0 -78
  47. aioqzone-1.9.5.dev6/doc/source/locale/zh_CN/LC_MESSAGES/disclaimers.po +0 -171
  48. aioqzone-1.9.5.dev6/doc/source/locale/zh_CN/LC_MESSAGES/examples.po +0 -232
  49. aioqzone-1.9.5.dev6/doc/source/locale/zh_CN/LC_MESSAGES/index.po +0 -74
  50. aioqzone-1.9.5.dev6/doc/source/locale/zh_CN/LC_MESSAGES/qqqr/base.po +0 -75
  51. aioqzone-1.9.5.dev6/doc/source/locale/zh_CN/LC_MESSAGES/qqqr/exception.po +0 -78
  52. aioqzone-1.9.5.dev6/doc/source/locale/zh_CN/LC_MESSAGES/qqqr/index.po +0 -61
  53. aioqzone-1.9.5.dev6/doc/source/locale/zh_CN/LC_MESSAGES/qqqr/jsjson.po +0 -157
  54. aioqzone-1.9.5.dev6/doc/source/locale/zh_CN/LC_MESSAGES/qqqr/qr/index.po +0 -22
  55. aioqzone-1.9.5.dev6/doc/source/locale/zh_CN/LC_MESSAGES/qqqr/qr/login.po +0 -257
  56. aioqzone-1.9.5.dev6/doc/source/locale/zh_CN/LC_MESSAGES/qqqr/qr/type.po +0 -73
  57. aioqzone-1.9.5.dev6/doc/source/locale/zh_CN/LC_MESSAGES/qqqr/up/captcha/capsess.po +0 -32
  58. aioqzone-1.9.5.dev6/doc/source/locale/zh_CN/LC_MESSAGES/qqqr/up/captcha/captcha.po +0 -166
  59. aioqzone-1.9.5.dev6/doc/source/locale/zh_CN/LC_MESSAGES/qqqr/up/captcha/index.po +0 -108
  60. aioqzone-1.9.5.dev6/doc/source/locale/zh_CN/LC_MESSAGES/qqqr/up/captcha/jigsaw.po +0 -204
  61. aioqzone-1.9.5.dev6/doc/source/locale/zh_CN/LC_MESSAGES/qqqr/up/encrypt.po +0 -43
  62. aioqzone-1.9.5.dev6/doc/source/locale/zh_CN/LC_MESSAGES/qqqr/up/index.po +0 -26
  63. aioqzone-1.9.5.dev6/doc/source/locale/zh_CN/LC_MESSAGES/qqqr/up/login.po +0 -101
  64. aioqzone-1.9.5.dev6/doc/source/locale/zh_CN/LC_MESSAGES/qqqr/up/type.po +0 -453
  65. aioqzone-1.9.5.dev6/doc/source/locale/zh_CN/LC_MESSAGES/reference.po +0 -77
  66. aioqzone-1.9.5.dev6/doc/source/qqqr/base.rst +0 -7
  67. aioqzone-1.9.5.dev6/doc/source/qqqr/exception.rst +0 -6
  68. aioqzone-1.9.5.dev6/doc/source/qqqr/index.rst +0 -46
  69. aioqzone-1.9.5.dev6/doc/source/qqqr/jsjson.rst +0 -7
  70. aioqzone-1.9.5.dev6/doc/source/qqqr/qr/index.rst +0 -8
  71. aioqzone-1.9.5.dev6/doc/source/qqqr/qr/login.rst +0 -14
  72. aioqzone-1.9.5.dev6/doc/source/qqqr/qr/type.rst +0 -8
  73. aioqzone-1.9.5.dev6/doc/source/qqqr/up/captcha/capsess.rst +0 -14
  74. aioqzone-1.9.5.dev6/doc/source/qqqr/up/captcha/captcha.rst +0 -10
  75. aioqzone-1.9.5.dev6/doc/source/qqqr/up/captcha/index.rst +0 -69
  76. aioqzone-1.9.5.dev6/doc/source/qqqr/up/encrypt.rst +0 -5
  77. aioqzone-1.9.5.dev6/doc/source/qqqr/up/index.rst +0 -19
  78. aioqzone-1.9.5.dev6/doc/source/qqqr/up/login.rst +0 -12
  79. aioqzone-1.9.5.dev6/doc/source/qqqr/up/type.rst +0 -8
  80. aioqzone-1.9.5.dev6/test/api/__init__.py +0 -0
  81. aioqzone-1.9.5.dev6/test/api/conftest.py +0 -55
  82. aioqzone-1.9.5.dev6/test/api/test_h5.py +0 -134
  83. aioqzone-1.9.5.dev6/test/api/test_loginman.py +0 -136
  84. aioqzone-1.9.5.dev6/test/conftest.py +0 -30
  85. aioqzone-1.9.5.dev6/test/login_logic/__init__.py +0 -0
  86. aioqzone-1.9.5.dev6/test/login_logic/test_captcha.py +0 -108
  87. aioqzone-1.9.5.dev6/test/login_logic/test_qr.py +0 -83
  88. aioqzone-1.9.5.dev6/test/login_logic/test_up.py +0 -102
  89. aioqzone-1.9.5.dev6/test/utils/test_entity.py +0 -37
  90. aioqzone-1.9.5.dev6/test/utils/test_json.py +0 -35
  91. aioqzone-1.9.5.dev6/test/utils/test_time.py +0 -11
  92. aioqzone-1.9.5.dev6/uv.lock +0 -2032
  93. {aioqzone-1.9.5.dev6 → aioqzone-1.9.6.dev2}/README.md +0 -0
  94. {aioqzone-1.9.5.dev6 → aioqzone-1.9.6.dev2}/src/aioqzone/__init__.py +0 -0
  95. {aioqzone-1.9.5.dev6 → aioqzone-1.9.6.dev2}/src/aioqzone/api/__init__.py +0 -0
  96. {aioqzone-1.9.5.dev6 → aioqzone-1.9.6.dev2}/src/aioqzone/api/h5/__init__.py +0 -0
  97. {aioqzone-1.9.5.dev6 → aioqzone-1.9.6.dev2}/src/aioqzone/api/login/__init__.py +0 -0
  98. {aioqzone-1.9.5.dev6 → aioqzone-1.9.6.dev2}/src/aioqzone/api/login/_base.py +0 -0
  99. {aioqzone-1.9.5.dev6 → aioqzone-1.9.6.dev2}/src/aioqzone/exception.py +0 -0
  100. {aioqzone-1.9.5.dev6 → aioqzone-1.9.6.dev2}/src/aioqzone/message.py +0 -0
  101. {aioqzone-1.9.5.dev6 → aioqzone-1.9.6.dev2}/src/aioqzone/model/__init__.py +0 -0
  102. {aioqzone-1.9.5.dev6 → aioqzone-1.9.6.dev2}/src/aioqzone/model/api/feed.py +0 -0
  103. {aioqzone-1.9.5.dev6 → aioqzone-1.9.6.dev2}/src/aioqzone/model/api/profile.py +0 -0
  104. {aioqzone-1.9.5.dev6 → aioqzone-1.9.6.dev2}/src/aioqzone/model/protocol/__init__.py +0 -0
  105. {aioqzone-1.9.5.dev6 → aioqzone-1.9.6.dev2}/src/aioqzone/model/protocol/config.py +0 -0
  106. {aioqzone-1.9.5.dev6 → aioqzone-1.9.6.dev2}/src/aioqzone/model/protocol/entity.py +0 -0
  107. {aioqzone-1.9.5.dev6 → aioqzone-1.9.6.dev2}/src/aioqzone/utils/__init__.py +0 -0
  108. {aioqzone-1.9.5.dev6 → aioqzone-1.9.6.dev2}/src/aioqzone/utils/entity.py +0 -0
  109. {aioqzone-1.9.5.dev6 → aioqzone-1.9.6.dev2}/src/aioqzone/utils/regex.py +0 -0
  110. {aioqzone-1.9.5.dev6 → aioqzone-1.9.6.dev2}/src/aioqzone/utils/retry.py +0 -0
  111. {aioqzone-1.9.5.dev6 → aioqzone-1.9.6.dev2}/src/aioqzone/utils/time.py +0 -0
  112. {aioqzone-1.9.5.dev6 → aioqzone-1.9.6.dev2}/src/qqqr/__init__.py +0 -0
  113. {aioqzone-1.9.5.dev6 → aioqzone-1.9.6.dev2}/src/qqqr/base.py +0 -0
  114. {aioqzone-1.9.5.dev6 → aioqzone-1.9.6.dev2}/src/qqqr/constant.py +0 -0
  115. {aioqzone-1.9.5.dev6 → aioqzone-1.9.6.dev2}/src/qqqr/exception.py +0 -0
  116. {aioqzone-1.9.5.dev6 → aioqzone-1.9.6.dev2}/src/qqqr/message.py +0 -0
  117. {aioqzone-1.9.5.dev6 → aioqzone-1.9.6.dev2}/src/qqqr/py.typed +0 -0
  118. {aioqzone-1.9.5.dev6 → aioqzone-1.9.6.dev2}/src/qqqr/qr/__init__.py +0 -0
  119. {aioqzone-1.9.5.dev6 → aioqzone-1.9.6.dev2}/src/qqqr/qr/type.py +0 -0
  120. {aioqzone-1.9.5.dev6 → aioqzone-1.9.6.dev2}/src/qqqr/type.py +0 -0
  121. {aioqzone-1.9.5.dev6 → aioqzone-1.9.6.dev2}/src/qqqr/up/__init__.py +0 -0
  122. {aioqzone-1.9.5.dev6 → aioqzone-1.9.6.dev2}/src/qqqr/up/_model.py +0 -0
  123. {aioqzone-1.9.5.dev6 → aioqzone-1.9.6.dev2}/src/qqqr/up/captcha/__init__.py +0 -0
  124. {aioqzone-1.9.5.dev6 → aioqzone-1.9.6.dev2}/src/qqqr/up/captcha/_model.py +0 -0
  125. {aioqzone-1.9.5.dev6 → aioqzone-1.9.6.dev2}/src/qqqr/up/captcha/capsess.py +0 -0
  126. {aioqzone-1.9.5.dev6 → aioqzone-1.9.6.dev2}/src/qqqr/up/captcha/click/__init__.py +0 -0
  127. {aioqzone-1.9.5.dev6 → aioqzone-1.9.6.dev2}/src/qqqr/up/captcha/click/_types.py +0 -0
  128. {aioqzone-1.9.5.dev6 → aioqzone-1.9.6.dev2}/src/qqqr/up/captcha/pil_utils.py +0 -0
  129. {aioqzone-1.9.5.dev6 → aioqzone-1.9.6.dev2}/src/qqqr/up/captcha/select/__init__.py +0 -0
  130. {aioqzone-1.9.5.dev6 → aioqzone-1.9.6.dev2}/src/qqqr/up/captcha/select/_types.py +0 -0
  131. {aioqzone-1.9.5.dev6 → aioqzone-1.9.6.dev2}/src/qqqr/up/captcha/slide/__init__.py +0 -0
  132. {aioqzone-1.9.5.dev6 → aioqzone-1.9.6.dev2}/src/qqqr/up/captcha/slide/_types.py +0 -0
  133. {aioqzone-1.9.5.dev6 → aioqzone-1.9.6.dev2}/src/qqqr/up/encrypt.py +0 -0
  134. {aioqzone-1.9.5.dev6 → aioqzone-1.9.6.dev2}/src/qqqr/up/h5.py +0 -0
  135. {aioqzone-1.9.5.dev6 → aioqzone-1.9.6.dev2}/src/qqqr/up/web.py +0 -0
  136. {aioqzone-1.9.5.dev6 → aioqzone-1.9.6.dev2}/src/qqqr/utils/encrypt.py +0 -0
  137. {aioqzone-1.9.5.dev6 → aioqzone-1.9.6.dev2}/src/qqqr/utils/iter.py +0 -0
  138. {aioqzone-1.9.5.dev6 → aioqzone-1.9.6.dev2}/src/qqqr/utils/jsjson.py +0 -0
  139. {aioqzone-1.9.5.dev6 → aioqzone-1.9.6.dev2}/src/qqqr/utils/net.py +0 -0
@@ -1,32 +1,32 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: aioqzone
3
- Version: 1.9.5.dev6
3
+ Version: 1.9.6.dev2
4
4
  Summary: A Python wrapper for Qzone login and H5 APIs.
5
- Project-URL: Homepage, https://github.com/aioqzone/aioqzone
6
- Project-URL: Repository, https://github.com/aioqzone/aioqzone
7
- Project-URL: Documentation, https://aioqzone.github.io/aioqzone
8
- Project-URL: Bug Tracker, https://github.com/aioqzone/aioqzone/issues
9
- Project-URL: Discussion, https://t.me/aioqzone_chatroom
5
+ Keywords: qzone-api,autologin,asyncio-spider
10
6
  Author: aioqzone
11
- Maintainer-email: JamzumSum <22952836+JamzumSum@users.noreply.github.com>
12
- License-Expression: AGPL-3.0
13
- License-File: LICENSE
14
- Keywords: asyncio-spider,autologin,qzone-api
7
+ License-Expression: AGPL-3.0-or-later
15
8
  Classifier: Development Status :: 4 - Beta
16
9
  Classifier: Intended Audience :: Developers
17
10
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
18
11
  Classifier: Typing :: Typed
19
- Requires-Python: >=3.9
20
- Requires-Dist: aiohttp>=3.9.0
21
- Requires-Dist: pillow>=10.1.0
22
- Requires-Dist: pychaosvm~=0.4.3
12
+ Requires-Dist: aiohttp~=3.13
13
+ Requires-Dist: pydantic~=2.12
23
14
  Requires-Dist: pydantic-settings>=2.9.0
24
- Requires-Dist: pydantic>=2.11.4
25
15
  Requires-Dist: rsa>=4.9.1
26
- Requires-Dist: tenacity<10.0.0,>=8.2.3
16
+ Requires-Dist: tenacity>=8.2.3,<10.0.0
27
17
  Requires-Dist: tylisten>=2.2.1
18
+ Requires-Dist: pillow>=11.3.0
19
+ Requires-Dist: pychaosvm~=0.5.4
20
+ Requires-Dist: slide-tc~=0.1.4 ; extra == 'slide-captcha'
21
+ Maintainer: JamzumSum
22
+ Maintainer-email: JamzumSum <22952836+JamzumSum@users.noreply.github.com>
23
+ Requires-Python: >=3.10
24
+ Project-URL: Bug Tracker, https://github.com/aioqzone/aioqzone/issues
25
+ Project-URL: Discussion, https://t.me/aioqzone_chatroom
26
+ Project-URL: Documentation, https://aioqzone.github.io/aioqzone
27
+ Project-URL: Homepage, https://github.com/aioqzone/aioqzone
28
+ Project-URL: Repository, https://github.com/aioqzone/aioqzone
28
29
  Provides-Extra: slide-captcha
29
- Requires-Dist: slide-tc~=0.1.1; extra == 'slide-captcha'
30
30
  Description-Content-Type: text/markdown
31
31
 
32
32
  # aioqzone
@@ -1,14 +1,14 @@
1
1
  [project]
2
2
  name = "aioqzone"
3
- version = "1.9.5.dev6"
3
+ version = "1.9.6.dev2"
4
4
  description = "A Python wrapper for Qzone login and H5 APIs."
5
5
  authors = [{ name = "aioqzone" }]
6
6
  maintainers = [
7
7
  { name = "JamzumSum", email = "22952836+JamzumSum@users.noreply.github.com" },
8
8
  ]
9
- license = "AGPL-3.0"
9
+ license = "AGPL-3.0-or-later"
10
10
  readme = "README.md"
11
- requires-python = ">=3.9"
11
+ requires-python = ">=3.10"
12
12
  keywords = ["qzone-api", "autologin", "asyncio-spider"]
13
13
  classifiers = [
14
14
  "Development Status :: 4 - Beta",
@@ -18,15 +18,15 @@ classifiers = [
18
18
  ]
19
19
 
20
20
  dependencies = [
21
- "aiohttp>=3.9.0",
22
- "pydantic>=2.11.4",
21
+ "aiohttp~=3.13",
22
+ "pydantic~=2.12",
23
23
  "pydantic-settings>=2.9.0",
24
24
  "rsa>=4.9.1",
25
25
  "tenacity>=8.2.3,<10.0.0",
26
26
  # "exceptiongroup>=1.1.1",
27
27
  "tylisten>=2.2.1",
28
- "pillow>=10.1.0",
29
- "pychaosvm~=0.4.3",
28
+ "pillow>=11.3.0",
29
+ "pychaosvm~=0.5.4",
30
30
  ]
31
31
 
32
32
  [project.urls]
@@ -40,17 +40,17 @@ Documentation = "https://aioqzone.github.io/aioqzone"
40
40
  test = ["pytest>=8.2.0", "pytest-asyncio>=1.1,<1.3"]
41
41
  dev = ["pre-commit", "ruff"]
42
42
  doc = [
43
- "Sphinx>=7.0.1; python_version>='3.9' and python_version<'3.11'",
43
+ "Sphinx>=7.0.1; python_version=='3.10'",
44
44
  "Sphinx>=8.2.0; python_version>='3.11'",
45
45
  "autodoc-pydantic>=2.0.1",
46
- "sphinx-autodoc-typehints>=1.19.5",
46
+ "sphinx-autodoc-typehints~=2.5",
47
47
  "furo",
48
48
  "sphinx-intl",
49
49
  "sphinx-inline-tabs",
50
50
  ]
51
51
 
52
52
  [project.optional-dependencies]
53
- slide-captcha = ["slide-tc~=0.1.1"]
53
+ slide-captcha = ["slide-tc~=0.1.4"]
54
54
 
55
55
  [tool.uv]
56
56
  prerelease = "if-necessary-or-explicit"
@@ -64,12 +64,11 @@ name = "aioqzone-index"
64
64
  url = "https://aioqzone.github.io/aioqzone-index/simple/"
65
65
 
66
66
  [build-system]
67
- requires = ["hatchling"]
68
- build-backend = "hatchling.build"
67
+ requires = ["uv_build"]
68
+ build-backend = "uv_build"
69
69
 
70
- [tool.hatch.build.targets.wheel]
71
- skip-excluded-dirs = true
72
- packages = ["src/aioqzone", "src/qqqr"]
70
+ [tool.uv.build-backend]
71
+ module-name = ["aioqzone", "qqqr"]
73
72
 
74
73
  [tool.pytest.ini_options]
75
74
  pythonpath = "src"
@@ -87,6 +86,6 @@ ignore = [
87
86
  ]
88
87
 
89
88
  [tool.pyright]
90
- pythonVersion = "3.9"
89
+ pythonVersion = "3.10"
91
90
  pythonPlatform = "All"
92
91
  reportIncompatibleVariableOverride = "information"
@@ -356,3 +356,15 @@ class QzoneH5API:
356
356
  params=AvatarParams.model_validate(locals()),
357
357
  ),
358
358
  )
359
+
360
+ async def set_top_feed(self, fid: str, set_top: bool = True) -> None:
361
+ """Set or unset a feed to top.
362
+
363
+ :param fid: :term:`fid`
364
+ :param set_top: whether to set top, default to `True`
365
+ """
366
+ await self.call(
367
+ SetTopApi(
368
+ params=SetTopParams.model_validate(locals()),
369
+ )
370
+ )
@@ -146,3 +146,10 @@ class AvatarApi(QzoneApi[AvatarParams, AvatarResponse]):
146
146
  http_method: t.ClassVar[TyHttpMethod] = "GET"
147
147
  host: t.ClassVar[str] = "https://qlogo2.store.qq.com"
148
148
  path: t.ClassVar[str] = "/qzone/{hostuin}/{hostuin}/{size}"
149
+
150
+
151
+ class SetTopApi(QzoneApi[SetTopParams, SingleReturnResp]):
152
+ response: t.ClassVar = SingleReturnResp
153
+ http_method: t.ClassVar[TyHttpMethod] = "POST"
154
+ host: t.ClassVar[str] = "user.qzone.qq.com"
155
+ path: t.ClassVar[str] = "proxy/domain/ic2.qzone.qq.com/cgi-bin/feeds/cgi_settopfeed"
@@ -5,7 +5,7 @@ from math import floor
5
5
  from os import PathLike
6
6
  from time import time
7
7
 
8
- from pydantic import BaseModel, Field, HttpUrl, field_serializer, field_validator
8
+ from pydantic import BaseModel, Field, HttpUrl, field_serializer
9
9
  from typing_extensions import Buffer
10
10
 
11
11
  from aioqzone.utils.time import time_ms
@@ -31,6 +31,7 @@ __all__ = [
31
31
  "PhotosPreuploadParams",
32
32
  "UgcRight",
33
33
  "PhotoData",
34
+ "SetTopParams",
34
35
  ]
35
36
 
36
37
 
@@ -292,3 +293,14 @@ class PhotosPreuploadParams(QzoneRequestParams):
292
293
  class AvatarParams(QzoneRequestParams):
293
294
  hostuin: int
294
295
  size: t.Literal[100, 640] = 100
296
+
297
+
298
+ class SetTopParams(QzoneRequestParams):
299
+ fid: str = Field(validation_alias="key")
300
+ set_top: bool = Field(serialization_alias="act")
301
+
302
+ need_change: int = 0
303
+
304
+ @field_serializer("set_top", return_type=str)
305
+ def serialize_set_top(self, set_top: bool) -> str:
306
+ return "set" if set_top else "cancel"
@@ -144,7 +144,7 @@ class IndexPageResp(FeedPageResp):
144
144
  if not scripts:
145
145
  raise TryAgain("script tag not found")
146
146
 
147
- texts: t.List[str] = [s.text for s in scripts]
147
+ texts: t.List[str] = [s.text for s in scripts if s.text]
148
148
  script = firstn(texts, lambda s: "shine0callback" in s)
149
149
  if not script:
150
150
  raise TryAgain("data script not found")
@@ -188,7 +188,7 @@ class ProfilePagePesp(QzoneResponse):
188
188
  qzonetoken: str
189
189
 
190
190
  @classmethod
191
- async def response_to_object(cls, response: ClientResponse):
191
+ async def response_to_object(cls, response: ClientResponse) -> StrDict:
192
192
  html = await response.text()
193
193
  scripts: t.List[HtmlElement] = document_fromstring(html).xpath(
194
194
  'body/script[@type="application/javascript"]'
@@ -196,7 +196,7 @@ class ProfilePagePesp(QzoneResponse):
196
196
  if not scripts:
197
197
  raise TryAgain("ProfilePageResponse: script tag not found")
198
198
 
199
- texts: t.List[str] = [s.text for s in scripts]
199
+ texts: t.List[str] = [s.text for s in scripts if s.text]
200
200
  script = firstn(texts, lambda s: "shine0callback" in s)
201
201
  if not script:
202
202
  raise TryAgain("ProfilePageResponse: script tag not found")
@@ -255,7 +255,7 @@ class AddCommentLegacyResp(QzoneResponse):
255
255
  scripts: t.List[HtmlElement] = document_fromstring(html).xpath(
256
256
  'body/script[@type="text/javascript"]'
257
257
  )
258
- texts: t.List[str] = [s.text for s in scripts]
258
+ texts: t.List[str] = [s.text for s in scripts if s.text]
259
259
  script = firstn(texts, lambda s: "frameElement.callback" in s)
260
260
  if not script:
261
261
  raise TryAgain("AddCommentLegacyResponse: script tag not found")
@@ -274,7 +274,7 @@ class DeleteCommentResp(QzoneResponse):
274
274
  scripts: t.List[HtmlElement] = document_fromstring(html).xpath(
275
275
  'body/script[@type="text/javascript"]'
276
276
  )
277
- texts: t.List[str] = [s.text for s in scripts]
277
+ texts: t.List[str] = [s.text for s in scripts if s.text]
278
278
  script = firstn(texts, lambda s: "frameElement.callback" in s)
279
279
  if not script:
280
280
  raise TryAgain("DeleteCommentResponse: script tag not found")
@@ -1,13 +0,0 @@
1
- version: 2
2
- updates:
3
- # Maintain dependencies for GitHub Actions
4
- - package-ecosystem: github-actions
5
- directory: "/"
6
- schedule:
7
- interval: weekly
8
- day: saturday
9
-
10
- - package-ecosystem: uv
11
- directory: "/"
12
- schedule:
13
- interval: daily
@@ -1,37 +0,0 @@
1
- name: Auto PR
2
-
3
- on:
4
- push:
5
- branches:
6
- - dev
7
- - dev/**
8
-
9
- concurrency:
10
- group: ci-${{ github.ref_name }}
11
- cancel-in-progress: true
12
-
13
- env:
14
- target: beta
15
-
16
- jobs:
17
- pr:
18
- name: Open or Edit PR
19
- runs-on: ubuntu-latest
20
- if: "!startsWith(github.event.head_commit.message, '@no-pr')"
21
- permissions:
22
- pull-requests: write
23
- steps:
24
- - uses: actions/checkout@v5
25
- with:
26
- fetch-depth: 0
27
-
28
- - uses: JamzumSum/actions/pr-changelog@master
29
- id: git-cliff
30
- with:
31
- start: ${{ env.target }}
32
-
33
- - name: Push Changelog to PR
34
- uses: JamzumSum/actions/push-pr-body@master
35
- with:
36
- base-branch: ${{ env.target }}
37
- body: ${{ steps.git-cliff.outputs.changelog }}
@@ -1,36 +0,0 @@
1
- # This workflow will install Python dependencies, build and publish this repo to PyPI.
2
-
3
- name: Publish to PyPI
4
-
5
- on:
6
- workflow_dispatch:
7
- pull_request:
8
- types:
9
- - closed
10
- branches:
11
- - "release"
12
- - "release/**"
13
- - "beta"
14
- - "beta/**"
15
-
16
- jobs:
17
- build:
18
- runs-on: ubuntu-latest
19
- if: |
20
- github.event_name == 'workflow_dispatch' ||
21
- contains(github.event.pull_request.labels.*.name, 'release')
22
- steps:
23
- #----------------------------------------------
24
- # check-out repo and set-up python
25
- #----------------------------------------------
26
- - uses: actions/checkout@v5
27
- - uses: astral-sh/setup-uv@v6
28
- #----------------------------------------------
29
- # -------- Build and release ---------
30
- #----------------------------------------------
31
- - name: Build dist and Publish to PyPI
32
- env:
33
- UV_PUBLISH_PASSWORD: ${{ secrets.PYPI_TOKEN }}
34
- run: |
35
- uv build --no-sources
36
- uv publish --username __token__
@@ -1,59 +0,0 @@
1
- # For most projects, this workflow file will not need changing; you simply need
2
- # to commit it to your repository.
3
- #
4
- # You may wish to alter this file to override the set of languages analyzed,
5
- # or to provide custom queries or build logic.
6
- #
7
- # ******** NOTE ********
8
- # We have attempted to detect the languages in your repository. Please check
9
- # the `language` matrix defined below to confirm you have the correct set of
10
- # supported CodeQL languages.
11
- #
12
- name: "CodeQL"
13
-
14
- on:
15
- pull_request:
16
- # The branches below must be a subset of the branches above
17
- branches: [ beta ]
18
- paths:
19
- - "*.py"
20
- schedule:
21
- - cron: '31 23 * * 0/2'
22
-
23
- jobs:
24
- analyze:
25
- name: Analyze
26
- runs-on: ubuntu-latest
27
- permissions:
28
- actions: read
29
- contents: read
30
- security-events: write
31
-
32
- strategy:
33
- fail-fast: false
34
- matrix:
35
- language: [ 'python' ]
36
- # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ]
37
- # Learn more about CodeQL language support at https://git.io/codeql-language-support
38
-
39
- steps:
40
- - name: Checkout repository
41
- uses: actions/checkout@v5
42
-
43
- # Initializes the CodeQL tools for scanning.
44
- - name: Initialize CodeQL
45
- uses: github/codeql-action/init@v3
46
- with:
47
- languages: ${{ matrix.language }}
48
- # If you wish to specify custom queries, you can do so here or in a config file.
49
- # By default, queries listed here will override any specified in a config file.
50
- # Prefix the list here with "+" to use these queries and those in the config file.
51
- # queries: ./path/to/local/query, your-org/your-repo/queries@main
52
-
53
- - name: Perform CodeQL Analysis
54
- uses: github/codeql-action/analyze@v3
55
-
56
-
57
- concurrency:
58
- group: codeql-${{ github.ref_name }}
59
- cancel-in-progress: true
@@ -1,72 +0,0 @@
1
- name: Sphinx Build and Deploy
2
-
3
- on:
4
- workflow_dispatch:
5
- pull_request:
6
- types:
7
- - review_requested
8
- - closed
9
- branches:
10
- - beta
11
- paths:
12
- - doc/**
13
- - .github/workflows/sphinx.yml
14
-
15
- concurrency:
16
- group: pages
17
- cancel-in-progress: true
18
-
19
- jobs:
20
- sphinx-build:
21
- runs-on: ubuntu-latest
22
- permissions:
23
- contents: read
24
- steps:
25
- - uses: actions/checkout@v5
26
- - uses: actions/configure-pages@v5
27
- - uses: astral-sh/setup-uv@v6
28
- with:
29
- activate-environment: true
30
-
31
- - name: Install Library and Build HTML
32
- run: |
33
- echo "::group::Install Library"
34
- uv sync --no-default-groups --group doc
35
- echo "::endgroup::"
36
-
37
- echo "::group::Build HTML"
38
- uv run sphinx-build doc/source doc/build/html -D release=$(uv version --short)
39
- echo "::endgroup::"
40
-
41
- - name: Fix permissions
42
- run: |
43
- chmod -c -R +rX "doc/build/html/" | while read line; do
44
- echo "::warning title=Invalid file permissions automatically fixed::$line"
45
- done
46
-
47
- - name: Upload artifact
48
- if: |
49
- github.event_name == 'workflow_dispatch' ||
50
- (github.event_name == 'pull_request' && github.event.action == 'closed')
51
- uses: actions/upload-pages-artifact@v4
52
- with:
53
- path: doc/build/html
54
-
55
- deploy:
56
- if: |
57
- github.event_name == 'workflow_dispatch' ||
58
- (github.event_name == 'pull_request' && github.event.action == 'closed')
59
- environment:
60
- name: github-pages
61
- url: ${{ steps.deployment.outputs.page_url }}
62
- permissions:
63
- pages: write
64
- id-token: write
65
- runs-on: ubuntu-latest
66
- needs: sphinx-build
67
- outputs:
68
- page_url: ${{ steps.deployment.outputs.page_url }}
69
- steps:
70
- - name: Deploy to GitHub Pages
71
- id: deployment
72
- uses: actions/deploy-pages@v4
@@ -1,52 +0,0 @@
1
- # install dependency and current package
2
- name: Test Poetry Project
3
-
4
- on:
5
- pull_request:
6
- types:
7
- - review_requested
8
- branches:
9
- - beta
10
- - release
11
-
12
- concurrency:
13
- group: test-${{ github.ref_name }}
14
- cancel-in-progress: true
15
-
16
- jobs:
17
- install-test:
18
- runs-on: ubuntu-latest
19
- strategy:
20
- matrix:
21
- python-version: ["3.13", "3.11", "3.10", "3.9"]
22
- steps:
23
- #----------------------------------------------
24
- # check-out repo and set-up python
25
- #----------------------------------------------
26
- - uses: actions/checkout@v5
27
- - uses: astral-sh/setup-uv@v6
28
- with:
29
- python-version: ${{ matrix.python-version }}
30
- activate-environment: true
31
- enable-cache: true
32
-
33
- - name: Install and Test
34
- env:
35
- TEST_UIN: ${{ secrets.TEST_UIN }}
36
- TEST_PASSWORD: ${{ secrets.TEST_PASSWORD }}
37
- run: |
38
- echo "::group::Install Basic Dependencies"
39
- uv sync --no-default-groups --group test
40
- echo "::endgroup::"
41
-
42
- echo "::group::pytest outputs"
43
- uv run pytest test --log-cli-level=WARNING
44
- echo "::endgroup::"
45
-
46
- - name: Request Changes
47
- env:
48
- GH_TOKEN: ${{ secrets.COMMENT_PAT }} # the reviewer PAT
49
- run: |
50
- if [[ $GH_TOKEN != "" ]]; then
51
- gh pr review ${{ github.event.pull_request.number }} -r -b "Some test(s) failed."
52
- fi
@@ -1,28 +0,0 @@
1
- # local config
2
- .vscode
3
- .env
4
- uv.toml
5
- package-lock.json
6
-
7
- # venv
8
- .venv
9
- .tox
10
- /venv
11
- node_modules
12
-
13
- # cache and tempfiles
14
- __pycache__
15
- *.pyc
16
- tmp
17
- /data
18
-
19
- # build, metadata and distributions
20
- /dist
21
- /build
22
- /doc/source/locale/**/*.mo
23
- *.egg-info
24
-
25
- # useless documents
26
- /archive
27
- /doc/*
28
- !/doc/source
@@ -1,37 +0,0 @@
1
- # See https://pre-commit.com for more information
2
- # See https://pre-commit.com/hooks.html for more hooks
3
- repos:
4
- - repo: https://github.com/pre-commit/pre-commit-hooks
5
- rev: v5.0.0
6
- hooks:
7
- - id: check-case-conflict
8
- - id: trailing-whitespace
9
- - id: end-of-file-fixer
10
- - id: check-yaml
11
- - id: check-added-large-files
12
- - repo: https://github.com/astral-sh/uv-pre-commit
13
- rev: 0.7.2
14
- hooks:
15
- - id: uv-lock
16
- - repo: local
17
- hooks:
18
- - id: isort
19
- name: sort imports
20
- entry: uv run --active ruff check --select I --fix
21
- pass_filenames: false
22
- language: system
23
- types: [python]
24
- - id: black
25
- name: format
26
- entry: uv run --active ruff format
27
- pass_filenames: false
28
- language: system
29
- types: [python]
30
- - id: pytest
31
- name: pytest-check
32
- entry: uv run --active pytest test
33
- language: system
34
- pass_filenames: false
35
- types: [python, toml]
36
- default_language_version:
37
- python: python3
@@ -1,9 +0,0 @@
1
- # Contributing
2
-
3
- Welcome to aioqzone community.
4
-
5
- ## Add Test
6
-
7
- Our tests are not fully coveraged. New unittests are needed.
8
-
9
- No special rules for tests. Just create a pull request if you've done your work.