Как отправить фото в aiogram
Перейти к содержимому

Как отправить фото в aiogram

  • автор:

How to upload file?#

As says official Telegram Bot API documentation there are three ways to send files (photos, stickers, audio, media, etc.):

If the file is already stored somewhere on the Telegram servers or file is available by the URL, you don’t need to reupload it.

But if you need to upload a new file just use subclasses of InputFile.

Here are the three different available builtin types of input file:

Be respectful with Telegram

Instances of InputFile are reusable. That’s mean you can create instance of InputFile and sent this file multiple times but Telegram does not recommend to do that and when you upload file once just save their file_id and use it in next times.

Upload from file system#

By first step you will need to import InputFile wrapper:

Then you can use it:

Represents object for uploading files from filesystem

path – Path to file

filename – Filename to be propagated to telegram. By default, will be parsed from path

chunk_size – Uploading chunk size

Upload from buffer#

Files can be also passed from buffer (For example you generate image using Pillow and you want to send it to Telegram):

Как отправить фотографию в бота телеграмм aiogram

Создайте объект InputFile , в котором хранится путь к файлу и воспользуйтесь методом send_photo() :

MyZik's user avatar

Muxe1's user avatar

aleksandr barakin's user avatar

Нужно импортировать InputFile

Затем создать переменную, через которую указываем путь к фото и указываем нашу переменную photo при отправке через bot.send_photo()

Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.9.4.43609

Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.

Работа с сообщениями¶

В этой главе мы разберёмся, как применять различные типы форматирования к сообщениям и работать с медиафайлами.

Текст¶

Обработка текстовых сообщений — это, пожалуй, одно из важнейших действий у большинства ботов. Текстом можно выразить практически что угодно и при этом подавать информацию хочется красиво. В распоряжении у разработчика имеется три способа разметки текста: HTML, Markdown и MarkdownV2. Наиболее продвинутыми из них считаются HTML и MarkdownV2, «классический» маркдаун оставлен для обеспечения обратной совместимости и поддерживает меньше возможностей.

За выбор форматирования при отправке сообщений отвечает аргумент parse_mode , например:

Hello world с разным форматированием

Если в боте повсеместно используется определённое форматирование, то каждый раз указывать аргумент parse_mode довольно накладно. К счастью, в aiogram можно передать необходимый тип прямо в объект Bot, а если в каком-то конкретном случае нужно обойтись без этих ваших разметок, то просто укажите parse_mode=»» (пустая строка):

Настройка типа разметки по умолчанию

Существует и более «программный» или даже «динамический» способ формирования сообщения. Для этого нужно импортировать модуль markdown из aiogram.utils, который, несмотря на название, поддерживает и HTML тоже. Далее вызовите функцию text() , в которую передайте произвольное число таких же вызовов функции text() . Тип форматирования определяется названием функции, а буква «h» в начале означает HTML, т.е. функция hbold() обрамляет переданный ей текст как жирный в HTML-разметке ( <b>текст</b> ). Аргумент sep определяет разделитель между кусками текста.
В общем, смотрите на код и скриншот ниже. Стоит ли использовать такой способ создания текста — решать вам:

Динамическое форматирование

Помимо отправки с форматированием, Aiogram позволяет извлекать входящий текст как простое содержимое (plain text), как HTML и как Markdown. Сравнить можно на скриншоте ниже. Это удобно использовать, например, если вы хотите вернуть отправителю его сообщение с небольшими изменениями:

Настройка типа разметки по умолчанию

Всё бы ничего, но с использованием форматирования есть проблема: не в меру хитрые пользователи могут использовать спец. символы в именах или сообщениях, ломая бота. Впрочем, в aiogram существуют методы экранирования таких символов: escape_md() и quote_html() . Либо можно использовать упомянутые выше методы (h)bold, (h)italic и прочие:

Экранирование ввода

Подробнее о различных способах форматирования и поддерживаемых тегах можно узнать в документации Bot API.

Медиафайлы¶

Помимо обычных текстовых сообщений Telegram позволяет обмениваться медиафайлами различных типов: фото, видео, гифки, геолокации, стикеры и т.д. У большинства медиафайлов есть свойства file_id и file_unique_id . Первый можно использовать для повторной отправки одного и того же медиафайла много раз, причём отправка будет мгновенной, т.к. сам файл уже лежит на серверах Telegram. Это самый предпочтительный способ.
К примеру, следующий код заставит бота моментально ответить пользователю той же гифкой, что была прислана:

file_id уникален для каждого бота, т.е. переиспользовать чужой идентификатор нельзя. Однако в Bot API есть ещё file_unique_id . Его нельзя использовать для повторной отправки или скачивания медиафайла, но зато он одинаковый у всех ботов. Нужен file_unique_id обычно тогда, когда нескольким ботам требуется знать, что их собственные file_id относятся к одному и тому же файлу.

Кстати, про скачивание: aiogram предлагает удобный вспомогательный метод download() для загрузки небольших файлов на сервер, где запущен бот:

Работа с изображениями

Обратите внимание на конструкцию message.photo[-1] . Когда пользователь присылает боту изображение, Telegram присылает не один объект, а целый массив с разными размерами одного и того же изображения, отсортированными по возрастанию. В общем случае нас будет интересовать изображение наибольшего размера, стоящее последним (индекс «минус один»).

Скачивание больших файлов

Боты, использующие Telegram Bot API, могут скачивать файлы размером не более 20 мегабайт. Если вы планируете скачивать/заливать большие файлы, лучше рассмотрите библиотеки, взаимодействующие с Telegram Client API, а не с Telegram Bot API, например, Telethon. Немногие знают, но Client API могут использовать не только обычные аккаунты, но ещё и боты.

А начиная с Bot API версии 5.0, можно использовать собственный сервер Bot API для работы с большими файлами.

Бонус¶

Бывают ситуации, когда хочется отправить длинное сообщение с картинкой, но лимит на подписи к медиафайлам составляет всего 1024 символа против 4096 у обычного текстового, а вставлять внизу ссылку на медиа — выглядит некрасиво. Более того, когда Telegram делает предпросмотр ссылок, он берёт первую из них и считывает метатеги, в результате сообщение может отправиться не с тем превью, которое хочется увидеть.
Для решения этой проблемы ещё много лет назад придумали подход со «скрытыми ссылками» в HTML-разметке. Суть в том, что можно поместить ссылку в пробел нулевой ширины и вставить всю эту конструкцию в начало сообщения. Для наблюдателя в сообщении никаких ссылок нет, а сервер Telegram всё видит и честно добавляет предпросмотр.
Разработчики aiogram для этого даже сделали специальный вспомогательный метод hide_link() :

Изображение со скрытой ссылкой

На этом всё. До следующих глав!
Ставьте лайки, подписывайтесь, прожимайте колокольчик

Как получить фото в aiogram и отправить пользователю нужное ему фото?

@dp.message_handler(content_types=[‘photo’])
async def handle_docs_photo(message):

raw = await message.photo[0].download()
b = BytesIO()
b.write(raw.raw)
with open(‘testfile.jpg’, ‘wb’) as f:
f.write(b.getvalue())

Пробовал это не работает

Yokaze,
@dp.message_handler(content_types=[«photo»])
async def get_photo(message: types.Message):
await message.photo[-1].download(«test.jpg»)

Пробовал получить так, но если в телеграме не сжать изображение то изображение почему то не сохраняется, а если сжать теряет качество и картинка уменьшается.
Вот не знаю как решить эту проблему

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *