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.
- {maxapi_python-1.2.3 → maxapi_python-1.2.4}/PKG-INFO +12 -7
- {maxapi_python-1.2.3 → maxapi_python-1.2.4}/README.md +7 -3
- {maxapi_python-1.2.3 → maxapi_python-1.2.4}/pyproject.toml +5 -4
- maxapi_python-1.2.4/redocs/source/clients.rst +252 -0
- {maxapi_python-1.2.3 → maxapi_python-1.2.4}/redocs/source/conf.py +1 -1
- {maxapi_python-1.2.3 → maxapi_python-1.2.4}/redocs/source/examples.rst +3 -8
- {maxapi_python-1.2.3 → maxapi_python-1.2.4}/redocs/source/guides.rst +0 -5
- {maxapi_python-1.2.3 → maxapi_python-1.2.4}/redocs/source/index.rst +8 -2
- {maxapi_python-1.2.3 → maxapi_python-1.2.4}/redocs/source/installation.rst +2 -2
- {maxapi_python-1.2.3 → maxapi_python-1.2.4}/redocs/source/quickstart.rst +21 -6
- maxapi_python-1.2.4/redocs/source/release_notes.rst +143 -0
- {maxapi_python-1.2.3 → maxapi_python-1.2.4}/src/pymax/core.py +54 -37
- {maxapi_python-1.2.3 → maxapi_python-1.2.4}/src/pymax/files.py +28 -7
- maxapi_python-1.2.3/src/pymax/mixins/websocket.py → maxapi_python-1.2.4/src/pymax/interfaces.py +182 -130
- {maxapi_python-1.2.3 → maxapi_python-1.2.4}/src/pymax/mixins/auth.py +2 -2
- {maxapi_python-1.2.3 → maxapi_python-1.2.4}/src/pymax/mixins/channel.py +3 -5
- {maxapi_python-1.2.3 → maxapi_python-1.2.4}/src/pymax/mixins/group.py +2 -2
- {maxapi_python-1.2.3 → maxapi_python-1.2.4}/src/pymax/mixins/handler.py +4 -10
- {maxapi_python-1.2.3 → maxapi_python-1.2.4}/src/pymax/mixins/message.py +64 -88
- {maxapi_python-1.2.3 → maxapi_python-1.2.4}/src/pymax/mixins/scheduler.py +1 -1
- {maxapi_python-1.2.3 → maxapi_python-1.2.4}/src/pymax/mixins/self.py +2 -2
- maxapi_python-1.2.4/src/pymax/mixins/socket.py +297 -0
- {maxapi_python-1.2.3 → maxapi_python-1.2.4}/src/pymax/mixins/telemetry.py +2 -4
- {maxapi_python-1.2.3 → maxapi_python-1.2.4}/src/pymax/mixins/user.py +3 -5
- maxapi_python-1.2.4/src/pymax/mixins/websocket.py +142 -0
- {maxapi_python-1.2.3 → maxapi_python-1.2.4}/src/pymax/payloads.py +8 -1
- maxapi_python-1.2.4/src/pymax/protocols.py +123 -0
- maxapi_python-1.2.4/src/pymax/static/constant.py +89 -0
- {maxapi_python-1.2.3 → maxapi_python-1.2.4}/src/pymax/static/enum.py +5 -0
- {maxapi_python-1.2.3 → maxapi_python-1.2.4}/src/pymax/types.py +25 -0
- maxapi_python-1.2.4/src/pymax/utils.py +90 -0
- maxapi_python-1.2.3/mkdocs.yml +0 -123
- maxapi_python-1.2.3/redocs/source/clients.rst +0 -148
- maxapi_python-1.2.3/src/pymax/interfaces.py +0 -257
- maxapi_python-1.2.3/src/pymax/mixins/socket.py +0 -630
- maxapi_python-1.2.3/src/pymax/mixins/utils.py +0 -27
- maxapi_python-1.2.3/src/pymax/static/constant.py +0 -28
- {maxapi_python-1.2.3 → maxapi_python-1.2.4}/.coderabbit.yaml +0 -0
- {maxapi_python-1.2.3 → maxapi_python-1.2.4}/.github/FUNDING.yml +0 -0
- {maxapi_python-1.2.3 → maxapi_python-1.2.4}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {maxapi_python-1.2.3 → maxapi_python-1.2.4}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {maxapi_python-1.2.3 → maxapi_python-1.2.4}/.github/ISSUE_TEMPLATE/refactor.md +0 -0
- {maxapi_python-1.2.3 → maxapi_python-1.2.4}/.github/pull_request_template.md +0 -0
- {maxapi_python-1.2.3 → maxapi_python-1.2.4}/.github/workflows/publish.yml +0 -0
- {maxapi_python-1.2.3 → maxapi_python-1.2.4}/.github/workflows/tests.yml +0 -0
- {maxapi_python-1.2.3 → maxapi_python-1.2.4}/.gitignore +0 -0
- {maxapi_python-1.2.3 → maxapi_python-1.2.4}/.pre-commit-config.yaml +0 -0
- {maxapi_python-1.2.3 → maxapi_python-1.2.4}/LICENSE +0 -0
- {maxapi_python-1.2.3 → maxapi_python-1.2.4}/assets/icon.svg +0 -0
- {maxapi_python-1.2.3 → maxapi_python-1.2.4}/assets/logo.svg +0 -0
- {maxapi_python-1.2.3 → maxapi_python-1.2.4}/examples/example.py +0 -0
- {maxapi_python-1.2.3 → maxapi_python-1.2.4}/examples/telegram_bridge.py +0 -0
- {maxapi_python-1.2.3 → maxapi_python-1.2.4}/pytest.ini +0 -0
- {maxapi_python-1.2.3 → maxapi_python-1.2.4}/redocs/Makefile +0 -0
- {maxapi_python-1.2.3 → maxapi_python-1.2.4}/redocs/build.sh +0 -0
- {maxapi_python-1.2.3 → maxapi_python-1.2.4}/redocs/make.bat +0 -0
- {maxapi_python-1.2.3 → maxapi_python-1.2.4}/redocs/source/_static/logo.svg +0 -0
- {maxapi_python-1.2.3 → maxapi_python-1.2.4}/redocs/source/decorators.rst +0 -0
- {maxapi_python-1.2.3 → maxapi_python-1.2.4}/redocs/source/types.rst +0 -0
- {maxapi_python-1.2.3 → maxapi_python-1.2.4}/ruff.toml +0 -0
- {maxapi_python-1.2.3 → maxapi_python-1.2.4}/src/pymax/__init__.py +0 -0
- {maxapi_python-1.2.3 → maxapi_python-1.2.4}/src/pymax/crud.py +0 -0
- {maxapi_python-1.2.3 → maxapi_python-1.2.4}/src/pymax/exceptions.py +0 -0
- {maxapi_python-1.2.3 → maxapi_python-1.2.4}/src/pymax/filters.py +0 -0
- {maxapi_python-1.2.3 → maxapi_python-1.2.4}/src/pymax/formatter.py +0 -0
- {maxapi_python-1.2.3 → maxapi_python-1.2.4}/src/pymax/formatting.py +0 -0
- {maxapi_python-1.2.3 → maxapi_python-1.2.4}/src/pymax/mixins/__init__.py +0 -0
- {maxapi_python-1.2.3 → maxapi_python-1.2.4}/src/pymax/models.py +0 -0
- {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
|
+
Version: 1.2.4
|
|
4
4
|
Summary: Python wrapper для API мессенджера Max
|
|
5
|
-
Project-URL: Homepage, https://github.com/
|
|
6
|
-
Project-URL: Repository, https://github.com/
|
|
7
|
-
Project-URL: Issues, https://github.com/
|
|
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
|
|
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 =
|
|
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/
|
|
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
|
|
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 =
|
|
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/
|
|
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
|
+
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/
|
|
26
|
-
Repository = "https://github.com/
|
|
27
|
-
Issues = "https://github.com/
|
|
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.
|
|
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.
|
|
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
|
-
|
|
154
|
-
|
|
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=
|
|
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=
|
|
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/
|
|
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/
|
|
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
|
-
При первом запуске вам потребуется
|
|
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
|
+
Список контактов текущего пользователя.
|