aioqzone 1.9.4.dev5__tar.gz → 1.9.4.dev7__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.dev5 → aioqzone-1.9.4.dev7}/.github/workflows/auto-pr.yml +1 -1
  2. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/.github/workflows/build.yml +1 -1
  3. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/.github/workflows/codeql-analysis.yml +1 -1
  4. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/.github/workflows/sphinx.yml +2 -2
  5. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/.github/workflows/test.yml +1 -1
  6. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/PKG-INFO +1 -1
  7. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/pyproject.toml +2 -2
  8. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/src/aioqzone/model/api/feed.py +19 -1
  9. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/src/aioqzone/model/api/profile.py +3 -0
  10. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/test/api/test_loginman.py +1 -2
  11. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/test/login_logic/test_captcha.py +1 -2
  12. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/test/login_logic/test_qr.py +1 -2
  13. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/test/login_logic/test_up.py +1 -2
  14. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/uv.lock +17 -6
  15. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/.github/dependabot.yml +0 -0
  16. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/.gitignore +0 -0
  17. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/.pre-commit-config.yaml +0 -0
  18. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/CONTRIBUTING.md +0 -0
  19. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/LICENSE +0 -0
  20. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/README.md +0 -0
  21. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/README_en.md +0 -0
  22. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/cliff.toml +0 -0
  23. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/doc/source/_static/penguin-blob.webp +0 -0
  24. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/doc/source/_static/teaencoder.ts +0 -0
  25. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/doc/source/aioqzone/api/h5.rst +0 -0
  26. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/doc/source/aioqzone/api/index.rst +0 -0
  27. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/doc/source/aioqzone/api/login.rst +0 -0
  28. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/doc/source/aioqzone/exception.rst +0 -0
  29. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/doc/source/aioqzone/index.rst +0 -0
  30. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/doc/source/aioqzone/messages.rst +0 -0
  31. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/doc/source/aioqzone/model/api.rst +0 -0
  32. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/doc/source/aioqzone/model/index.rst +0 -0
  33. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/doc/source/aioqzone/model/protocol.rst +0 -0
  34. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/doc/source/aioqzone/reference.rst +0 -0
  35. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/doc/source/conf.py +0 -0
  36. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/doc/source/disclaimers.rst +0 -0
  37. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/doc/source/index.rst +0 -0
  38. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/doc/source/locale/zh_CN/LC_MESSAGES/aioqzone/api/h5.po +0 -0
  39. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/doc/source/locale/zh_CN/LC_MESSAGES/aioqzone/api/index.po +0 -0
  40. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/doc/source/locale/zh_CN/LC_MESSAGES/aioqzone/api/login.po +0 -0
  41. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/doc/source/locale/zh_CN/LC_MESSAGES/aioqzone/api/web.po +0 -0
  42. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/doc/source/locale/zh_CN/LC_MESSAGES/aioqzone/exception.po +0 -0
  43. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/doc/source/locale/zh_CN/LC_MESSAGES/aioqzone/index.po +0 -0
  44. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/doc/source/locale/zh_CN/LC_MESSAGES/aioqzone/messages.po +0 -0
  45. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/doc/source/locale/zh_CN/LC_MESSAGES/aioqzone/model/api.po +0 -0
  46. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/doc/source/locale/zh_CN/LC_MESSAGES/aioqzone/model/index.po +0 -0
  47. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/doc/source/locale/zh_CN/LC_MESSAGES/aioqzone/model/protocol.po +0 -0
  48. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/doc/source/locale/zh_CN/LC_MESSAGES/aioqzone/model/response.po +0 -0
  49. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/doc/source/locale/zh_CN/LC_MESSAGES/aioqzone/reference.po +0 -0
  50. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/doc/source/locale/zh_CN/LC_MESSAGES/disclaimers.po +0 -0
  51. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/doc/source/locale/zh_CN/LC_MESSAGES/index.po +0 -0
  52. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/doc/source/locale/zh_CN/LC_MESSAGES/qqqr/base.po +0 -0
  53. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/doc/source/locale/zh_CN/LC_MESSAGES/qqqr/exception.po +0 -0
  54. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/doc/source/locale/zh_CN/LC_MESSAGES/qqqr/index.po +0 -0
  55. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/doc/source/locale/zh_CN/LC_MESSAGES/qqqr/jsjson.po +0 -0
  56. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/doc/source/locale/zh_CN/LC_MESSAGES/qqqr/qr/index.po +0 -0
  57. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/doc/source/locale/zh_CN/LC_MESSAGES/qqqr/qr/login.po +0 -0
  58. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/doc/source/locale/zh_CN/LC_MESSAGES/qqqr/qr/type.po +0 -0
  59. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/doc/source/locale/zh_CN/LC_MESSAGES/qqqr/up/captcha/capsess.po +0 -0
  60. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/doc/source/locale/zh_CN/LC_MESSAGES/qqqr/up/captcha/captcha.po +0 -0
  61. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/doc/source/locale/zh_CN/LC_MESSAGES/qqqr/up/captcha/index.po +0 -0
  62. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/doc/source/locale/zh_CN/LC_MESSAGES/qqqr/up/captcha/jigsaw.po +0 -0
  63. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/doc/source/locale/zh_CN/LC_MESSAGES/qqqr/up/encrypt.po +0 -0
  64. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/doc/source/locale/zh_CN/LC_MESSAGES/qqqr/up/index.po +0 -0
  65. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/doc/source/locale/zh_CN/LC_MESSAGES/qqqr/up/login.po +0 -0
  66. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/doc/source/locale/zh_CN/LC_MESSAGES/qqqr/up/type.po +0 -0
  67. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/doc/source/locale/zh_CN/LC_MESSAGES/reference.po +0 -0
  68. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/doc/source/qqqr/base.rst +0 -0
  69. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/doc/source/qqqr/exception.rst +0 -0
  70. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/doc/source/qqqr/index.rst +0 -0
  71. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/doc/source/qqqr/jsjson.rst +0 -0
  72. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/doc/source/qqqr/qr/index.rst +0 -0
  73. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/doc/source/qqqr/qr/login.rst +0 -0
  74. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/doc/source/qqqr/qr/type.rst +0 -0
  75. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/doc/source/qqqr/up/captcha/capsess.rst +0 -0
  76. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/doc/source/qqqr/up/captcha/captcha.rst +0 -0
  77. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/doc/source/qqqr/up/captcha/index.rst +0 -0
  78. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/doc/source/qqqr/up/encrypt.rst +0 -0
  79. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/doc/source/qqqr/up/index.rst +0 -0
  80. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/doc/source/qqqr/up/login.rst +0 -0
  81. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/doc/source/qqqr/up/type.rst +0 -0
  82. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/src/aioqzone/__init__.py +0 -0
  83. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/src/aioqzone/api/__init__.py +0 -0
  84. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/src/aioqzone/api/h5/__init__.py +0 -0
  85. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/src/aioqzone/api/h5/model.py +0 -0
  86. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/src/aioqzone/api/login/__init__.py +0 -0
  87. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/src/aioqzone/api/login/_base.py +0 -0
  88. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/src/aioqzone/exception.py +0 -0
  89. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/src/aioqzone/message.py +0 -0
  90. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/src/aioqzone/model/__init__.py +0 -0
  91. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/src/aioqzone/model/api/__init__.py +0 -0
  92. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/src/aioqzone/model/api/request.py +0 -0
  93. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/src/aioqzone/model/api/response.py +0 -0
  94. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/src/aioqzone/model/protocol/__init__.py +0 -0
  95. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/src/aioqzone/model/protocol/config.py +0 -0
  96. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/src/aioqzone/model/protocol/entity.py +0 -0
  97. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/src/aioqzone/utils/__init__.py +0 -0
  98. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/src/aioqzone/utils/entity.py +0 -0
  99. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/src/aioqzone/utils/regex.py +0 -0
  100. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/src/aioqzone/utils/retry.py +0 -0
  101. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/src/aioqzone/utils/time.py +0 -0
  102. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/src/qqqr/__init__.py +0 -0
  103. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/src/qqqr/base.py +0 -0
  104. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/src/qqqr/constant.py +0 -0
  105. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/src/qqqr/exception.py +0 -0
  106. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/src/qqqr/message.py +0 -0
  107. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/src/qqqr/py.typed +0 -0
  108. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/src/qqqr/qr/__init__.py +0 -0
  109. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/src/qqqr/qr/type.py +0 -0
  110. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/src/qqqr/type.py +0 -0
  111. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/src/qqqr/up/__init__.py +0 -0
  112. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/src/qqqr/up/_model.py +0 -0
  113. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/src/qqqr/up/captcha/__init__.py +0 -0
  114. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/src/qqqr/up/captcha/_model.py +0 -0
  115. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/src/qqqr/up/captcha/capsess.py +0 -0
  116. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/src/qqqr/up/captcha/click/__init__.py +0 -0
  117. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/src/qqqr/up/captcha/click/_types.py +0 -0
  118. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/src/qqqr/up/captcha/pil_utils.py +0 -0
  119. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/src/qqqr/up/captcha/select/__init__.py +0 -0
  120. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/src/qqqr/up/captcha/select/_types.py +0 -0
  121. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/src/qqqr/up/captcha/slide/__init__.py +0 -0
  122. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/src/qqqr/up/captcha/slide/_types.py +0 -0
  123. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/src/qqqr/up/encrypt.py +0 -0
  124. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/src/qqqr/up/h5.py +0 -0
  125. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/src/qqqr/up/web.py +0 -0
  126. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/src/qqqr/utils/encrypt.py +0 -0
  127. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/src/qqqr/utils/iter.py +0 -0
  128. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/src/qqqr/utils/jsjson.py +0 -0
  129. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/src/qqqr/utils/net.py +0 -0
  130. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/test/api/__init__.py +0 -0
  131. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/test/api/conftest.py +0 -0
  132. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/test/api/test_h5.py +0 -0
  133. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/test/conftest.py +0 -0
  134. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/test/login_logic/__init__.py +0 -0
  135. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/test/utils/test_entity.py +0 -0
  136. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/test/utils/test_json.py +0 -0
  137. {aioqzone-1.9.4.dev5 → aioqzone-1.9.4.dev7}/test/utils/test_time.py +0 -0
