maxapi-python 1.2.3__tar.gz → 1.2.5__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.5}/PKG-INFO +9 -7
- {maxapi_python-1.2.3 → maxapi_python-1.2.5}/README.md +4 -3
- {maxapi_python-1.2.3 → maxapi_python-1.2.5}/pyproject.toml +5 -4
- maxapi_python-1.2.5/redocs/source/clients.rst +252 -0
- {maxapi_python-1.2.3 → maxapi_python-1.2.5}/redocs/source/conf.py +1 -1
- {maxapi_python-1.2.3 → maxapi_python-1.2.5}/redocs/source/examples.rst +3 -8
- {maxapi_python-1.2.3 → maxapi_python-1.2.5}/redocs/source/guides.rst +0 -5
- {maxapi_python-1.2.3 → maxapi_python-1.2.5}/redocs/source/index.rst +8 -2
- {maxapi_python-1.2.3 → maxapi_python-1.2.5}/redocs/source/installation.rst +2 -2
- {maxapi_python-1.2.3 → maxapi_python-1.2.5}/redocs/source/quickstart.rst +21 -6
- maxapi_python-1.2.5/redocs/source/release_notes.rst +61 -0
- maxapi_python-1.2.5/redocs/source/release_notes_archive.rst +141 -0
- {maxapi_python-1.2.3 → maxapi_python-1.2.5}/src/pymax/core.py +63 -38
- {maxapi_python-1.2.3 → maxapi_python-1.2.5}/src/pymax/files.py +28 -7
- maxapi_python-1.2.3/src/pymax/mixins/websocket.py → maxapi_python-1.2.5/src/pymax/interfaces.py +189 -131
- {maxapi_python-1.2.3 → maxapi_python-1.2.5}/src/pymax/mixins/auth.py +231 -5
- {maxapi_python-1.2.3 → maxapi_python-1.2.5}/src/pymax/mixins/channel.py +3 -5
- {maxapi_python-1.2.3 → maxapi_python-1.2.5}/src/pymax/mixins/group.py +2 -2
- {maxapi_python-1.2.3 → maxapi_python-1.2.5}/src/pymax/mixins/handler.py +4 -10
- {maxapi_python-1.2.3 → maxapi_python-1.2.5}/src/pymax/mixins/message.py +64 -88
- {maxapi_python-1.2.3 → maxapi_python-1.2.5}/src/pymax/mixins/scheduler.py +1 -1
- {maxapi_python-1.2.3 → maxapi_python-1.2.5}/src/pymax/mixins/self.py +2 -2
- maxapi_python-1.2.5/src/pymax/mixins/socket.py +306 -0
- {maxapi_python-1.2.3 → maxapi_python-1.2.5}/src/pymax/mixins/telemetry.py +10 -6
- {maxapi_python-1.2.3 → maxapi_python-1.2.5}/src/pymax/mixins/user.py +3 -5
- maxapi_python-1.2.5/src/pymax/mixins/websocket.py +151 -0
- {maxapi_python-1.2.3 → maxapi_python-1.2.5}/src/pymax/payloads.py +44 -1
- maxapi_python-1.2.5/src/pymax/protocols.py +123 -0
- maxapi_python-1.2.5/src/pymax/static/constant.py +96 -0
- {maxapi_python-1.2.3 → maxapi_python-1.2.5}/src/pymax/static/enum.py +65 -52
- {maxapi_python-1.2.3 → maxapi_python-1.2.5}/src/pymax/types.py +25 -0
- maxapi_python-1.2.5/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.5}/.coderabbit.yaml +0 -0
- {maxapi_python-1.2.3 → maxapi_python-1.2.5}/.github/FUNDING.yml +0 -0
- {maxapi_python-1.2.3 → maxapi_python-1.2.5}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {maxapi_python-1.2.3 → maxapi_python-1.2.5}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {maxapi_python-1.2.3 → maxapi_python-1.2.5}/.github/ISSUE_TEMPLATE/refactor.md +0 -0
- {maxapi_python-1.2.3 → maxapi_python-1.2.5}/.github/pull_request_template.md +0 -0
- {maxapi_python-1.2.3 → maxapi_python-1.2.5}/.github/workflows/publish.yml +0 -0
- {maxapi_python-1.2.3 → maxapi_python-1.2.5}/.github/workflows/tests.yml +0 -0
- {maxapi_python-1.2.3 → maxapi_python-1.2.5}/.gitignore +0 -0
- {maxapi_python-1.2.3 → maxapi_python-1.2.5}/.pre-commit-config.yaml +0 -0
- {maxapi_python-1.2.3 → maxapi_python-1.2.5}/LICENSE +0 -0
- {maxapi_python-1.2.3 → maxapi_python-1.2.5}/assets/icon.svg +0 -0
- {maxapi_python-1.2.3 → maxapi_python-1.2.5}/assets/logo.svg +0 -0
- {maxapi_python-1.2.3 → maxapi_python-1.2.5}/examples/example.py +0 -0
- {maxapi_python-1.2.3 → maxapi_python-1.2.5}/examples/telegram_bridge.py +0 -0
- {maxapi_python-1.2.3 → maxapi_python-1.2.5}/pytest.ini +0 -0
- {maxapi_python-1.2.3 → maxapi_python-1.2.5}/redocs/Makefile +0 -0
- {maxapi_python-1.2.3 → maxapi_python-1.2.5}/redocs/build.sh +0 -0
- {maxapi_python-1.2.3 → maxapi_python-1.2.5}/redocs/make.bat +0 -0
- {maxapi_python-1.2.3 → maxapi_python-1.2.5}/redocs/source/_static/logo.svg +0 -0
- {maxapi_python-1.2.3 → maxapi_python-1.2.5}/redocs/source/decorators.rst +0 -0
- {maxapi_python-1.2.3 → maxapi_python-1.2.5}/redocs/source/types.rst +0 -0
- {maxapi_python-1.2.3 → maxapi_python-1.2.5}/ruff.toml +0 -0
- {maxapi_python-1.2.3 → maxapi_python-1.2.5}/src/pymax/__init__.py +0 -0
- {maxapi_python-1.2.3 → maxapi_python-1.2.5}/src/pymax/crud.py +0 -0
- {maxapi_python-1.2.3 → maxapi_python-1.2.5}/src/pymax/exceptions.py +0 -0
- {maxapi_python-1.2.3 → maxapi_python-1.2.5}/src/pymax/filters.py +0 -0
- {maxapi_python-1.2.3 → maxapi_python-1.2.5}/src/pymax/formatter.py +0 -0
- {maxapi_python-1.2.3 → maxapi_python-1.2.5}/src/pymax/formatting.py +0 -0
- {maxapi_python-1.2.3 → maxapi_python-1.2.5}/src/pymax/mixins/__init__.py +0 -0
- {maxapi_python-1.2.3 → maxapi_python-1.2.5}/src/pymax/models.py +0 -0
- {maxapi_python-1.2.3 → maxapi_python-1.2.5}/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.5
|
|
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,7 @@ Description-Content-Type: text/markdown
|
|
|
36
37
|
<strong>Python wrapper для API мессенджера Max</strong>
|
|
37
38
|
</p>
|
|
38
39
|
|
|
40
|
+
|
|
39
41
|
<p align="center">
|
|
40
42
|
<img src="https://img.shields.io/badge/python-3.10+-3776AB.svg" alt="Python 3.11+">
|
|
41
43
|
<img src="https://img.shields.io/badge/License-MIT-2f9872.svg" alt="License: MIT">
|
|
@@ -92,12 +94,12 @@ uv add -U maxapi-python
|
|
|
92
94
|
**Вход по номеру телефона (DESKTOP):**
|
|
93
95
|
|
|
94
96
|
```python
|
|
95
|
-
from pymax import
|
|
97
|
+
from pymax import SocketMaxClient
|
|
96
98
|
from pymax.payloads import UserAgentPayload
|
|
97
99
|
|
|
98
100
|
ua = UserAgentPayload(device_type="DESKTOP", app_version="25.12.13")
|
|
99
101
|
|
|
100
|
-
client =
|
|
102
|
+
client = SocketMaxClient(
|
|
101
103
|
phone="+79111111111",
|
|
102
104
|
work_dir="cache",
|
|
103
105
|
headers=ua,
|
|
@@ -195,6 +197,6 @@ if __name__ == "__main__":
|
|
|
195
197
|
|
|
196
198
|
Спасибо всем за помощь в разработке!
|
|
197
199
|
|
|
198
|
-
<a href="https://github.com/
|
|
200
|
+
<a href="https://github.com/MaxApiTeam/PyMax/graphs/contributors">
|
|
199
201
|
<img src="https://contrib.rocks/image?repo=ink-developer/PyMax" />
|
|
200
202
|
</a>
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
<strong>Python wrapper для API мессенджера Max</strong>
|
|
7
7
|
</p>
|
|
8
8
|
|
|
9
|
+
|
|
9
10
|
<p align="center">
|
|
10
11
|
<img src="https://img.shields.io/badge/python-3.10+-3776AB.svg" alt="Python 3.11+">
|
|
11
12
|
<img src="https://img.shields.io/badge/License-MIT-2f9872.svg" alt="License: MIT">
|
|
@@ -62,12 +63,12 @@ uv add -U maxapi-python
|
|
|
62
63
|
**Вход по номеру телефона (DESKTOP):**
|
|
63
64
|
|
|
64
65
|
```python
|
|
65
|
-
from pymax import
|
|
66
|
+
from pymax import SocketMaxClient
|
|
66
67
|
from pymax.payloads import UserAgentPayload
|
|
67
68
|
|
|
68
69
|
ua = UserAgentPayload(device_type="DESKTOP", app_version="25.12.13")
|
|
69
70
|
|
|
70
|
-
client =
|
|
71
|
+
client = SocketMaxClient(
|
|
71
72
|
phone="+79111111111",
|
|
72
73
|
work_dir="cache",
|
|
73
74
|
headers=ua,
|
|
@@ -165,6 +166,6 @@ if __name__ == "__main__":
|
|
|
165
166
|
|
|
166
167
|
Спасибо всем за помощь в разработке!
|
|
167
168
|
|
|
168
|
-
<a href="https://github.com/
|
|
169
|
+
<a href="https://github.com/MaxApiTeam/PyMax/graphs/contributors">
|
|
169
170
|
<img src="https://contrib.rocks/image?repo=ink-developer/PyMax" />
|
|
170
171
|
</a>
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "maxapi-python"
|
|
3
|
-
version = "1.2.
|
|
3
|
+
version = "1.2.5"
|
|
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,61 @@
|
|
|
1
|
+
Release Notes v1.2.5
|
|
2
|
+
====================
|
|
3
|
+
|
|
4
|
+
Новые функции
|
|
5
|
+
-------------
|
|
6
|
+
|
|
7
|
+
**Двухфакторная аутентификация (2FA)**
|
|
8
|
+
Добавлена полная поддержка двухфакторной аутентификации с использованием пароля, email-кода и подсказок для восстановления пароля. Теперь возможен вход в аккаунт когда включена 2FA с проверкой пароля.
|
|
9
|
+
|
|
10
|
+
**Управление паролем аккаунта**
|
|
11
|
+
Новый метод ``set_password()`` позволяет устанавливать, изменять и управлять паролем аккаунта с поддержкой подсказок и email для восстановления.
|
|
12
|
+
|
|
13
|
+
**Исправления в обработке сокетов**
|
|
14
|
+
Улучшена обработка последовательности сообщений (sequence numbers) для корректной работы с 8-битными числами.
|
|
15
|
+
|
|
16
|
+
**Улучшения протокола WebSocket**
|
|
17
|
+
Добавлена поддержка версии протокола (ver=11) в сообщениях WebSocket.
|
|
18
|
+
|
|
19
|
+
Новые методы
|
|
20
|
+
------------
|
|
21
|
+
|
|
22
|
+
MaxClient.set_password(password: str, email: str | None = None, hint: str | None = UNSET)
|
|
23
|
+
Устанавливает пароль для аккаунта с возможностью добавления подсказки и email для восстановления.
|
|
24
|
+
|
|
25
|
+
Новые типы и перечисления
|
|
26
|
+
--------------------------
|
|
27
|
+
|
|
28
|
+
Capability
|
|
29
|
+
Перечисление для описания возможностей аккаунта в контексте двухфакторной аутентификации.
|
|
30
|
+
|
|
31
|
+
Payload классы
|
|
32
|
+
``CheckPasswordChallengePayload`` — для проверки пароля при 2FA
|
|
33
|
+
``CreateTrackPayload`` — для создания отслеживающего ID
|
|
34
|
+
``SetPasswordPayload`` — для установки пароля
|
|
35
|
+
``SetHintPayload`` — для установки подсказки пароля
|
|
36
|
+
``RequestEmailCodePayload`` — для запроса кода по email
|
|
37
|
+
``SendEmailCodePayload`` — для отправки email кода
|
|
38
|
+
``SetTwoFactorPayload`` — для установки параметров 2FA
|
|
39
|
+
|
|
40
|
+
Исправления и улучшения
|
|
41
|
+
------------------------
|
|
42
|
+
|
|
43
|
+
- Исправлена обработка последовательности сообщений в socket-клиенте (seq % 256)
|
|
44
|
+
- Исправлена обработка последовательности сообщений в websocket-клиенте
|
|
45
|
+
- Добавлена проверка подключения перед отправкой уведомлений о прочтении
|
|
46
|
+
- Улучшена обработка двухфакторной аутентификации при логине
|
|
47
|
+
- Исправлена инициализация seq на 255 вместо 0 в core.py
|
|
48
|
+
- Добавлена обработка ``SocketNotConnectedError`` в telemetry
|
|
49
|
+
- Исправлена обработка ошибок при отправке в socket/websocket
|
|
50
|
+
|
|
51
|
+
Версия
|
|
52
|
+
------
|
|
53
|
+
|
|
54
|
+
**1.2.5** - выпущена 31 декабря 2025 г.
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
Архив
|
|
59
|
+
-----
|
|
60
|
+
|
|
61
|
+
Предыдущие версии доступны в :doc:`release_notes_archive`.
|