maxapi-python 1.2.2__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.2 → maxapi_python-1.2.4}/PKG-INFO +12 -7
- {maxapi_python-1.2.2 → maxapi_python-1.2.4}/README.md +7 -3
- maxapi_python-1.2.4/examples/example.py +74 -0
- {maxapi_python-1.2.2 → maxapi_python-1.2.4}/pyproject.toml +5 -4
- maxapi_python-1.2.4/redocs/source/clients.rst +252 -0
- {maxapi_python-1.2.2 → maxapi_python-1.2.4}/redocs/source/conf.py +1 -1
- {maxapi_python-1.2.2 → maxapi_python-1.2.4}/redocs/source/examples.rst +3 -8
- {maxapi_python-1.2.2 → maxapi_python-1.2.4}/redocs/source/guides.rst +0 -5
- {maxapi_python-1.2.2 → maxapi_python-1.2.4}/redocs/source/index.rst +8 -2
- {maxapi_python-1.2.2 → maxapi_python-1.2.4}/redocs/source/installation.rst +2 -2
- {maxapi_python-1.2.2 → 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.2 → maxapi_python-1.2.4}/src/pymax/core.py +55 -37
- {maxapi_python-1.2.2 → maxapi_python-1.2.4}/src/pymax/files.py +33 -7
- maxapi_python-1.2.2/src/pymax/mixins/websocket.py → maxapi_python-1.2.4/src/pymax/interfaces.py +191 -130
- {maxapi_python-1.2.2 → maxapi_python-1.2.4}/src/pymax/mixins/auth.py +2 -2
- {maxapi_python-1.2.2 → maxapi_python-1.2.4}/src/pymax/mixins/channel.py +3 -5
- {maxapi_python-1.2.2 → maxapi_python-1.2.4}/src/pymax/mixins/group.py +33 -14
- {maxapi_python-1.2.2 → maxapi_python-1.2.4}/src/pymax/mixins/handler.py +4 -10
- {maxapi_python-1.2.2 → maxapi_python-1.2.4}/src/pymax/mixins/message.py +64 -88
- {maxapi_python-1.2.2 → maxapi_python-1.2.4}/src/pymax/mixins/scheduler.py +1 -1
- {maxapi_python-1.2.2 → maxapi_python-1.2.4}/src/pymax/mixins/self.py +76 -11
- maxapi_python-1.2.4/src/pymax/mixins/socket.py +297 -0
- {maxapi_python-1.2.2 → maxapi_python-1.2.4}/src/pymax/mixins/telemetry.py +2 -4
- {maxapi_python-1.2.2 → 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.2 → maxapi_python-1.2.4}/src/pymax/payloads.py +11 -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.2 → maxapi_python-1.2.4}/src/pymax/static/enum.py +6 -0
- {maxapi_python-1.2.2 → maxapi_python-1.2.4}/src/pymax/types.py +82 -28
- maxapi_python-1.2.4/src/pymax/utils.py +90 -0
- maxapi_python-1.2.2/examples/example.py +0 -268
- maxapi_python-1.2.2/examples/flt_test.py +0 -51
- maxapi_python-1.2.2/examples/large_file_upload.py +0 -51
- maxapi_python-1.2.2/examples/reg.py +0 -34
- maxapi_python-1.2.2/examples/test.py +0 -20
- maxapi_python-1.2.2/mkdocs.yml +0 -123
- maxapi_python-1.2.2/redocs/source/clients.rst +0 -148
- maxapi_python-1.2.2/src/pymax/interfaces.py +0 -256
- maxapi_python-1.2.2/src/pymax/mixins/socket.py +0 -620
- maxapi_python-1.2.2/src/pymax/mixins/utils.py +0 -27
- maxapi_python-1.2.2/src/pymax/static/constant.py +0 -28
- {maxapi_python-1.2.2 → maxapi_python-1.2.4}/.coderabbit.yaml +0 -0
- {maxapi_python-1.2.2 → maxapi_python-1.2.4}/.github/FUNDING.yml +0 -0
- {maxapi_python-1.2.2 → maxapi_python-1.2.4}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {maxapi_python-1.2.2 → maxapi_python-1.2.4}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {maxapi_python-1.2.2 → maxapi_python-1.2.4}/.github/ISSUE_TEMPLATE/refactor.md +0 -0
- {maxapi_python-1.2.2 → maxapi_python-1.2.4}/.github/pull_request_template.md +0 -0
- {maxapi_python-1.2.2 → maxapi_python-1.2.4}/.github/workflows/publish.yml +0 -0
- {maxapi_python-1.2.2 → maxapi_python-1.2.4}/.github/workflows/tests.yml +0 -0
- {maxapi_python-1.2.2 → maxapi_python-1.2.4}/.gitignore +0 -0
- {maxapi_python-1.2.2 → maxapi_python-1.2.4}/.pre-commit-config.yaml +0 -0
- {maxapi_python-1.2.2 → maxapi_python-1.2.4}/LICENSE +0 -0
- {maxapi_python-1.2.2 → maxapi_python-1.2.4}/assets/icon.svg +0 -0
- {maxapi_python-1.2.2 → maxapi_python-1.2.4}/assets/logo.svg +0 -0
- {maxapi_python-1.2.2 → maxapi_python-1.2.4}/examples/telegram_bridge.py +0 -0
- {maxapi_python-1.2.2 → maxapi_python-1.2.4}/pytest.ini +0 -0
- {maxapi_python-1.2.2 → maxapi_python-1.2.4}/redocs/Makefile +0 -0
- {maxapi_python-1.2.2 → maxapi_python-1.2.4}/redocs/build.sh +0 -0
- {maxapi_python-1.2.2 → maxapi_python-1.2.4}/redocs/make.bat +0 -0
- {maxapi_python-1.2.2 → maxapi_python-1.2.4}/redocs/source/_static/logo.svg +0 -0
- {maxapi_python-1.2.2 → maxapi_python-1.2.4}/redocs/source/decorators.rst +0 -0
- {maxapi_python-1.2.2 → maxapi_python-1.2.4}/redocs/source/types.rst +0 -0
- {maxapi_python-1.2.2 → maxapi_python-1.2.4}/ruff.toml +0 -0
- {maxapi_python-1.2.2 → maxapi_python-1.2.4}/src/pymax/__init__.py +0 -0
- {maxapi_python-1.2.2 → maxapi_python-1.2.4}/src/pymax/crud.py +0 -0
- {maxapi_python-1.2.2 → maxapi_python-1.2.4}/src/pymax/exceptions.py +0 -0
- {maxapi_python-1.2.2 → maxapi_python-1.2.4}/src/pymax/filters.py +0 -0
- {maxapi_python-1.2.2 → maxapi_python-1.2.4}/src/pymax/formatter.py +0 -0
- {maxapi_python-1.2.2 → maxapi_python-1.2.4}/src/pymax/formatting.py +0 -0
- {maxapi_python-1.2.2 → maxapi_python-1.2.4}/src/pymax/mixins/__init__.py +0 -0
- {maxapi_python-1.2.2 → maxapi_python-1.2.4}/src/pymax/models.py +0 -0
- {maxapi_python-1.2.2 → 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>
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import asyncio
|
|
2
|
+
import datetime
|
|
3
|
+
import logging
|
|
4
|
+
from time import time
|
|
5
|
+
from typing import Any
|
|
6
|
+
|
|
7
|
+
import pymax
|
|
8
|
+
from pymax import MaxClient, Message, ReactionInfo, SocketMaxClient, filters
|
|
9
|
+
from pymax.files import File, Photo, Video
|
|
10
|
+
from pymax.filters import Filters
|
|
11
|
+
from pymax.payloads import UserAgentPayload
|
|
12
|
+
from pymax.static.enum import AttachType, Opcode
|
|
13
|
+
from pymax.types import Chat
|
|
14
|
+
|
|
15
|
+
phone = "+79991234567"
|
|
16
|
+
headers = UserAgentPayload(device_type="WEB")
|
|
17
|
+
|
|
18
|
+
client = MaxClient(
|
|
19
|
+
phone=phone,
|
|
20
|
+
work_dir="cache",
|
|
21
|
+
reconnect=False,
|
|
22
|
+
logger=None,
|
|
23
|
+
headers=headers,
|
|
24
|
+
)
|
|
25
|
+
client.logger.setLevel(logging.INFO)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
@client.on_start
|
|
29
|
+
async def handle_start() -> None:
|
|
30
|
+
print(f"Client started as {client.me.names[0].first_name}!")
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
@client.on_raw_receive
|
|
34
|
+
async def handle_raw_receive(data: dict[str, Any]) -> None:
|
|
35
|
+
print(f"Raw data received: {data}")
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
@client.on_reaction_change
|
|
39
|
+
async def handle_reaction_change(
|
|
40
|
+
message_id: str, chat_id: int, reaction_info: ReactionInfo
|
|
41
|
+
) -> None:
|
|
42
|
+
print(
|
|
43
|
+
f"Reaction changed on message {message_id} in chat {chat_id}: "
|
|
44
|
+
f"Total count: {reaction_info.total_count}, "
|
|
45
|
+
f"Your reaction: {reaction_info.your_reaction}, "
|
|
46
|
+
f"Counters: {reaction_info.counters[0].reaction}={reaction_info.counters[0].count}"
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
@client.on_chat_update
|
|
51
|
+
async def handle_chat_update(chat: Chat) -> None:
|
|
52
|
+
print(f"Chat updated: {chat.id}, new title: {chat.title}")
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
@client.on_message(Filters.chat(0) & Filters.text("hello"))
|
|
56
|
+
async def handle_message(message: Message) -> None:
|
|
57
|
+
print(f"New message in chat {message.chat_id} from {message.sender}: {message.text}")
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
@client.on_message_edit()
|
|
61
|
+
async def handle_edited_message(message: Message) -> None:
|
|
62
|
+
print(f"Edited message in chat {message.chat_id}: {message.text}")
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
@client.on_message_delete()
|
|
66
|
+
async def handle_deleted_message(message: Message) -> None:
|
|
67
|
+
print(f"Deleted message in chat {message.chat_id}: {message.id}")
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
if __name__ == "__main__":
|
|
71
|
+
try:
|
|
72
|
+
asyncio.run(client.start())
|
|
73
|
+
except KeyboardInterrupt:
|
|
74
|
+
print("Client stopped by user")
|
|
@@ -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
|
--------------------
|