@@ -21,7 +21,7 @@ jobs:
21
21
  permissions:
22
22
  pull-requests: write
23
23
  steps:
24
- - uses: actions/checkout@v4
24
+ - uses: actions/checkout@v5
25
25
  with:
26
26
  fetch-depth: 0
27
27
 
@@ -23,7 +23,7 @@ jobs:
23
23
  #----------------------------------------------
24
24
  # check-out repo and set-up python
25
25
  #----------------------------------------------
26
- - uses: actions/checkout@v4
26
+ - uses: actions/checkout@v5
27
27
  - uses: astral-sh/setup-uv@v6
28
28
  #----------------------------------------------
29
29
  # -------- Build and release ---------
@@ -38,7 +38,7 @@ jobs:
38
38
 
39
39
  steps:
40
40
  - name: Checkout repository
41
- uses: actions/checkout@v4
41
+ uses: actions/checkout@v5
42
42
 
43
43
  # Initializes the CodeQL tools for scanning.
44
44
  - name: Initialize CodeQL
@@ -23,7 +23,7 @@ jobs:
23
23
  permissions:
24
24
  contents: read
25
25
  steps:
26
- - uses: actions/checkout@v4
26
+ - uses: actions/checkout@v5
27
27
  - uses: actions/configure-pages@v5
