maxapi-python 1.2.3__tar.gz → 1.2.4__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 (69) hide show
  1. {maxapi_python-1.2.3 → maxapi_python-1.2.4}/PKG-INFO +12 -7
  2. {maxapi_python-1.2.3 → maxapi_python-1.2.4}/README.md +7 -3
  3. {maxapi_python-1.2.3 → maxapi_python-1.2.4}/pyproject.toml +5 -4
  4. maxapi_python-1.2.4/redocs/source/clients.rst +252 -0
  5. {maxapi_python-1.2.3 → maxapi_python-1.2.4}/redocs/source/conf.py +1 -1
  6. {maxapi_python-1.2.3 → maxapi_python-1.2.4}/redocs/source/examples.rst +3 -8
  7. {maxapi_python-1.2.3 → maxapi_python-1.2.4}/redocs/source/guides.rst +0 -5
  8. {maxapi_python-1.2.3 → maxapi_python-1.2.4}/redocs/source/index.rst +8 -2
  9. {maxapi_python-1.2.3 → maxapi_python-1.2.4}/redocs/source/installation.rst +2 -2
  10. {maxapi_python-1.2.3 → maxapi_python-1.2.4}/redocs/source/quickstart.rst +21 -6
  11. maxapi_python-1.2.4/redocs/source/release_notes.rst +143 -0
  12. {maxapi_python-1.2.3 → maxapi_python-1.2.4}/src/pymax/core.py +54 -37
  13. {maxapi_python-1.2.3 → maxapi_python-1.2.4}/src/pymax/files.py +28 -7
  14. maxapi_python-1.2.3/src/pymax/mixins/websocket.py → maxapi_python-1.2.4/src/pymax/interfaces.py +182 -130
  15. {maxapi_python-1.2.3 → maxapi_python-1.2.4}/src/pymax/mixins/auth.py +2 -2
  16. {maxapi_python-1.2.3 → maxapi_python-1.2.4}/src/pymax/mixins/channel.py +3 -5
  17. {maxapi_python-1.2.3 → maxapi_python-1.2.4}/src/pymax/mixins/group.py +2 -2
  18. {maxapi_python-1.2.3 → maxapi_python-1.2.4}/src/pymax/mixins/handler.py +4 -10
  19. {maxapi_python-1.2.3 → maxapi_python-1.2.4}/src/pymax/mixins/message.py +64 -88
  20. {maxapi_python-1.2.3 → maxapi_python-1.2.4}/src/pymax/mixins/scheduler.py +1 -1
  21. {maxapi_python-1.2.3 → maxapi_python-1.2.4}/src/pymax/mixins/self.py +2 -2
  22. maxapi_python-1.2.4/src/pymax/mixins/socket.py +297 -0
  23. {maxapi_python-1.2.3 → maxapi_python-1.2.4}/src/pymax/mixins/telemetry.py +2 -4
  24. {maxapi_python-1.2.3 → maxapi_python-1.2.4}/src/pymax/mixins/user.py +3 -5
  25. maxapi_python-1.2.4/src/pymax/mixins/websocket.py +142 -0
  26. {maxapi_python-1.2.3 → maxapi_python-1.2.4}/src/pymax/payloads.py +8 -1
  27. maxapi_python-1.2.4/src/pymax/protocols.py +123 -0
  28. maxapi_python-1.2.4/src/pymax/static/constant.py +89 -0
  29. {maxapi_python-1.2.3 → maxapi_python-1.2.4}/src/pymax/static/enum.py +5 -0
  30. {maxapi_python-1.2.3 → maxapi_python-1.2.4}/src/pymax/types.py +25 -0
  31. maxapi_python-1.2.4/src/pymax/utils.py +90 -0
  32. maxapi_python-1.2.3/mkdocs.yml +0 -123
  33. maxapi_python-1.2.3/redocs/source/clients.rst +0 -148
  34. maxapi_python-1.2.3/src/pymax/interfaces.py +0 -257
  35. maxapi_python-1.2.3/src/pymax/mixins/socket.py +0 -630
  36. maxapi_python-1.2.3/src/pymax/mixins/utils.py +0 -27
  37. maxapi_python-1.2.3/src/pymax/static/constant.py +0 -28
  38. {maxapi_python-1.2.3 → maxapi_python-1.2.4}/.coderabbit.yaml +0 -0
  39. {maxapi_python-1.2.3 → maxapi_python-1.2.4}/.github/FUNDING.yml +0 -0
  40. {maxapi_python-1.2.3 → maxapi_python-1.2.4}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  41. {maxapi_python-1.2.3 → maxapi_python-1.2.4}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  42. {maxapi_python-1.2.3 → maxapi_python-1.2.4}/.github/ISSUE_TEMPLATE/refactor.md +0 -0
  43. {maxapi_python-1.2.3 → maxapi_python-1.2.4}/.github/pull_request_template.md +0 -0
  44. {maxapi_python-1.2.3 → maxapi_python-1.2.4}/.github/workflows/publish.yml +0 -0
  45. {maxapi_python-1.2.3 → maxapi_python-1.2.4}/.github/workflows/tests.yml +0 -0
  46. {maxapi_python-1.2.3 → maxapi_python-1.2.4}/.gitignore +0 -0
  47. {maxapi_python-1.2.3 → maxapi_python-1.2.4}/.pre-commit-config.yaml +0 -0
  48. {maxapi_python-1.2.3 → maxapi_python-1.2.4}/LICENSE +0 -0
  49. {maxapi_python-1.2.3 → maxapi_python-1.2.4}/assets/icon.svg +0 -0
  50. {maxapi_python-1.2.3 → maxapi_python-1.2.4}/assets/logo.svg +0 -0
  51. {maxapi_python-1.2.3 → maxapi_python-1.2.4}/examples/example.py +0 -0
  52. {maxapi_python-1.2.3 → maxapi_python-1.2.4}/examples/telegram_bridge.py +0 -0
  53. {maxapi_python-1.2.3 → maxapi_python-1.2.4}/pytest.ini +0 -0
  54. {maxapi_python-1.2.3 → maxapi_python-1.2.4}/redocs/Makefile +0 -0
  55. {maxapi_python-1.2.3 → maxapi_python-1.2.4}/redocs/build.sh +0 -0
  56. {maxapi_python-1.2.3 → maxapi_python-1.2.4}/redocs/make.bat +0 -0
  57. {maxapi_python-1.2.3 → maxapi_python-1.2.4}/redocs/source/_static/logo.svg +0 -0
  58. {maxapi_python-1.2.3 → maxapi_python-1.2.4}/redocs/source/decorators.rst +0 -0
  59. {maxapi_python-1.2.3 → maxapi_python-1.2.4}/redocs/source/types.rst +0 -0
  60. {maxapi_python-1.2.3 → maxapi_python-1.2.4}/ruff.toml +0 -0
  61. {maxapi_python-1.2.3 → maxapi_python-1.2.4}/src/pymax/__init__.py +0 -0
  62. {maxapi_python-1.2.3 → maxapi_python-1.2.4}/src/pymax/crud.py +0 -0
  63. {maxapi_python-1.2.3 → maxapi_python-1.2.4}/src/pymax/exceptions.py +0 -0
  64. {maxapi_python-1.2.3 → maxapi_python-1.2.4}/src/pymax/filters.py +0 -0
  65. {maxapi_python-1.2.3 → maxapi_python-1.2.4}/src/pymax/formatter.py +0 -0
  66. {maxapi_python-1.2.3 → maxapi_python-1.2.4}/src/pymax/formatting.py +0 -0
  67. {maxapi_python-1.2.3 → maxapi_python-1.2.4}/src/pymax/mixins/__init__.py +0 -0
  68. {maxapi_python-1.2.3 → maxapi_python-1.2.4}/src/pymax/models.py +0 -0
  69. {maxapi_python-1.2.3 → maxapi_python-1.2.4}/src/pymax/navigation.py +0 -0
