maxapi-python 1.1.11__tar.gz → 1.1.12__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.1.11 → maxapi_python-1.1.12}/PKG-INFO +1 -1
- maxapi_python-1.1.12/docs/client.md +286 -0
- {maxapi_python-1.1.11 → maxapi_python-1.1.12}/docs/index.md +3 -3
- maxapi_python-1.1.12/docs/methods.md +499 -0
- maxapi_python-1.1.12/docs/types.md +314 -0
- {maxapi_python-1.1.11 → maxapi_python-1.1.12}/examples/example.py +33 -26
- {maxapi_python-1.1.11 → maxapi_python-1.1.12}/mkdocs.yml +54 -27
- {maxapi_python-1.1.11 → maxapi_python-1.1.12}/pyproject.toml +1 -1
- maxapi_python-1.1.12/src/pymax/formatting.py +76 -0
- {maxapi_python-1.1.11 → maxapi_python-1.1.12}/src/pymax/mixins/group.py +26 -0
- {maxapi_python-1.1.11 → maxapi_python-1.1.12}/src/pymax/mixins/message.py +63 -6
- {maxapi_python-1.1.11 → maxapi_python-1.1.12}/src/pymax/payloads.py +17 -4
- {maxapi_python-1.1.11 → maxapi_python-1.1.12}/src/pymax/static.py +15 -1
- {maxapi_python-1.1.11 → maxapi_python-1.1.12}/src/pymax/types.py +2 -1
- {maxapi_python-1.1.11 → maxapi_python-1.1.12}/.github/FUNDING.yml +0 -0
- {maxapi_python-1.1.11 → maxapi_python-1.1.12}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {maxapi_python-1.1.11 → maxapi_python-1.1.12}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {maxapi_python-1.1.11 → maxapi_python-1.1.12}/.github/ISSUE_TEMPLATE/refactor.md +0 -0
- {maxapi_python-1.1.11 → maxapi_python-1.1.12}/.github/pull_request_template.md +0 -0
- {maxapi_python-1.1.11 → maxapi_python-1.1.12}/.github/workflows/publish.yml +0 -0
- {maxapi_python-1.1.11 → maxapi_python-1.1.12}/.gitignore +0 -0
- {maxapi_python-1.1.11 → maxapi_python-1.1.12}/LICENSE +0 -0
- {maxapi_python-1.1.11 → maxapi_python-1.1.12}/README.md +0 -0
- {maxapi_python-1.1.11 → maxapi_python-1.1.12}/assets/icon.svg +0 -0
- {maxapi_python-1.1.11 → maxapi_python-1.1.12}/assets/logo.svg +0 -0
- {maxapi_python-1.1.11 → maxapi_python-1.1.12}/docs/api.md +0 -0
- {maxapi_python-1.1.11 → maxapi_python-1.1.12}/docs/assets/icon.svg +0 -0
- {maxapi_python-1.1.11 → maxapi_python-1.1.12}/docs/examples.md +0 -0
- {maxapi_python-1.1.11 → maxapi_python-1.1.12}/ruff.toml +0 -0
- {maxapi_python-1.1.11 → maxapi_python-1.1.12}/scripts/build.py +0 -0
- {maxapi_python-1.1.11 → maxapi_python-1.1.12}/src/pymax/__init__.py +0 -0
- {maxapi_python-1.1.11 → maxapi_python-1.1.12}/src/pymax/core.py +0 -0
- {maxapi_python-1.1.11 → maxapi_python-1.1.12}/src/pymax/crud.py +0 -0
- {maxapi_python-1.1.11 → maxapi_python-1.1.12}/src/pymax/exceptions.py +0 -0
- {maxapi_python-1.1.11 → maxapi_python-1.1.12}/src/pymax/files.py +0 -0
- {maxapi_python-1.1.11 → maxapi_python-1.1.12}/src/pymax/filters.py +0 -0
- {maxapi_python-1.1.11 → maxapi_python-1.1.12}/src/pymax/interfaces.py +0 -0
- {maxapi_python-1.1.11 → maxapi_python-1.1.12}/src/pymax/mixins/__init__.py +0 -0
- {maxapi_python-1.1.11 → maxapi_python-1.1.12}/src/pymax/mixins/auth.py +0 -0
- {maxapi_python-1.1.11 → maxapi_python-1.1.12}/src/pymax/mixins/channel.py +0 -0
- {maxapi_python-1.1.11 → maxapi_python-1.1.12}/src/pymax/mixins/handler.py +0 -0
- {maxapi_python-1.1.11 → maxapi_python-1.1.12}/src/pymax/mixins/self.py +0 -0
- {maxapi_python-1.1.11 → maxapi_python-1.1.12}/src/pymax/mixins/socket.py +0 -0
- {maxapi_python-1.1.11 → maxapi_python-1.1.12}/src/pymax/mixins/telemetry.py +0 -0
- {maxapi_python-1.1.11 → maxapi_python-1.1.12}/src/pymax/mixins/user.py +0 -0
- {maxapi_python-1.1.11 → maxapi_python-1.1.12}/src/pymax/mixins/websocket.py +0 -0
- {maxapi_python-1.1.11 → maxapi_python-1.1.12}/src/pymax/models.py +0 -0
- {maxapi_python-1.1.11 → maxapi_python-1.1.12}/src/pymax/navigation.py +0 -0
- {maxapi_python-1.1.11 → maxapi_python-1.1.12}/src/pymax/utils.py +0 -0
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
# 🚀 Руководство по MaxClient
|
|
2
|
+
|
|
3
|
+
## 📋 Содержание
|
|
4
|
+
|
|
5
|
+
- [Установка и Настройка](#установка-и-настройка)
|
|
6
|
+
- [Основные Возможности](#основные-возможности)
|
|
7
|
+
- [Управление Подключением](#управление-подключением)
|
|
8
|
+
- [Работа с Данными](#работа-с-данными)
|
|
9
|
+
- [Лучшие Практики](#лучшие-практики)
|
|
10
|
+
|
|
11
|
+
## ⚙️ Установка и настройка {#установка-и-настройка}
|
|
12
|
+
|
|
13
|
+
### Инициализация Клиента
|
|
14
|
+
|
|
15
|
+
!!! info "MaxClient"
|
|
16
|
+
Основной класс для взаимодействия с WebSocket API сервиса Max.
|
|
17
|
+
|
|
18
|
+
```python
|
|
19
|
+
client = MaxClient(
|
|
20
|
+
phone: str,
|
|
21
|
+
uri: str = Constants.WEBSOCKET_URI.value,
|
|
22
|
+
headers: dict[str, Any] | None = Constants.DEFAULT_USER_AGENT.value,
|
|
23
|
+
token: str | None = None,
|
|
24
|
+
send_fake_telemetry: bool = True,
|
|
25
|
+
host: str = Constants.HOST.value,
|
|
26
|
+
port: int = Constants.PORT.value,
|
|
27
|
+
work_dir: str = ".",
|
|
28
|
+
logger: logging.Logger | None = None,
|
|
29
|
+
)
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
**Параметры конфигурации**
|
|
33
|
+
|
|
34
|
+
| Параметр | Тип | Описание | По умолчанию |
|
|
35
|
+
|----------|-----|----------|---------------|
|
|
36
|
+
| `phone` | `str` | Номер телефона для авторизации | - |
|
|
37
|
+
| `uri` | `str` | URI WebSocket сервера | `Constants.WEBSOCKET_URI.value` |
|
|
38
|
+
| `headers` | `dict[str, Any] \| None` | Заголовки для соединения | `Constants.DEFAULT_USER_AGENT.value` |
|
|
39
|
+
| `token` | `str \| None` | Токен авторизации | `None` |
|
|
40
|
+
| `send_fake_telemetry` | `bool` | Отправка телеметрии | `True` |
|
|
41
|
+
| `host` | `str` | Хост API сервера | `Constants.HOST.value` |
|
|
42
|
+
| `port` | `int` | Порт API сервера | `Constants.PORT.value` |
|
|
43
|
+
| `work_dir` | `str` | Директория для БД | `"."` |
|
|
44
|
+
| `logger` | `logging.Logger \| None` | Пользовательский логгер | `None` |
|
|
45
|
+
|
|
46
|
+
**Пример базовой инициализации**
|
|
47
|
+
```python
|
|
48
|
+
from pymax import MaxClient
|
|
49
|
+
|
|
50
|
+
client = MaxClient(
|
|
51
|
+
phone="+79001234567",
|
|
52
|
+
work_dir="./data"
|
|
53
|
+
)
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
**Пример расширенной конфигурации**
|
|
57
|
+
```python
|
|
58
|
+
import logging
|
|
59
|
+
|
|
60
|
+
# Настройка логгера
|
|
61
|
+
logger = logging.getLogger("max_bot")
|
|
62
|
+
logger.setLevel(logging.DEBUG)
|
|
63
|
+
|
|
64
|
+
# Инициализация с дополнительными параметрами
|
|
65
|
+
client = MaxClient(
|
|
66
|
+
phone="+79001234567",
|
|
67
|
+
token="your_saved_token", # Если есть сохраненный токен
|
|
68
|
+
work_dir="./data",
|
|
69
|
+
logger=logger,
|
|
70
|
+
send_fake_telemetry=False
|
|
71
|
+
)
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
## 🔑 Основные возможности {#основные-возможности}
|
|
75
|
+
|
|
76
|
+
### Свойства Клиента
|
|
77
|
+
|
|
78
|
+
#### Аутентификация и Подключение
|
|
79
|
+
|
|
80
|
+
!!! info "Статус и авторизация"
|
|
81
|
+
| Свойство | Тип | Описание |
|
|
82
|
+
|----------|-----|----------|
|
|
83
|
+
| `is_connected` | `bool` | Статус подключения |
|
|
84
|
+
| `phone` | `str` | Номер телефона |
|
|
85
|
+
| `me` | `Me \| None` | Информация о пользователе |
|
|
86
|
+
|
|
87
|
+
#### Доступ к Данным
|
|
88
|
+
|
|
89
|
+
!!! info "Чаты и пользователи"
|
|
90
|
+
| Свойство | Тип | Описание |
|
|
91
|
+
|----------|-----|----------|
|
|
92
|
+
| `chats` | `list[Chat]` | Все чаты |
|
|
93
|
+
| `dialogs` | `list[Dialog]` | Личные диалоги |
|
|
94
|
+
| `channels` | `list[Channel]` | Каналы |
|
|
95
|
+
|
|
96
|
+
## 🔌 Управление подключением {#управление-подключением}
|
|
97
|
+
|
|
98
|
+
### Запуск и Остановка
|
|
99
|
+
|
|
100
|
+
```python
|
|
101
|
+
async def start() -> None
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
!!! info "Запуск клиента"
|
|
105
|
+
Метод выполняет:
|
|
106
|
+
1. Подключение к WebSocket
|
|
107
|
+
2. Авторизацию пользователя
|
|
108
|
+
3. Инициализацию фоновых задач
|
|
109
|
+
4. Синхронизацию данных
|
|
110
|
+
|
|
111
|
+
**Пример использования**
|
|
112
|
+
```python
|
|
113
|
+
async def main():
|
|
114
|
+
client = MaxClient(phone="+79001234567")
|
|
115
|
+
try:
|
|
116
|
+
await client.start()
|
|
117
|
+
print("Клиент успешно запущен")
|
|
118
|
+
except Exception as e:
|
|
119
|
+
print(f"Ошибка запуска: {e}")
|
|
120
|
+
|
|
121
|
+
asyncio.run(main())
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
```python
|
|
125
|
+
async def close() -> None
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
!!! warning "Закрытие клиента"
|
|
129
|
+
Метод выполняет:
|
|
130
|
+
1. Остановку фоновых задач
|
|
131
|
+
2. Закрытие WebSocket соединения
|
|
132
|
+
3. Очистку ресурсов
|
|
133
|
+
|
|
134
|
+
**Пример корректного закрытия**
|
|
135
|
+
```python
|
|
136
|
+
async def main():
|
|
137
|
+
async with MaxClient(phone="+79001234567") as client:
|
|
138
|
+
await client.start()
|
|
139
|
+
# Ваш код здесь
|
|
140
|
+
# Клиент автоматически закроется
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
## 📨 Работа с Сообщениями
|
|
144
|
+
|
|
145
|
+
### Обработка Сообщений
|
|
146
|
+
|
|
147
|
+
!!! tip "Регистрация обработчиков"
|
|
148
|
+
```python
|
|
149
|
+
@client.on_message()
|
|
150
|
+
async def handle_message(message: Message):
|
|
151
|
+
print(f"Получено сообщение: {message.text}")
|
|
152
|
+
|
|
153
|
+
if message.attaches:
|
|
154
|
+
print("Есть вложения!")
|
|
155
|
+
|
|
156
|
+
if message.sender:
|
|
157
|
+
user = await client.get_user(message.sender)
|
|
158
|
+
if user:
|
|
159
|
+
print(f"От: {user.names[0].name}")
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
### Фильтрация Сообщений
|
|
163
|
+
|
|
164
|
+
!!! example "Примеры фильтров"
|
|
165
|
+
```python
|
|
166
|
+
# Только текстовые сообщения
|
|
167
|
+
@client.on_message(Filter(chat_id=0))
|
|
168
|
+
async def handle_text(message: Message):
|
|
169
|
+
print(f"Текст: {message.text}")
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
## 💾 Работа с данными {#работа-с-данными}
|
|
173
|
+
|
|
174
|
+
### Доступ к Чатам
|
|
175
|
+
|
|
176
|
+
!!! info "Типы чатов"
|
|
177
|
+
```python
|
|
178
|
+
# Все чаты
|
|
179
|
+
for chat in client.chats:
|
|
180
|
+
print(f"Чат: {chat.title}")
|
|
181
|
+
|
|
182
|
+
# Личные диалоги
|
|
183
|
+
for dialog in client.dialogs:
|
|
184
|
+
user = await client.get_user(dialog.owner)
|
|
185
|
+
if user:
|
|
186
|
+
print(f"Диалог с {user.names[0].name}")
|
|
187
|
+
|
|
188
|
+
# Каналы
|
|
189
|
+
for channel in client.channels:
|
|
190
|
+
print(f"Канал: {channel.title}")
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
### Информация о Пользователе
|
|
194
|
+
|
|
195
|
+
!!! example "Работа с текущим пользователем"
|
|
196
|
+
```python
|
|
197
|
+
me = client.me
|
|
198
|
+
if me:
|
|
199
|
+
name = me.names[0] if me.names else None
|
|
200
|
+
print(f"Авторизован как: {name.name if name else me.phone}")
|
|
201
|
+
print(f"ID: {me.id}")
|
|
202
|
+
print(f"Статус: {me.account_status}")
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
## 💽 Хранение Данных
|
|
206
|
+
|
|
207
|
+
### База Данных
|
|
208
|
+
|
|
209
|
+
!!! info "Локальное хранилище"
|
|
210
|
+
- **Расположение**: `{work_dir}/session.db`
|
|
211
|
+
- **Хранит**:
|
|
212
|
+
- Токены авторизации
|
|
213
|
+
- Информацию об устройстве
|
|
214
|
+
- Данные сессии
|
|
215
|
+
- **Особенности**:
|
|
216
|
+
- Автоматическое управление
|
|
217
|
+
- Персистентное хранение
|
|
218
|
+
- Безопасное сохранение токенов
|
|
219
|
+
|
|
220
|
+
## 📚 Лучшие практики {#лучшие-практики}
|
|
221
|
+
|
|
222
|
+
### Безопасное Использование
|
|
223
|
+
|
|
224
|
+
!!! tip "Контекстный менеджер"
|
|
225
|
+
```python
|
|
226
|
+
async def main():
|
|
227
|
+
async with MaxClient(phone="+79001234567") as client:
|
|
228
|
+
await client.start()
|
|
229
|
+
# Ваш код здесь
|
|
230
|
+
# Клиент автоматически закроется
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
### Обработка Ошибок
|
|
234
|
+
|
|
235
|
+
!!! warning "Обработка исключений"
|
|
236
|
+
```python
|
|
237
|
+
try:
|
|
238
|
+
await client.start()
|
|
239
|
+
except WebSocketNotConnectedError:
|
|
240
|
+
print("Ошибка подключения")
|
|
241
|
+
except Exception as e:
|
|
242
|
+
print(f"Непредвиденная ошибка: {e}")
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
### Оптимизация
|
|
246
|
+
|
|
247
|
+
!!! tip "Советы по оптимизации"
|
|
248
|
+
1. Используйте фильтры сообщений для снижения нагрузки
|
|
249
|
+
2. Применяйте кэширование пользователей через `get_cached_user`
|
|
250
|
+
3. Группируйте операции с сообщениями
|
|
251
|
+
4. Правильно закрывайте ресурсы
|
|
252
|
+
|
|
253
|
+
### Структура Бота
|
|
254
|
+
|
|
255
|
+
!!! example "Рекомендуемая структура"
|
|
256
|
+
```python
|
|
257
|
+
from pymax import MaxClient
|
|
258
|
+
|
|
259
|
+
class MyBot:
|
|
260
|
+
def __init__(self, phone: str):
|
|
261
|
+
self.client = MaxClient(phone=phone)
|
|
262
|
+
|
|
263
|
+
async def setup(self):
|
|
264
|
+
# Регистрация обработчиков
|
|
265
|
+
@self.client.on_message()
|
|
266
|
+
async def handle_message(message: Message):
|
|
267
|
+
await self.process_message(message)
|
|
268
|
+
|
|
269
|
+
@self.client.on_start()
|
|
270
|
+
async def handle_start():
|
|
271
|
+
await self.on_ready()
|
|
272
|
+
|
|
273
|
+
async def process_message(self, message: Message):
|
|
274
|
+
# Ваша логика обработки сообщений
|
|
275
|
+
pass
|
|
276
|
+
|
|
277
|
+
async def on_ready(self):
|
|
278
|
+
print("Бот готов к работе!")
|
|
279
|
+
|
|
280
|
+
async def run(self):
|
|
281
|
+
await self.client.start()
|
|
282
|
+
|
|
283
|
+
# Использование
|
|
284
|
+
bot = MyBot(phone="+79001234567")
|
|
285
|
+
asyncio.run(bot.run())
|
|
286
|
+
```
|
|
@@ -10,14 +10,14 @@ from pymax import MaxClient
|
|
|
10
10
|
|
|
11
11
|
async def main():
|
|
12
12
|
client = MaxClient(phone="+79001234567")
|
|
13
|
-
|
|
14
|
-
@client.on_message
|
|
13
|
+
|
|
14
|
+
@client.on_message()
|
|
15
15
|
async def handle_message(message):
|
|
16
16
|
await client.send_message(
|
|
17
17
|
chat_id=message.chat_id,
|
|
18
18
|
text=f"Привет, {message.author.username}! {message.text}"
|
|
19
19
|
)
|
|
20
|
-
|
|
20
|
+
|
|
21
21
|
await client.start()
|
|
22
22
|
|
|
23
23
|
asyncio.run(main())
|