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

Python. MAX бот. Отправляем сообщения.

В предыдущей статье мы научились обрабатывать входящие сообщения и отвечать на них. А что, если мы хотим сами отправить сообщение? Сразу позволю себе маленькое лирическое отступление: В статьях по телеграм ботам мы уже разбирали отправку разных типов сообщений. Если нам нужно было отправить текстовое сообщение, мы вызывали функцию send_message() и передавали в нее параметр text. Если нужно отправить картинку, мы вызывали send_photo(), в которую передавали картинку бинарным потоком. Точно так же с send_video(), send_audio(), send_document() и т.д. При этом текст в таком сообщении передавался уже в параметре caption. А если же нам надо было передать больше одного файла, в дело вступала функция send_media_group(). При желании, можете ознакомиться с функционалом телеграмма по ссылке. Но мы здесь не за этим. Пусть в меня и полетят сейчас помидоры, но разработчики api MAX подумали об этом на этапе формирования функционала. По сути, любое отправляемое сообщение будет иметь такую конструкцию:
Оглавление

В предыдущей статье мы научились обрабатывать входящие сообщения и отвечать на них. А что, если мы хотим сами отправить сообщение?

Сразу позволю себе маленькое лирическое отступление:

В статьях по телеграм ботам мы уже разбирали отправку разных типов сообщений.

Если нам нужно было отправить текстовое сообщение, мы вызывали функцию send_message() и передавали в нее параметр text.

Если нужно отправить картинку, мы вызывали send_photo(), в которую передавали картинку бинарным потоком. Точно так же с send_video(), send_audio(), send_document() и т.д. При этом текст в таком сообщении передавался уже в параметре caption.

А если же нам надо было передать больше одного файла, в дело вступала функция send_media_group().

При желании, можете ознакомиться с функционалом телеграмма по ссылке.

Но мы здесь не за этим.

Пусть в меня и полетят сейчас помидоры, но разработчики api MAX подумали об этом на этапе формирования функционала.

  • Есть единственный endpoint send_message()
  • Текст сообщения всегда будет передан в параметр text
  • Любые типы данных, прикрепляемые к сообщению, попадают списком в параметр attachments

По сути, любое отправляемое сообщение будет иметь такую конструкцию:

bot.send_message(
user_id=00000, #ID пользователя в мессенджере (integer)
text=f'string', #Текст сообщения (string)
attachments=[file1, file2, file3] #Прикрепляемые файлы (list)
)

Давайте напишем свой скрипт, который будет отправлять сообщение. Я заранее в прошлой статье получил свой id и положил его в config файл.

Отправка текстового сообщения:

-2
from maxapi import Bot
from config import bot_token, my_id
import asyncio
async def sending_message(user, message):
await bot.send_message(user_id=user, text=message)
if __name__ == '__main__':
bot = Bot(token=bot_token)
asyncio.run(sending_message(user=my_id, message='test message'))

Тут все максимально просто: я вызвал send_message(), передал ему id и текст.

-3

Отправка сообщения с картинкой:

Для отправки файла нам нужно импортировать дополнительный модуль:

from maxapi.types import InputMedia

InputMedia - это класс, в который мы будем передавать файл, а в ответ получать уже подготовленное к отправке вложение.

-4
async def sending_message(user, message, attach):
await bot.send_message(user_id=user, text=message, attachments=attach)
if __name__ == '__main__':
bot = Bot(token=bot_token)
photo = InputMedia('blank_user.jpg')
asyncio.run(sending_message(user=my_id, message='test message', attach=[photo]))

Проверяем и видим, что картинка прикрепилась к сообщению:

-5

Хотим отправить не одну, а две картинки в одном сообщении - не беда. Просто добавляем еще одну в список к attachments:

-6
async def sending_message(user, message, attach):
await bot.send_message(user_id=user, text=message, attachments=attach)
if __name__ == '__main__':
bot = Bot(token=bot_token)
photo = InputMedia('blank_user.jpg')
photo1 = InputMedia('blank_user1.jpg')
asyncio.run(sending_message(user=my_id, message='test message', attach=[photo, photo1]))
-7

Так же, как мы сейчас прикрепляли фото к сообщению, можно прикреплять и любые другие файлы. Для этого созданы классы Attachment, InputMedia и InputMediaBuffer.