@@ -1,10 +1,10 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: maxapi-python
3
- Version: 1.2.3
3
+ Version: 1.2.4
4
4
  Summary: Python wrapper для API мессенджера Max
5
- Project-URL: Homepage, https://github.com/ink-developer/PyMax
6
- Project-URL: Repository, https://github.com/ink-developer/PyMax
7
- Project-URL: Issues, https://github.com/ink-developer/PyMax/issues
5
+ Project-URL: Homepage, https://github.com/MaxApiTeam/PyMax
6
+ Project-URL: Repository, https://github.com/MaxApiTeam/PyMax
7
+ Project-URL: Issues, https://github.com/MaxApiTeam/PyMax/issues
8
8
  Author-email: ink <mail@gmail.com>
9
9
  License-Expression: MIT
10
10
  License-File: LICENSE
@@ -18,6 +18,7 @@ Requires-Dist: lz4>=4.4.4
18
18
  Requires-Dist: msgpack>=1.1.1
19
19
  Requires-Dist: qrcode>=8.2
20
20
  Requires-Dist: sqlmodel>=0.0.24
21
+ Requires-Dist: ua-generator>=2.0.19
21
22
  Requires-Dist: websockets>=15.0
22
23
  Provides-Extra: test
23
24
  Requires-Dist: flake8; extra == 'test'
