Найти в Дзене
Записки сисадмина

Python. MAX бот. Скачиваем вложения из сообщений.

Погружаясь все глубже и глубже в функционал MAX, хочется выразить уважение программистам, которые его писали. СММ менеджеры, продвигающие его - профнепригодны. Серьезно, я смотрю только на техническую составляющую, и мне есть с чем сравнивать. Но сегодня не об этом. Мы уже научились отправлять пользователю сообщение, вести с ним текстовый диалог, прикреплять кнопки с событиями, и даже запрашивать его данные. Сегодня поговорим о том, как получать и скачивать сообщения, в которых есть вложения (фото, видео, документы, и даже голосовые) Начнем Импортируем модули, которыми будем сегодня пользоваться: import requests from maxapi import Bot, Dispatcher, F from maxapi.types import MessageCreated, BotStarted Для начала, вспомним, в отличии от телеграмма, в MAX все файлы, прикрепленные к сообщению попадают в поле "вложения" (attachments). Значит, нам нужна функция, которая будет реагировать на все сообщения с вложениями: @dp.message_created(F.message.body.attachments) - Данный декоратор будет с
Оглавление

Погружаясь все глубже и глубже в функционал MAX, хочется выразить уважение программистам, которые его писали. СММ менеджеры, продвигающие его - профнепригодны. Серьезно, я смотрю только на техническую составляющую, и мне есть с чем сравнивать. Но сегодня не об этом.

Мы уже научились отправлять пользователю сообщение, вести с ним текстовый диалог, прикреплять кнопки с событиями, и даже запрашивать его данные. Сегодня поговорим о том, как получать и скачивать сообщения, в которых есть вложения (фото, видео, документы, и даже голосовые)

Начнем

Импортируем модули, которыми будем сегодня пользоваться:

import requests
from maxapi import Bot, Dispatcher, F
from maxapi.types import MessageCreated, BotStarted

Для начала, вспомним, в отличии от телеграмма, в MAX все файлы, прикрепленные к сообщению попадают в поле "вложения" (attachments).

Значит, нам нужна функция, которая будет реагировать на все сообщения с вложениями:

-2

@dp.message_created(F.message.body.attachments) - Данный декоратор будет срабатывать каждый раз, когда мы будем получать какое-либо вложение.

Отправим боту изображение и увидим следующую конструкцию в event.message:

body=MessageBody(mid='mid.0000000006aaa00e019b945ae24f6728', seq=115849333492901672, text='', attachments=[Image(type='image', payload=PhotoAttachmentPayload(photo_id=3575975133, token='l5LSCMfn8sj3A2cuyCvZQp3w==', url='https://i.oneme.ru/i?r=BTGBPUwtwgYUeoFhO-'

В поле event.message.body.attachments.type будет тип полученного вложения.

В поле event.message.body.attachments.payload.url - ссылка на скачивание.

Обратим внимание, что файлов может быть несколько, поэтому сразу обернем обработку вложений в цикл:

-3

Казалось бы, достаточно просто добавить код на скачивание и проблема решена.

Но при получении сообщения с картинкой, у нас есть type='image', url='download_url', а вот названия картинки и ее расширения - нет. (к слову, если отправить картинку как файл - полное имя прикрепится)

-4
-5

Также важно: MAX сохраняет все свои изображения в формате .RIFF, а не .jpg, или .png

Добавим в наш цикл обработку типа файлов. Если мы будем получать видео, или фото, имя будем генерировать из токена полученного файла (первые 15 символов)

-6
-7

Добавим блок кода, который будет заниматься скачиванием полученных файлов:

-8

И дополнительно добавим обработку тех ситуаций, когда нам придет такой файл, к которому мы пока что не готовы:

-9

Осталось только обернуть все это в одну функцию и чуть-чуть отредактировать генерируемое имя файла (на случай, если в токене будут слеши):

-10

Проверяем:

-11

Весь код из статьи выложил здесь