Для отправки вложений PyMax использует три класса:
Photo- Фото. Проверяет расширение и MIME-тип.
Video- Видео. Загружается чанками и ждет событие готовности от Max.
File- Обычный файл. Тоже загружается чанками и ждет событие готовности.
import asyncio
from pymax import Client, File, Photo, Video
client = Client(phone="+79990000000", work_dir="cache")
@client.on_start()
async def send_files(client: Client) -> None:
chat = await client.get_chat(123456)
await chat.answer(
text="Фото",
attachments=[Photo(path="image.jpg")],
)
await chat.answer(
text="Документ",
attachments=[File(path="report.pdf")],
)
await chat.answer(
text="Видео",
attachments=[Video(path="clip.mp4")],
)
asyncio.run(client.start())Можно передать ровно один источник:
Photo(path="image.jpg")
File(url="https://example.com/report.pdf")
Video(raw=b"...", name="clip.mp4")Для raw обязательно указывайте name. Для File и Video имя
берется из path или url, если не передано явно.
- PyMax запрашивает у Max временный upload URL.
- Читает файл из
path,urlилиraw. - Загружает данные HTTP-запросом.
- Для
FileиVideoждет служебное событие готовности до 60 секунд. - Подставляет token/file_id/video_id в отправляемое сообщение.
Фото проходит проще: после HTTP-upload PyMax сразу достает token из ответа.
FileAttachment содержит ID, но для скачивания нужен временный URL:
from pymax import Client, Message
from pymax.types.domain import FileAttachment
@client.on_message()
async def on_message(message: Message, client: Client) -> None:
if message.chat_id is None:
return
for attach in message.attaches:
if isinstance(attach, FileAttachment):
info = await client.get_file_by_id(
chat_id=message.chat_id,
message_id=message.id,
file_id=attach.file_id,
)
print(info.url if info else "URL не получен")ValueError: Only one of raw, url or path must be provided- Передайте только один источник файла.
ValueError: Name must be provided for raw data- Для bytes укажите имя:
File(raw=data, name="file.bin"). Invalid photo extensionPhotoпринимает.jpg,.jpeg,.png,.gif,.webpи.bmp.UploadError- Upload-сервис не получил нужный ответ от Max. Включите
DEBUG-логи: часто причина в недоступном URL, неверном размере файла, timeout или в том, что событие готовности файла не пришло за 60 секунд.