@@ -36,6 +37,10 @@ Description-Content-Type: text/markdown
36
37
  <strong>Python wrapper для API мессенджера Max</strong>
37
38
  </p>
38
39
 
40
+ > [!IMPORTANT]
41
+ > (29.12.2025) Снова неожиданное изменение апи, теперь `MaxClient` с `device_type` любым кроме `WEB` не работает, для вохда по номеру телефона используйте `SocketMaxClient`
42
+
43
+
39
44
  <p align="center">
40
45
  <img src="https://img.shields.io/badge/python-3.10+-3776AB.svg" alt="Python 3.11+">
41
46
  <img src="https://img.shields.io/badge/License-MIT-2f9872.svg" alt="License: MIT">
@@ -92,12 +97,12 @@ uv add -U maxapi-python
92
97
  **Вход по номеру телефона (DESKTOP):**
93
98
 
94
99
  ```python
95
- from pymax import MaxClient
100
+ from pymax import SocketMaxClient
96
101
  from pymax.payloads import UserAgentPayload
97
102
 
98
103
  ua = UserAgentPayload(device_type="DESKTOP", app_version="25.12.13")
99
104
 
100
- client = MaxClient(
105
+ client = SocketMaxClient(
101
106
  phone="+79111111111",
102
107
  work_dir="cache",
103
108
  headers=ua,
@@ -195,6 +200,6 @@ if __name__ == "__main__":
195
200
 
196
201
  Спасибо всем за помощь в разработке!
197
202
 
198
- <a href="https://github.com/ink-developer/PyMax/graphs/contributors">
203
+ <a href="https://github.com/MaxApiTeam/PyMax/graphs/contributors">
199
204
  <img src="https://contrib.rocks/image?repo=ink-developer/PyMax" />
200
205
  </a>
@@ -6,6 +6,10 @@
6
6
  <strong>Python wrapper для API мессенджера Max</strong>
7
7
  </p>
8
8
 
9
+ > [!IMPORTANT]
10
+ > (29.12.2025) Снова неожиданное изменение апи, теперь `MaxClient` с `device_type` любым кроме `WEB` не работает, для вохда по номеру телефона используйте `SocketMaxClient`
11
+
12
+
9
13
  <p align="center">
10
14
  <img src="https://img.shields.io/badge/python-3.10+-3776AB.svg" alt="Python 3.11+">
11
15
  <img src="https://img.shields.io/badge/License-MIT-2f9872.svg" alt="License: MIT">
@@ -62,12 +66,12 @@ uv add -U maxapi-python
62
66
  **Вход по номеру телефона (DESKTOP):**
63
67
 
64
68
  ```python
65
- from pymax import MaxClient
69
+ from pymax import SocketMaxClient
66
70
  from pymax.payloads import UserAgentPayload
67
71
 
68
72
  ua = UserAgentPayload(device_type="DESKTOP", app_version="25.12.13")
69
73
 
