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

от admin

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

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

MyZik's user avatar

Muxe1's user avatar

aleksandr barakin's user avatar

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

Нажимая «Принять все файлы 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() :

Читать:
Где посмотреть баланс steam

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

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

sendPhoto#

class aiogram.methods.send_photo. SendPhoto ( * , chat_id : Union [ int , str ] , photo : Union [ InputFile , str ] , message_thread_id : Optional [ int ] = None , caption : Optional [ str ] = None , parse_mode : Optional [ str ] = sentinel.UNSET_PARSE_MODE , caption_entities : Optional [ List [ MessageEntity ] ] = None , has_spoiler : Optional [ bool ] = None , disable_notification : Optional [ bool ] = None , protect_content : Optional [ bool ] = sentinel.UNSET_PROTECT_CONTENT , reply_to_message_id : Optional [ int ] = None , allow_sending_without_reply : Optional [ bool ] = None , reply_markup : Optional [ Union [ InlineKeyboardMarkup , ReplyKeyboardMarkup , ReplyKeyboardRemove , ForceReply ] ] = None , ** extra_data : Any ) [исходный код] #

Use this method to send photos. On success, the sent aiogram.types.message.Message is returned.

chat_id : Union [ int , str ] #

Unique identifier for the target chat or username of the target channel (in the format @channelusername )

Photo to send. Pass a file_id as String to send a photo that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a photo from the Internet, or upload a new photo using multipart/form-data. The photo must be at most 10 MB in size. The photo’s width and height must not exceed 10000 in total. Width and height ratio must be at most 20. More information on Sending Files »

message_thread_id : Optional [ int ] #

Unique identifier for the target message thread (topic) of the forum; for forum supergroups only

caption : Optional [ str ] #

Photo caption (may also be used when resending photos by file_id), 0-1024 characters after entities parsing

parse_mode : Optional [ str ] #

Mode for parsing entities in the photo caption. See formatting options for more details.

caption_entities : Optional [ List [ MessageEntity ] ] #

A JSON-serialized list of special entities that appear in the caption, which can be specified instead of parse_mode

has_spoiler : Optional [ bool ] #

Pass True if the photo needs to be covered with a spoiler animation

disable_notification : Optional [ bool ] #

Sends the message silently. Users will receive a notification with no sound.

protect_content : Optional [ bool ] #

Protects the contents of the sent message from forwarding and saving

reply_to_message_id : Optional [ int ] #

If the message is a reply, ID of the original message

allow_sending_without_reply : Optional [ bool ] #

Pass True if the message should be sent even if the specified replied-to message is not found

Additional interface options. A JSON-serialized object for an inline keyboard, custom reply keyboard, instructions to remove reply keyboard or to force a reply from the user.

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

user avatar

user avatar

Всё ещё ищете ответ? Посмотрите другие вопросы с метками python telegram bot aiogram или задайте свой вопрос.

Site design / logo © 2022 Stack Exchange Inc; user contributions licensed under cc by-sa. rev 2022.6.10.42345

Знакомство с aiogram¶

Давайте запустим с ним бота:
Команда /test2 не работает

Снова запустим бота:
Обе команды работают

Разница между message.answer() и message.reply()

Разница между message.answer() и message.reply()

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 new file just use subclasses of InputFile.

Here is available three different builtin types of input file:

Be respectful with Telegram

Instances of InputFile is reusable. That’s mean you can create instance of InputFile and sent this file multiple times but Telegram is 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:

Upload from buffer#

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

And then you can use it:

Create buffer from file

path – Path to file

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

Related Posts