Skip to content
This repository was archived by the owner on Feb 11, 2026. It is now read-only.

Commit e10c051

Browse files
Merge pull request #34 from MaxApiTeam/dev/1.2.4
Dev/1.2.4
2 parents 69dac16 + 5054fd9 commit e10c051

32 files changed

Lines changed: 1214 additions & 1188 deletions

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,6 @@ if __name__ == "__main__":
169169

170170
Спасибо всем за помощь в разработке!
171171

172-
<a href="https://github.com/ink-developer/PyMax/graphs/contributors">
172+
<a href="https://github.com/MaxApiTeam/PyMax/graphs/contributors">
173173
<img src="https://contrib.rocks/image?repo=ink-developer/PyMax" />
174174
</a>

mkdocs.yml

Lines changed: 0 additions & 123 deletions
This file was deleted.

pyproject.toml

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[project]
22
name = "maxapi-python"
3-
version = "1.2.3"
3+
version = "1.2.4"
44
description = "Python wrapper для API мессенджера Max"
55
readme = "README.md"
66
requires-python = ">=3.10"
@@ -19,12 +19,13 @@ dependencies = [
1919
"aiohttp>=3.12.15",
2020
"aiofiles>=24.1.0",
2121
"qrcode>=8.2",
22+
"ua-generator>=2.0.19",
2223
]
2324

2425
[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"
2829

2930
[build-system]
3031
requires = ["hatchling"]

redocs/source/clients.rst

Lines changed: 127 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,44 @@
11
Clients
22
=======
33

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+
432
MaxClient
533
---------
634

735
Основной асинхронный WebSocket клиент для взаимодействия с Max API.
836

37+
**Поддерживаемые методы авторизации:**
38+
- ✅ Вход по QR-коду (WEB device_type)
39+
- ❌ Вход по номеру телефона (больше не поддерживается)
40+
- ❌ Регистрация по номеру телефона
41+
942
Инициализация:
1043

1144
.. code-block:: python
@@ -20,27 +53,10 @@ MaxClient
2053
logger=None, # Пользовательский логгер
2154
)
2255
23-
.. warning::
24-
25-
Параметр ``device_type`` в ``UserAgentPayload`` **критически важен** для выбора способа авторизации:
26-
27-
**DESKTOP** — вход по номеру телефона:
28-
29-
.. code-block:: python
30-
31-
from pymax.payloads import UserAgentPayload
32-
33-
ua = UserAgentPayload(device_type="DESKTOP", app_version="25.12.13")
34-
client = MaxClient(phone="+79111111111", headers=ua)
35-
36-
**WEB** — вход через QR-код; токен совместим с веб-версией Max:
37-
38-
.. code-block:: python
39-
40-
from pymax.payloads import UserAgentPayload
56+
.. note::
4157

42-
ua = UserAgentPayload(device_type="WEB", app_version="25.12.13")
43-
client = MaxClient(phone="+79111111111", headers=ua)
58+
MaxClient по умолчанию использует **WEB** device_type и поддерживает только вход по QR-коду.
59+
Это является рекомендуемым способом авторизации для большинства приложений.
4460

4561
Основные методы:
4662

@@ -84,6 +100,19 @@ MaxClient
84100
limit=50
85101
)
86102
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+
87116
Свойства:
88117

89118
.. code-block:: python
@@ -95,6 +124,7 @@ MaxClient
95124
client.channels # Список каналов (list[Channel])
96125
client.phone # Номер телефона (str)
97126
client.token # Токен сессии (str | None)
127+
client.contacts # Список контактов (list[User])
98128
99129
Обработчики событий:
100130

@@ -140,9 +170,83 @@ MaxClient
140170
SocketMaxClient
141171
---------------
142172

143-
Низкоуровневый WebSocket клиент для прямого взаимодействия с API.
144-
Обычно не требуется использовать напрямую - используйте MaxClient вместо этого.
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. **Автоматизации** — вход по номеру телефона легче автоматизировать
145236

146237
.. note::
147238

148-
Если вам нужны низкоуровневые детали, смотрите исходный код библиотеки.
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()

redocs/source/conf.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
project = "PyMax"
77
author = "ink-developer"
88
copyright = "2025, ink-developer"
9-
release = "1.1.21"
9+
release = "1.2.4"
1010

1111
# -- Path setup ---------------------------------------------------------------
1212
sys.path.insert(0, os.path.abspath("../../src"))

redocs/source/examples.rst

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ Greeter Bot
3838
3939
client = MaxClient(phone="+79001234567")
4040
41-
@client.on_message(Filters.private())
41+
@client.on_message(Filters.chat(123))
4242
async def greet(message):
4343
user = await client.get_user(message.sender)
4444
if user and user.names:
@@ -150,13 +150,8 @@ File Manager
150150
for attach in message.attaches:
151151
if attach.type == AttachType.PHOTO:
152152
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}")
160155
161156
@client.on_message(Filters.text("файл"))
162157
async def send_file(message):

redocs/source/guides.rst

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -93,11 +93,6 @@ Guides
9393
async def greeting(message: Message) -> None:
9494
pass
9595
96-
# Только личные
97-
@client.on_message(Filters.dialog())
98-
async def private(message: Message) -> None:
99-
pass
100-
10196
# Только группы
10297
@client.on_message(Filters.chat())
10398
async def in_group(message: Message) -> None:

0 commit comments

Comments
 (0)