70
- client = MaxClient(
74
+ client = SocketMaxClient(
71
75
  phone="+79111111111",
72
76
  work_dir="cache",
73
77
  headers=ua,
@@ -165,6 +169,6 @@ if __name__ == "__main__":
165
169
 
166
170
  Спасибо всем за помощь в разработке!
167
171
 
168
- <a href="https://github.com/ink-developer/PyMax/graphs/contributors">
172
+ <a href="https://github.com/MaxApiTeam/PyMax/graphs/contributors">
169
173
  <img src="https://contrib.rocks/image?repo=ink-developer/PyMax" />
170
174
  </a>
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "maxapi-python"
3
- version = "1.2.3"
3
+ version = "1.2.4"
4
4
  description = "Python wrapper для API мессенджера Max"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.10"
@@ -19,12 +19,13 @@ dependencies = [
19
19
  "aiohttp>=3.12.15",
20
20
  "aiofiles>=24.1.0",
21
21
  "qrcode>=8.2",
22
+ "ua-generator>=2.0.19",
22
23
  ]
23
24
 
24
25
  [project.urls]
25
- Homepage = "https://github.com/ink-developer/PyMax"
26
- Repository = "https://github.com/ink-developer/PyMax"
27
- Issues = "https://github.com/ink-developer/PyMax/issues"
26
+ Homepage = "https://github.com/MaxApiTeam/PyMax"
27
+ Repository = "https://github.com/MaxApiTeam/PyMax"
28
+ Issues = "https://github.com/MaxApiTeam/PyMax/issues"
28
29
 
29
30
  [build-system]
30
31
  requires = ["hatchling"]
@@ -0,0 +1,252 @@
1
+ Clients
2
+ =======
3
+
4
+ Выбор между MaxClient и SocketMaxClient
5
+ ----------------------------------------
6
+
7
+ PyMax предоставляет два клиента с разной функциональностью в зависимости от выбранного протокола подключения:
8
+
9
+ .. list-table:: Сравнение клиентов
10
+ :widths: 30 35 35
11
+ :header-rows: 1
12
+
13
+ * - Функция
14
+ - MaxClient (WebSocket)
15
+ - SocketMaxClient (Socket)
16
+ * - Протокол подключения
17
+ - WebSocket
18
+ - TCP Socket
19
+ * - Способ авторизации
20
+ - Вход по QR-коду
21
+ - Вход/регистрация по номеру телефона
22
+ * - Регистрация новых пользователей
23
+ - ❌ Не поддерживается
24
+ - ✅ Поддерживается
25
+ * - Скорость подключения
26
+ - Быстрое
27
+ - Медленнее
28
+ * - Рекомендуемое использование
29
+ - Базовые боты и приложения
30
+ - Массовая регистрация, системная авторизация
31
+
32
+ MaxClient
33
+ ---------
34
+
35
+ Основной асинхронный WebSocket клиент для взаимодействия с Max API.
36
+
37
+ **Поддерживаемые методы авторизации:**
38
+ - ✅ Вход по QR-коду (WEB device_type)
39
+ - ❌ Вход по номеру телефона (больше не поддерживается)
40
+ - ❌ Регистрация по номеру телефона
41
+
42
+ Инициализация:
43
+
44
+ .. code-block:: python
45
+
46
+ from pymax import MaxClient
47
+
48
+ client = MaxClient(
49
+ phone="+79001234567", # Номер телефона (обязательно)
50
+ work_dir="./cache", # Папка для кэша сессии
51
+ reconnect=True, # Автоматическое переподключение
52
+ send_fake_telemetry=True, # Отправлять телеметрию
53
+ logger=None, # Пользовательский логгер
54
+ )
55
+
56
+ .. note::
57
+
58
+ MaxClient по умолчанию использует **WEB** device_type и поддерживает только вход по QR-коду.
59
+ Это является рекомендуемым способом авторизации для большинства приложений.
60
+
61
+ Основные методы:
62
+
63
+ .. code-block:: python
64
+
65
+ # Запустить клиент
66
+ await client.start()
67
+
68
+ # Закрыть клиент
69
+ await client.close()
70
+
71
+ # Получить информацию о чате
72
+ chat = await client.get_chat(chat_id=123456)
73
+ chats = await client.get_chats([123, 456])
74
+
75
+ # Получить информацию о пользователе
76
+ user = await client.get_user(user_id=789012)
77
+
78
+ # Отправить сообщение
79
+ result = await client.send_message(
80
+ chat_id=123456,
81
+ text="Сообщение"
82
+ )
83
+
84
+ # Редактировать сообщение
85
+ await client.edit_message(
86
+ chat_id=123456,
87
+ message_id=msg_id,
88
+ text="Новый текст"
89
+ )
90
+
91
+ # Удалить сообщение
92
+ await client.delete_message(
93
+ chat_id=123456,
94
+ message_id=msg_id
95
+ )
96
+
97
+ # Получить историю сообщений
98
+ history = await client.fetch_history(
99
+ chat_id=123456,
100
+ limit=50
101
+ )
102
+
103
+ # Изменить профиль с загрузкой фото
104
+ result = await client.change_profile(
105
+ first_name="Иван",
106
+ last_name="Петров",
107
+ description="Привет!",
108
+ photo=Photo(...) # Новая фотография профиля
109
+ )
110
+
111
+ # Разрешить группу по ссылке
112
+ group = await client.resolve_group_by_link(
113
+ link="https://max.app/g/ABC123"
114
+ )
115
+
116
+ Свойства:
117
+
118
+ .. code-block:: python
119
+
120
+ client.me # Информация о себе (Me)
121
+ client.is_connected # Статус подключения (bool)
122
+ client.chats # Список всех чатов (list[Chat])
123
+ client.dialogs # Список диалогов (list[Dialog])
124
+ client.channels # Список каналов (list[Channel])
125
+ client.phone # Номер телефона (str)
126
+ client.token # Токен сессии (str | None)
127
+ client.contacts # Список контактов (list[User])
128
+
129
+ Обработчики событий:
130
+
131
+ .. code-block:: python
132
+
133
+ @client.on_start
134
+ async def on_start():
135
+ """При запуске клиента"""
136
+ pass
137
+
138
+
139
+ @client.on_message()
140
+ async def on_message(message: Message):
141
+ """При получении сообщения"""
142
+ pass
143
+
144
+
145
+ Контекстный менеджер:
146
+
147
+ .. code-block:: python
148
+
149
+ async with MaxClient(phone="+79001234567") as client:
150
+ # Клиент автоматически подключён
151
+ await client.send_message(chat_id=123456, text="Привет!")
152
+ # Клиент автоматически закроется
153
+
154
+ Автоматическое подключение/отключение:
155
+
156
+ .. code-block:: python
157
+
158
+ client = MaxClient(phone="+79001234567", reconnect=True)
159
+
160
+ # Клиент автоматически переподключится при разрыве соединения
161
+ await client.start()
162
+
163
+ Документация API
164
+ ----------------
165
+
166
+ .. autoclass:: pymax.MaxClient
167
+ :members:
168
+ :inherited-members:
169
+
170
+ SocketMaxClient
171
+ ---------------
172
+
173
+ Асинхронный TCP Socket клиент для взаимодействия с Max API. Используется для входа и регистрации по номеру телефона.
174
+
175
+ **Поддерживаемые методы авторизации:**
176
+ - ✅ Вход по номеру телефона (DESKTOP, ANDROID, IOS device_types)
177
+ - ✅ Регистрация нового пользователя по номеру телефона
178
+
179
+ **Когда использовать SocketMaxClient:**
180
+ - Необходимо зарегистрировать новых пользователей
181
+ - Требуется вход по номеру телефона (без QR-кода)
182
+ - Необходимо использовать DESKTOP, ANDROID или IOS device_types
183
+ - Разрабатываете системы массовой регистрации или авторизации
184
+ - Нужна автоматизация входа (вход по номеру телефона удобнее для автоматизации, чем сканирование QR-кода)
185
+
186
+ .. note::
187
+
188
+ **SocketMaxClient — это полноценный и рекомендуемый способ авторизации!**
189
+
190
+ Не воспринимайте Socket клиент как что-то вспомогательное или альтернативное.
191
+ Вход по номеру телефона — это основной способ авторизации в Max, и ``SocketMaxClient`` обеспечивает надежный доступ к этому функционалу.
192
+
193
+ Для многих сценариев (особенно для автоматизации и интеграции) вход по номеру телефона **удобнее и практичнее**, чем сканирование QR-кода.
194
+
195
+ Инициализация и вход:
196
+
197
+ .. code-block:: python
198
+
199
+ from pymax import SocketMaxClient
200
+ from pymax.payloads import UserAgentPayload
201
+
202
+ # Для входа по номеру телефона
203
+ client = SocketMaxClient(
204
+ phone="+79001234567",
205
+ work_dir="./cache",
206
+ headers=UserAgentPayload(device_type="DESKTOP"),
207
+ )
208
+
209
+ await client.start() # Потребуется ввести код подтверждения
210
+
211
+ Регистрация нового пользователя:
212
+
213
+ .. code-block:: python
214
+
215
+ from pymax import SocketMaxClient
216
+ from pymax.payloads import UserAgentPayload
217
+
218
+ client = SocketMaxClient(
219
+ phone="+79001234567",
220
+ registration=True, # Флаг регистрации
221
+ first_name="Иван",
222
+ last_name="Петров",
223
+ headers=UserAgentPayload(device_type="DESKTOP"),
224
+ )
225
+
226
+ await client.start() # Потребуется ввести код подтверждения
227
+
228
+ .. important::
229
+
230
+ SocketMaxClient должен использоваться для:
231
+
232
+ 1. **Регистрации новых пользователей** — MaxClient не поддерживает регистрацию
233
+ 2. **Входа по номеру телефона** — требуется phone verification код
234
+ 3. **Системной авторизации** — когда QR-код недоступен или неудобен
235
+ 4. **Автоматизации** — вход по номеру телефона легче автоматизировать
236
+
237
+ .. note::
238
+
239
+ После успешной авторизации через SocketMaxClient вы можете сохранить токен и использовать его с MaxClient для более быстрого подключения к WebSocket API.
240
+
241
+ .. code-block:: python
242
+
243
+ # Первый раз: получаем токен через Socket
244
+ socket_client = SocketMaxClient(phone="+79001234567")
245
+ await socket_client.start()
246
+ token = socket_client.token
247
+
248
+ # Сохраняем токен
249
+
250
+ # Следующие разы: используем токен с WebSocket клиентом
251
+ ws_client = MaxClient(phone="+79001234567", token=token)
252
+ await ws_client.start()
@@ -6,7 +6,7 @@ import sys
6
6
  project = "PyMax"
7
7
  author = "ink-developer"
8
8
  copyright = "2025, ink-developer"
9
- release = "1.1.21"
9
+ release = "1.2.4"
10
10
 
11
11
  # -- Path setup ---------------------------------------------------------------
12
12
  sys.path.insert(0, os.path.abspath("../../src"))
@@ -38,7 +38,7 @@ Greeter Bot
38
38
 
39
39
  client = MaxClient(phone="+79001234567")
40
40
 
41
- @client.on_message(Filters.private())
41
+ @client.on_message(Filters.chat(123))
42
42
  async def greet(message):
43
43
  user = await client.get_user(message.sender)
44
44
  if user and user.names:
@@ -150,13 +150,8 @@ File Manager
150
150
  for attach in message.attaches:
151
151
  if attach.type == AttachType.PHOTO:
152
152
  print("Получено фото!")
153
- file_info = await client.get_file_by_id(
154
- chat_id=message.chat_id,
155
- message_id=message.id,
156
- file_id=attach.file_id
157
- )
158
- if file_info:
159
- print(f"URL: {file_info.url}")
153
+
154
+ print(f"URL: {attach.base_url}")
160
155
 
161
156
  @client.on_message(Filters.text("файл"))
162
157
  async def send_file(message):
@@ -93,11 +93,6 @@ Guides
93
93
  async def greeting(message: Message) -> None:
94
94
  pass
95
95
 
96
- # Только личные
97
- @client.on_message(Filters.dialog())
98
- async def private(message: Message) -> None:
99
- pass
100
-
101
96
  # Только группы
102
97
  @client.on_message(Filters.chat())
103
98
  async def in_group(message: Message) -> None:
@@ -5,6 +5,7 @@
5
5
  .. image:: _static/logo.svg
6
6
  :align: center
7
7
  :width: 320px
8
+
8
9
  PyMax
9
10
  =====
10
11
 
@@ -34,6 +35,7 @@ PyMax
34
35
  decorators
35
36
  examples
36
37
  guides
38
+ release_notes
37
39
 
38
40
  .. rubric:: Особенности
39
41
 
@@ -41,6 +43,10 @@ PyMax
41
43
  - Отправка / редактирование / удаление сообщений
42
44
  - Управление чатами, каналами и диалогами
43
45
  - Получение истории сообщений
46
+ - Загрузка фотографий профиля
47
+ - Разрешение групп по ссылке
48
+ - Поддержка контактов в сообщениях
49
+ - Управление списком контактов
44
50
 
45
51
  ---
46
52
 
@@ -97,7 +103,7 @@ Disclaimer
97
103
  Star History
98
104
  ------------
99
105
 
100
- .. image:: https://api.star-history.com/svg?repos=ink-developer/PyMax&type=date&legend=top-left
106
+ .. image:: https://api.star-history.com/svg?repos=MaxApiTeam/PyMax&type=date&legend=top-left
101
107
 
102
108
  Авторы
103
109
  ------
@@ -108,5 +114,5 @@ Star History
108
114
  Контрибьюторы
109
115
  -------------
110
116
 
111
- .. image:: https://contrib.rocks/image?repo=ink-developer/PyMax
117
+ .. image:: https://contrib.rocks/image?repo=MaxApiTeam/PyMax
112
118
  :alt: Contributors
@@ -49,7 +49,7 @@ UV — это быстрый пакетный менеджер, написанн
49
49
 
50
50
  .. code-block:: bash
51
51
 
52
- git clone https://github.com/ink-developer/PyMax.git
52
+ git clone https://github.com/MaxApiTeam/PyMax.git
53
53
  cd PyMax
54
54
  pip install -e .
55
55
 
@@ -57,7 +57,7 @@ UV — это быстрый пакетный менеджер, написанн
57
57
 
58
58
  .. code-block:: bash
59
59
 
60
- git clone https://github.com/ink-developer/PyMax.git
60
+ git clone https://github.com/MaxApiTeam/PyMax.git
61
61
  cd PyMax
62
62
  uv sync
63
63
 
@@ -10,10 +10,29 @@ Quick Start
10
10
 
11
11
  pip install -U maxapi-python
12
12
 
13
+ Выбор клиента
14
+ --------------
15
+
16
+ PyMax предоставляет два клиента для подключения к Max API:
17
+
18
+ **MaxClient (WebSocket)** — рекомендуется для большинства приложений:
19
+ - Используется WebSocket протокол
20
+ - Вход по QR-коду
21
+ - Более быстрое подключение
22
+ - Подходит для ботов, помощников и приложений
23
+
24
+ **SocketMaxClient (TCP Socket)** — для специальных случаев:
25
+ - Используется TCP Socket протокол
26
+ - Вход по номеру телефона
27
+ - Поддерживает регистрацию новых пользователей
28
+ - Требуется, если вы регистрируете новых пользователей или нужен вход по phone number
29
+
30
+ Для получения полной информации смотрите :doc:`clients`.
31
+
13
32
  Первый бот: Echo
14
33
  ----------------
15
34
 
16
- Самый простой бот — повторяет сообщения пользователя:
35
+ Самый простой бот — повторяет сообщения пользователя (используя MaxClient):
17
36
 
18
37
  .. code-block:: python
19
38
 
@@ -40,7 +59,7 @@ Quick Start
40
59
 
41
60
  python bot.py
42
61
 
43
- При первом запуске вам потребуется ввести код подтверждения из приложения Max.
62
+ При первом запуске вам потребуется отсканировать QR-код из приложения Max.
44
63
 
45
64
  Фильтры сообщений
46
65
  ------------------
@@ -68,10 +87,6 @@ Quick Start
68
87
  text="И тебе привет!"
69
88
  )
70
89
 
71
- # Только личные сообщения
72
- @client.on_message(Filters.dialog())
73
- async def private_handler(message: Message) -> None:
74
- print(f"Личное сообщение: {message.text}")
75
90
 
76
91
  Обработчики событий
77
92
  --------------------
@@ -0,0 +1,143 @@
1
+ Release Notes v1.2.4
2
+ ====================
3
+
4
+ Новые функции
5
+ -------------
6
+
7
+ **Поддержка различных типов файлов в классах File и Photo**
8
+ Классы ``Photo``, ``File`` и ``Video`` теперь поддерживают работу с байтами, что позволяет загружать файлы из памяти напрямую.
9
+
10
+ **Автоматическая отправка уведомлений о прочтении сообщений**
11
+ Клиент теперь автоматически отправляет сервису уведомления о получении сообщений для улучшения синхронизации.
12
+
13
+ **Параметр session_name для управления сессией**
14
+ Параметр ``session_name`` позволяет указать пользовательское имя файла для сохранения сессии.
15
+
16
+ **Получение текущей версии веб-приложения**
17
+ Новый метод ``get_current_web_version()`` в утилитах для получения текущей версии веб-приложения Max.
18
+
19
+ **Улучшенная генерация User-Agent**
20
+ Теперь используется библиотека ``ua-generator`` для более реалистичной генерации User-Agent строк и параметров устройства.
21
+
22
+ Новые методы
23
+ ------------
24
+
25
+ read_message(chat_id: int, message_id: int) -> ReadState
26
+ Отмечает сообщение как прочитанное. Возвращает объект ReadState с информацией о состоянии.
27
+
28
+ pymax.utils.MixinsUtils.get_current_web_version() -> str | None
29
+ Получает текущую версию веб-приложения Max из источника. Возвращает версию в формате "XX.XX.XX" или None.
30
+
31
+ Измененные методы
32
+ -----------------
33
+
34
+ MaxClient.start()
35
+ Улучшена логика работы цикла переподключения с использованием ``asyncio.Event`` для более чистого завершения.
36
+ Исправлена обработка состояния при отключении и переподключении.
37
+
38
+ MaxClient.close()
39
+ Упрощена логика закрытия клиента. Теперь использует ``asyncio.Event`` для сигнала остановки.
40
+
41
+ Новые параметры
42
+ ---------------
43
+
44
+ MaxClient.__init__(session_name: str = "session.db")
45
+ Позволяет указать пользовательское имя файла базы данных сессии.
46
+
47
+ Измененные типы
48
+ ---------------
49
+
50
+ BaseFile
51
+ Теперь поддерживает работу с байтами через параметр ``raw`` во всех подклассах.
52
+
53
+ Photo
54
+ Добавлен параметр ``name`` для явного указания имени файла при работе с байтами.
55
+ Улучшена валидация расширений файлов.
56
+
57
+ File
58
+ Добавлена поддержка работы с байтами через параметр ``raw``.
59
+ Улучшена обработка имен файлов.
60
+
61
+ Video
62
+ Добавлена поддержка работы с байтами через параметр ``raw``.
63
+ Улучшена работа с видеофайлами.
64
+
65
+ Исправления и улучшения
66
+ ------------------------
67
+
68
+ - Добавлена валидация ``device_type`` для MaxClient (поддерживает только WEB) и SocketMaxClient (поддерживает ANDROID, IOS, DESKTOP)
69
+ - Улучшена обработка ошибок WebSocket при отключении
70
+ - Добавлена опция ``ua-generator`` для более реалистичной генерации параметров устройства
71
+ - Обновлена версия приложения до 25.12.14
72
+ - Улучшена обработка уведомлений о доставке сообщений
73
+ - Исправлены проблемы с завершением async задач при закрытии клиента
74
+
75
+ Зависимости
76
+ -----------
77
+
78
+ Добавлены новые зависимости:
79
+ - ``ua-generator>=2.0.19`` — для генерации реалистичных User-Agent строк и параметров устройства
80
+
81
+ Версия
82
+ ------
83
+
84
+ **1.2.4** - выпущена 30 декабря 2025 г.
85
+
86
+ ---
87
+
88
+ Release Notes v1.2.3
89
+ ====================
90
+
91
+ Новые функции
92
+ -------------
93
+
94
+ **Загрузка фотографий профиля**
95
+ Профиль теперь может быть обновлен с загрузкой новой фотографии через метод ``change_profile()``.
96
+
97
+ **Разрешение групп по ссылке**
98
+ Группы теперь могут быть разрешены (получены) прямо по их ссылке через метод ``resolve_group_by_link()``.
99
+
100
+ **Поддержка контактов в сообщениях**
101
+ Сообщения теперь поддерживают вложения типа контакта с информацией о контакте (ContactAttach).
102
+
103
+ **Список контактов клиента**
104
+ Клиент теперь ведет список всех контактов пользователя через свойство ``client.contacts``.
105
+
106
+ Новые методы
107
+ ------------
108
+
109
+ MaxClient.resolve_group_by_link(link: str) -> Chat | None
110
+ Разрешает группу по ссылке. Возвращает объект чата группы или None, если не найдено.
111
+
112
+ MaxClient.change_profile(first_name, last_name, description, photo)
113
+ Изменяет информацию профиля текущего пользователя, включая загрузку новой фотографии.
114
+
115
+ Новые типы
116
+ ----------
117
+
118
+ ContactAttach
119
+ Представляет контакт в сообщении. Содержит информацию о контакте (ID, имя, фамилия, фото).
120
+
121
+ Измененные типы
122
+ ---------------
123
+
124
+ Message
125
+ Теперь поддерживает вложения типа ContactAttach в список attaches.
126
+
127
+ Names
128
+ Улучшен для работы с различными форматами имен пользователя.
129
+
130
+ StickerAttach
131
+ Улучшено представление стикеров в сообщениях.
132
+
133
+ Photo
134
+ Улучшено для работы с фотографиями профиля.
135
+
136
+ AttachType
137
+ Добавлено значение CONTACT для контактов.
138
+
139
+ Новые параметры
140
+ ---------------
141
+
142
+ MaxClient.contacts: list[User]
143
+ Список контактов текущего пользователя.