28
28
  - uses: astral-sh/setup-uv@v6
29
29
  with:
@@ -47,7 +47,7 @@ jobs:
47
47
 
48
48
  - name: Upload artifact
49
49
  if: github.event_name == 'push'
50
- uses: actions/upload-pages-artifact@v3
50
+ uses: actions/upload-pages-artifact@v4
51
51
  with:
52
52
  path: doc/build/html
53
53
 
@@ -23,7 +23,7 @@ jobs:
23
23
  #----------------------------------------------
24
24
  # check-out repo and set-up python
25
25
  #----------------------------------------------
26
- - uses: actions/checkout@v4
26
+ - uses: actions/checkout@v5
27
27
  - uses: astral-sh/setup-uv@v6
28
28
  with:
29
29
  python-version: ${{ matrix.python-version }}
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: aioqzone
3
- Version: 1.9.4.dev5
3
+ Version: 1.9.4.dev7
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.dev5"
3
+ version = "1.9.4.dev7"
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~=0.25.2"]
40
+ test = ["pytest>=8.2.0", "pytest-asyncio~=1.1.0"]
41
41
  dev = ["pre-commit", "ruff"]
42
42
  doc = [
43
43
  "Sphinx>=7.0.1; python_version>='3.9' and python_version<'3.11'",
@@ -96,7 +96,12 @@ class PhotoUrl(BaseModel):
96
96
  class PhotoUrls(RootModel[t.Set[PhotoUrl]]):
97
97
  @model_validator(mode="before")
98
98
  def unpack_urls(cls, v: dict):
99
- return list(v.values())
99
+ return list(
100
+ filter(
101
+ lambda d: isinstance(d, dict) and d.get("url"),
102
+ v.values(),
103
+ )
104
+ )
100
105
 
101
106
  @property
102
107
  def largest(self) -> PhotoUrl:
@@ -148,6 +153,16 @@ class FeedPic(BaseModel):
148
153
  albumid: str
149
154
  uin: int
150
155
  picdata: t.List[PicData]
156
+ uploadnum: int
157
+
158
+
159
+ class Visitor(BaseModel):
160
+ view_count: int = 0
161
+ visitor_count: int = 0
162
+ # visitors: t.List[UserInfo]
163
+ # mod: int
164
+ # view_count_byfriends: int
165
+ # myfriend_info: str
151
166
 
152
167
 
153
168
  class CommentItem(LikeInfo):
@@ -233,3 +248,6 @@ class FeedData(HasFid, HasCommon, HasSummary, HasMedia, HasUserInfo):
233
248
  share_info: ShareInfo = Field(
234
249
  default_factory=ShareInfo, validation_alias=AliasPath("operation", "share_info")
235
250
  )
251
+
252
+ # forward_list
253
+ visitor: Visitor = Field(default_factory=Visitor)
@@ -21,6 +21,7 @@ from .feed import (
21
21
  Share,
22
22
  ShareInfo,
23
23
  UserInfo,
24
+ Visitor,
24
25
  )
25
26
 
26
27
 
@@ -108,3 +109,5 @@ class ProfileFeedData(HasFid, HasCommon, HasSummary, HasMedia, HasUserInfo):
108
109
  share_info: ShareInfo = Field(
109
110
  default_factory=ShareInfo, validation_alias=AliasPath("operation", "share_info")
110
111
  )
112
+
113
+ visitor: Visitor = Field(default_factory=Visitor)
@@ -20,9 +20,8 @@ from qqqr.exception import TencentLoginError, UserBreak
20
20
  from qqqr.utils.net import ClientAdapter
21
21
 
22
22
  if TYPE_CHECKING:
23
- from test.conftest import test_env
24
-
25
23
  from qqqr.utils.net import ClientAdapter
24
+ from test.conftest import test_env
26
25
 
27
26
  pytestmark = pytest.mark.asyncio(loop_scope="module")
28
27
  skip_ci = pytest.mark.skipif(bool(environ.get("CI")), reason="Skip QR loop in CI")
@@ -11,10 +11,9 @@ from qqqr.up import UpH5Login
11
11
  from qqqr.up.captcha import Captcha, SelectCaptchaSession, TcaptchaSession
12
12
 
13
13
  if TYPE_CHECKING:
14
- from test.conftest import test_env
15
-
16
14
  from qqqr.up.web import UpWebSession
17
15
  from qqqr.utils.net import ClientAdapter
16
+ from test.conftest import test_env
18
17
 
19
18
  pytestmark = pytest.mark.asyncio(loop_scope="module")
20
19
 
@@ -17,9 +17,8 @@ pytestmark = pytest.mark.asyncio(loop_scope="module")
17
17
  skip_ci = pytest.mark.skipif(bool(environ.get("CI")), reason="Skip QR loop in CI")
18
18
 
19
19
  if TYPE_CHECKING:
20
- from test.conftest import test_env
21
-
22
20
  from qqqr.utils.net import ClientAdapter
21
+ from test.conftest import test_env
23
22
 
24
23
  NoneType = type(None)
25
24
 
@@ -11,9 +11,8 @@ from qqqr.exception import TencentLoginError
11
11
  from qqqr.up import UpH5Login, UpWebLogin
12
12
 
13
13
  if TYPE_CHECKING:
14
- from test.conftest import test_env
15
-
16
14
  from qqqr.utils.net import ClientAdapter
15
+ from test.conftest import test_env
17
16
 
18
17
  pytestmark = pytest.mark.asyncio(loop_scope="module")
19
18
  skip_ci = pytest.mark.skipif(bool(environ.get("CI")), reason="Skip QR loop in CI")
@@ -1,5 +1,5 @@
1
1
  version = 1
2
- revision = 2
2
+ revision = 3
3
3
  requires-python = ">=3.9"
4
4
  resolution-markers = [
5
5
  "python_full_version >= '3.11'",
@@ -116,7 +116,7 @@ wheels = [
116
116
 
117
117
  [[package]]
118
118
  name = "aioqzone"
119
- version = "1.9.4.dev5"
119
+ version = "1.9.4.dev6"
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 = "~=0.25.2" },
187
+ { name = "pytest-asyncio", specifier = "~=1.1.0" },
188
188
  ]
189
189
 
190
190
  [[package]]
@@ -275,6 +275,15 @@ wheels = [
275
275
  { url = "https://files.pythonhosted.org/packages/b7/b8/3fe70c75fe32afc4bb507f75563d39bc5642255d1d94f1f23604725780bf/babel-2.17.0-py3-none-any.whl", hash = "sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2", size = 10182537, upload-time = "2025-02-01T15:17:37.39Z" },
276
276
  ]
277
277
 
278
+ [[package]]
279
+ name = "backports-asyncio-runner"
280
+ version = "1.2.0"
281
+ source = { registry = "https://pypi.org/simple" }
282
+ sdist = { url = "https://files.pythonhosted.org/packages/8e/ff/70dca7d7cb1cbc0edb2c6cc0c38b65cba36cccc491eca64cabd5fe7f8670/backports_asyncio_runner-1.2.0.tar.gz", hash = "sha256:a5aa7b2b7d8f8bfcaa2b57313f70792df84e32a2a746f585213373f900b42162", size = 69893, upload-time = "2025-07-02T02:27:15.685Z" }
283
+ wheels = [
284
+ { url = "https://files.pythonhosted.org/packages/a0/59/76ab57e3fe74484f48a53f8e337171b4a2349e506eabe136d7e01d059086/backports_asyncio_runner-1.2.0-py3-none-any.whl", hash = "sha256:0da0a936a8aeb554eccb426dc55af3ba63bcdc69fa1a600b5bb305413a4477b5", size = 12313, upload-time = "2025-07-02T02:27:14.263Z" },
285
+ ]
286
+
278
287
  [[package]]
279
288
  name = "beautifulsoup4"
280
289
  version = "4.13.4"
@@ -1378,14 +1387,16 @@ wheels = [
1378
1387
 
1379
1388
  [[package]]
1380
1389
  name = "pytest-asyncio"
1381
- version = "0.25.3"
1390
+ version = "1.1.0"
1382
1391
  source = { registry = "https://pypi.org/simple" }
1383
1392
  dependencies = [
1393
+ { name = "backports-asyncio-runner", marker = "python_full_version < '3.11'" },
1384
1394
  { name = "pytest" },
1395
+ { name = "typing-extensions", marker = "python_full_version < '3.10'" },
1385
1396
  ]
1386
- sdist = { url = "https://files.pythonhosted.org/packages/f2/a8/ecbc8ede70921dd2f544ab1cadd3ff3bf842af27f87bbdea774c7baa1d38/pytest_asyncio-0.25.3.tar.gz", hash = "sha256:fc1da2cf9f125ada7e710b4ddad05518d4cee187ae9412e9ac9271003497f07a", size = 54239, upload-time = "2025-01-28T18:37:58.729Z" }
1397
+ sdist = { url = "https://files.pythonhosted.org/packages/4e/51/f8794af39eeb870e87a8c8068642fc07bce0c854d6865d7dd0f2a9d338c2/pytest_asyncio-1.1.0.tar.gz", hash = "sha256:796aa822981e01b68c12e4827b8697108f7205020f24b5793b3c41555dab68ea", size = 46652, upload-time = "2025-07-16T04:29:26.393Z" }
1387
1398
  wheels = [
1388
- { url = "https://files.pythonhosted.org/packages/67/17/3493c5624e48fd97156ebaec380dcaafee9506d7e2c46218ceebbb57d7de/pytest_asyncio-0.25.3-py3-none-any.whl", hash = "sha256:9e89518e0f9bd08928f97a3482fdc4e244df17529460bc038291ccaf8f85c7c3", size = 19467, upload-time = "2025-01-28T18:37:56.798Z" },
1399
+ { url = "https://files.pythonhosted.org/packages/c7/9d/bf86eddabf8c6c9cb1ea9a869d6873b46f105a5d292d3a6f7071f5b07935/pytest_asyncio-1.1.0-py3-none-any.whl", hash = "sha256:5fe2d69607b0bd75c656d1211f969cadba035030156745ee09e7d71740e58ecf", size = 15157, upload-time = "2025-07-16T04:29:24.929Z" },
1389
1400
  ]
1390
1401
 
1391
1402
  [[package]]
File without changes
File without changes
File without changes
File without changes