Примеры использования¶
Ниже — небольшие и наглядные примеры, которые можно вставить прямо в проект. Все примеры используют реальные методы библиотеки (см. исходники).
Быстрый старт: запуск клиента и обработчики¶
Классический пример: регистрируем обработчики и запускаем клиента через start().
import asyncio
from pymax import MaxClient
from pymax.filters import Filter
from pymax.types import Message
client = MaxClient(phone="+79000000000", work_dir="cache", reconnect=False)
@client.on_start
async def on_start() -> None:
# Метаданные пользователя доступны после синхронизации
print("Client started, me id:", client.me.id)
await client.send_message("Бот запущен!", chat_id=0, notify=True)
@client.on_message(filter=Filter(chat_id=0))
async def on_message(message: Message) -> None:
print("New message:", message.text)
# Отправка простого ответа
await client.send_message(f"Echo: {message.text}", chat_id=message.chat_id, notify=False)
if __name__ == "__main__":
asyncio.run(client.start())
Контекстный менеджер и .idle()¶
Используем async with (реализован в __aenter__/__aexit__) и idle() для ожидания событий.
import asyncio
from pymax import MaxClient
from pymax.files import File
client = MaxClient(phone="+79000000000", work_dir="cache")
async def run():
async with client:
# внутри блока клиент подключён и синхронизирован
await client.send_message("Привет от контекстного менеджера!", chat_id=0, notify=True)
# отправка файла (локальный файл)
file = File(path="ruff.toml")
await client.send_message("Вот файл", chat_id=0, notify=True, attachment=file)
# блокируемся и ждём событий
await client.idle()
if __name__ == "__main__":
asyncio.run(run())
Отправка вложений и работа с историей¶
Короткий пример: отправляем файл/фото, получаем историю и скачиваем файл по id.
from pymax import MaxClient, File
from pymax.static.enum import AttachType
client = MaxClient(phone="+79000000000")
@client.on_start
async def _():
# отправить один файл
f = File(path="tests/test.txt")
msg = await client.send_message("Файл", chat_id=0, notify=True, attachment=f)
if msg:
print("Отправлено сообщение id=", msg.id)
# получить историю и найти вложения
history = await client.fetch_history(chat_id=0)
if history:
for m in history:
if m.attaches:
# Пример: если в сообщении есть вложение типа FILE
for a in m.attaches:
if a.type == AttachType.FILE:
file_info = await client.get_file_by_id(chat_id=m.chat_id, message_id=m.id, file_id=a.file_id)
print("Файл для скачивания:", file_info.url)
Кастомный login flow¶
Если нужно реализовать кастомный вход (без автоматического интерфейса), используйте request_code и login_with_code.
import asyncio
from pymax import MaxClient
phone = "+79000000000"
client = MaxClient(phone=phone, work_dir="cache", reconnect=False)
async def login_flow_test():
# Подключение к WS для отправки запроса к API
await client.connect()
# Запрашиваем временный токен (в сервис уходит SMS с кодом)
temp_token = await client.request_code(phone)
# Вводим код вручную
code = input("Введите код: ").strip()
# Отправляем код и сохраняем токен. start=False — не запускать пост-логин задачи автоматически
await client.login_with_code(temp_token, code, start=False)
# Токен сохранён в БД, теперь можно запустить обычный старт клиента
await client.start()
if __name__ == "__main__":
asyncio.run(login_flow_test())
Короткие полезные примеры¶
Ниже — ещё пара компактных сценариев, которые удобно вставлять прямо в проект.
Редактирование и закрепление сообщения¶
from pymax import MaxClient
from pymax.filters import Filter
from pymax.types import Message
client = MaxClient(phone="+79000000000")
@client.on_message(filter=Filter(chat_id=0))
async def edit_and_pin(message: Message) -> None:
# Обновляем текст
await client.edit_message(chat_id=message.chat_id, message_id=message.id, text="Обновлённый текст")
# Закрепляем сообщение
await client.pin_message(chat_id=message.chat_id, message_id=message.id, notify_pin=True)