Как отправить файл с помощью бота в телеграм
Файл я отправлять умею, но есть проблемка. Когда бот отправляет файл он указывает не коренное название файла, а «document» это не удобно. Знаю, что такой вопрос уже задавался, но способ с filename=»file.doc» у меня не работает Код:
bot = telebot.TeleBot("Токен") @bot.message_handler(content_types=['text']) def echo_all(message): with open("game.zip","rb") as file: f=file.read() bot.send_document(message.chat.id,f,"game.zip") bot.polling()``` [1]: https://i.stack.imgur.com/yKAsk.jpg
Отслеживать
задан 29 мар 2020 в 19:32
25 1 1 золотой знак 1 1 серебряный знак 5 5 бронзовых знаков
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Попробуйте передавать объект файла прямо внутри метода send_document . У меня следующий код отлично работает и присылает документ именно с таким именем, с каким он хранится в системе:
bot.send_document(message.chat.id, open(r'Путь_к_документу/Название_документа.txt, 'rb'))
Отслеживать
ответ дан 29 мар 2020 в 20:53
Alioshca Z Alioshca Z
1,363 1 1 золотой знак 4 4 серебряных знака 11 11 бронзовых знаков
- python-3.x
- telegram-bot
- telegram
- telebot
-
Важное на Мете
Похожие
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Дизайн сайта / логотип © 2024 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2024.1.8.3130
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Работа с файлами/media, модуль python-telegram-bot в Python
В разделе рассмотрены примеры сниппетов, для работы с файлами, медиа и URL-адресами при создании Telegram бота с помощью пакета python-telegram-bot .
Внимание! Пакеты python-telegram-bot версии 13.x будут придерживаться многопоточной парадигмы программирования (*на данный момент актуальна версия 13.15). Пакеты версий 20.x и новее предоставляют чистый асинхронный Python интерфейс для Telegram Bot API. Дополнительно смотрите основные изменения в пакете python-telegram-bot версии 20.x.
Здесь рассматривается методы экземпляра bot = telegram.Bot() . Если при создании бота используется пакет расширения telegram.ext , то методы объекта bot будут доступны через:
- updater.bot — это экземпляр telegram.Bot , связанный с экземпляром Updater , который присылает и отправляет все сообщения;
- в функции обратного вызова через контекст context.bot — это telegram.Bot связанный с контекстом обработанного сообщения.
from telegram.ext import Updater, CommandHandler TOKEN = 'Замените строку на Ваш token' updater = Updater(token=TOKEN) dispatcher = updater.dispatcher # экземпляр `telegram.Bot`, связанный с экземпляром `Updater` updater.bot.send_photo(. ) # методы `telegram.Bot` доступны через `context` def call_back(update, context): . # `telegram.Bot` связанный с контекстом # обработанного сообщения context.bot.send_photo(. ) . dispatcher.add_handler(CommandHandler("you_command", call_back))
Публикация файлов, media и URL-адресов в Telegram.
Если нужно отправить файл, например, отправить фото, то для этого есть три метода:
- Загрузить файл в Telegram.
- Отправить HTTP-ссылку, ведущую к файлу
- Отправить file_id уже отправленного файла.
Обратите внимание, что не каждый метод поддерживается везде (например, для thumbnails нельзя передать file_id ).
Смотрим, как можно отправить документ.
- Загрузка файла в Telegram:
bot.send_document(chat_id=chat_id, document=open('tests/test.png', 'rb'))
bot.send_document(chat_id=chat_id, document='https://site.ru/static/test.gif'))
bot.send_document(chat_id=chat_id, document=file_id))
- У каждого бота есть свои собственные идентификаторы файлов, т.е. вы не можете использовать идентификатор файла от другого бота для отправки фотографии
- Как получить fileid фотографии, которую вы отправили? Прочтите его из возвращаемого значения bot.senddocument (или любого другого объекта Message, который вы получите):
message = bot.send_document(. ) file_id = message.document.file_id
Примечание. Метод bot.send_document используется для отправки файлов любого типа. В настоящее время боты могут отправлять файлы любого типа размером до 50 МБ, это ограничение может быть изменено в будущем. Аргументом document может быть либо file_id , либо URL-адрес, либо файл с диска открытый как open(file_name, ‘rb’) . Отправка по URL в настоящее время работает только с файлами GIF, PDF и ZIP.
Это почти так же работает для всех других методов send_media_type , таких как bot.send_photo() , bot.send_video() и т. д.
Далее рассматриваются другие распространенные примеры кода. Обратите внимание на то, что подход к публикации файлов почти одинаков, НО методы экземпляра bot разные!
Опубликовать файл изображения с диска в Telegram.
bot.send_photo(chat_id=chat_id, photo=open('tests/test.png', 'rb'))
Опубликовать фото с URL-адреса в Telegram.
bot.send_photo(chat_id=chat_id, photo='https://telegram.org/img/t_logo.png')
Опубликовать голосовой файл с диска в Telegram.
bot.send_voice(chat_id=chat_id, voice=open('tests/telegram.ogg', 'rb'))
Опубликовать аудио файл с диска в Telegram.
bot.send_audio(chat_id=chat_id, audio=open('tests/test.mp3', 'rb'))
Опубликовать документ или архив с диска в Telegram.
bot.send_document(chat_id=chat_id, document=open('tests/test.zip', 'rb'))
Опубликовать гифку в Telegram.
Используйте этот метод для отправки файлов анимации (видео в формате GIF или H.264/MPEG-4 AVC без звука). В настоящее время боты могут отправлять файлы анимации размером до 50 МБ, это ограничение может быть изменено в будущем.
bot.send_animation(chat_id=chat_id, document=open('tests/animation.gif', 'rb'))
Опубликовать медиа-группу из фото, расположенных в URL-адресах:
Используйте этот метод для отправки группы фотографий или видео в виде альбома.
from telegram import InputMediaPhoto list_of_urls = [ 'https://example.org/commons/foto1.jpg', 'https://example.org/commons/foto2.jpg', 'https://example.org/commons/foto3.jpg' ] # список мультимедиа media_group = [] for number, url in enumerate(list_of_urls): media_group.append(InputMediaPhoto(media=url, caption="Фотография №" + number)) bot.send_media_group(chat_id=chat_id, media=media_group)
Примечание Элементы в списке мультимедиа media_group обязательно должны быть экземплярами InputMediaAudio , InputMediaDocument , InputMediaPhoto или InputMediaVideo .
Редактирование файла, отправленного в Telegram.
Если файл отправлен, то можно его отредактировать. Это работает аналогично send_media_group , т. е. медиаданные должны быть заключены в объект InputMedia . Опять же, с документом в качестве примера:
bot.edit_message_media(chat_id=chat_id, message_id=message_id, media=InputMediaDocument(media=open('tests/test.png'), . ))
Ознакомьтесь с ограничениями на редактирование мультимедиа в документах send_media_group .
Выложить изображение прочитанное в оперативную память:
В этом примере изображение является объектом изображения модуля Pillow , но оно работает одинаково со всеми типами мультимедиа.
from io import BytesIO bio = BytesIO() bio.name = 'image.jpeg' image.save(bio, 'JPEG') bio.seek(0) bot.send_photo(chat_id, photo=bio)
Получить изображение с размерами, максимально приближенными к желаемому размеру:
Где photos — это список объектов PhotoSize , а desired_size — кортеж, содержащий нужный размер.
def get_closest(photos, desired_size): def diff(p): return p.width - desired_size[0], p.height - desired_size[1] def norm(t): return abs(t[0] + t[1] * 1j) return min(photos, key=lambda p: norm(diff(p)))
Загрузка файлов из Telegram сообщений.
Примечание. При загрузке фотографий имейте в виду, что update.message.photo — это массив фотографий разных размеров (упорядоченный от самого малого к большому).
Используйте update.message.photo[-1] , чтобы получить самый большой размер.
file_id = message.voice.file_id newFile = bot.get_file(file_id) newFile.download('voice.ogg')
Для полученного video, voice и т.д нужно изменить message.document на message.video , message.voice и т.д. Однако есть одно исключение: message.photo — это список объектов PhotoSize , которые представляют разные размеры одной и той же фотографии. Чтобы получить наибольший размер, нужно используйте message.photo[-1].file_id .
Кроме того, приведенный выше фрагмент можно сократить, используя встроенные ссылки:
newFile = message.effective_attachment.get_file() newFile.download('file_name')
message.efficient_attachment автоматически содержит любое мультимедийное вложение, которое есть в сообщении — в случае фотографии снова придется использовать, например: message.efficient_attachment[-1].get_file() .
- КРАТКИЙ ОБЗОР МАТЕРИАЛА.
- Переход на асинхронный python-telegram-bot версии 20.x
- Чистый интерфейс Python для Telegram Bot API
- Команды и оповещения @BotFather в Telegram
- Обработка сообщений модулем python-telegram-bot
- Фильтры сообщений модуля python-telegram-bot
- Хранение временных данных модулем python-telegram-bot
- Настройки по умолчанию модуля python-telegram-bot
- Планировщик сообщений модуля python-telegram-bot
- Форматирование и отправка сообщений в python-telegram-bot
- Работа с файлами/media, модуль python-telegram-bot
- Меню из кнопок, модуль python-telegram-bot
- Объект CallbackContext модуля python-telegram-bot
- Подключения Telegram-бота через webhook
- Обработка исключений модуля python-telegram-bot
- Создание Inline-бота, модуль python-telegram-bot
- Работа с опросами в модуле python-telegram-bot
- Создание разговоров ConversationHandler в python-telegram-bot
- Перезапуск телеграмм-бота в случае ошибки
- Декоратор-обработчик сообщений в python-telegram-bot
- Авторизация на сайте через Telegram Passport
- Ведение публикаций в Telegram-канале с python-telegram-bot
- UTF коды emoji/эмодзи для отправки в Telegram из Python
Урок №5. Отправка и получение разных файлов пользователю
В этом уроке мы научимся отвечать и отправлять различные файлы пользователю.
Получение и ответ на файлы пользователя.
В прошлых уроках мы научились отслеживать команды, а также текст. Но что делать если вдруг пользователь отправит нам некий файл(видео, фото, аудио и т.д.)? Для этого по сути используется тот же самый принцип, как и для отслеживания команд и текста. Мы создаем с вами декоратор @bot.message_handler(), но теперь вместо commands мы будем обращаться к content_types и внутри мы говорим какой тип файла мы ожидаем(т.е. этот метод сработает только в том случае, если самому коду будет отправлен определенный файл с конкретным разрешением). Сейчас мы можем указать любой тип файла(это может быть: ‘audio’, ‘video’, ‘photo’). Также данный метод, как и с отслеживаниями команд может срабатывать на несколько типов файлов, если указать их через запятую(Например:content_types = ‘photo’, ‘video’).
Давайте будем обрабатывать изображения. Для этого напишем в content_types наш тип данных (‘photo’). Далее мы создаем функцию, которую назовем get_file. Он также принимает параметр message. Внутри же функции мы будем выполнять ответ на предыдущее сообщение. Для этого мы пишем bot.reply_to(), потом в качестве первого параметра мы указываем message, который указывали в функции. Потом в качестве второго параметра мы указываем текст, который будет отправляться нашему пользователю после того, как он отправит нам файл. В моем случае я буду отправлять: ‘Великолепная фотография’.
Теперь давайте запустим программу и посмотри что получилось.
Telegram бот на Python, отправка файлов, встроенная клавиатура

Это вторая часть статьи, где мы продолжим создавать нашего телеграм бота на Python, и научим его отправлять файлы и выводить настраиваемую клавиатуру.
Отправка файлов Telegram API
В Telegram API есть три способа отправки файлов, для демонстрации воспользуемся методом sendPhoto и добавим три функции для отправки фотографии.
Первая способ: Предоставить файл по URL, Telegram скачает и отправит его (максимальный размер 5 МБ).
def send_photo_url(chat_id, img_url): requests.get(f'/sendPhoto?chat_id=&photo=')
Второй способ: Отправить файл с компьютера (максимальный размер фотографий — 10 МБ, для остальных файлов — 50 МБ).
def send_photo_file(chat_id, img): files = requests.post(f'/sendPhoto?chat_id=', files=files)
Третий способ: Отправить, передав в параметрах file_id файла который уже хранится где-то на серверах Telegram (ограничений нет).
def send_photo_file_id(chat_id, file_id): requests.get(f'/sendPhoto?chat_id=&photo=')
Проверка
Почти все готово, осталось немного отредактировать функцию check_message и приступим к проверке бота.
def check_message(chat_id, message): if message.lower() in ['привет', 'hello']: send_message(chat_id, 'Привет :)') elif message.lower() in 'фото по url': # Отправить URL-адрес картинки (телеграм скачает его и отправит) send_photo_url(chat_id, 'https://ramziv.com/static/assets/img/home-bg.jpg') elif message.lower() in 'фото с компьютера': # Отправить файл с компьютера send_photo_file(chat_id, 'photo.jpg') elif message.lower() in 'фото с сервера телеграм': # Отправить id файла (файл уже хранится где-то на серверах Telegram) send_photo_file_id(chat_id, 'AgACAgIAAxkBAAMqYVGBbdbivL53IzKLfUKUClBnB0cAApy0MRtfMZBKHL0tNw9aITwBAAMCAAN4AAMhBA')
import requests import time TOKEN = 'токен' URL = 'https://api.telegram.org/bot' def get_updates(offset=0): result = requests.get(f'/getUpdates?offset=').json() return result['result'] def send_message(chat_id, text): requests.get(f'/sendMessage?chat_id=&text=') def send_photo_url(chat_id, img_url): requests.get(f'/sendPhoto?chat_id=&photo=') def send_photo_file(chat_id, img): files = requests.post(f'/sendPhoto?chat_id=', files=files) def send_photo_file_id(chat_id, file_id): requests.get(f'/sendPhoto?chat_id=&photo=') def check_message(chat_id, message): if message.lower() in ['привет', 'hello']: send_message(chat_id, 'Привет :)') elif message.lower() in 'фото по url': # Отправить URL-адрес картинки (телеграм скачает его и отправит) send_photo_url(chat_id, 'https://ramziv.com/static/assets/img/home-bg.jpg') elif message.lower() in 'фото с компьютера': # Отправить файл с компьютера send_photo_file(chat_id, 'photo.jpg') elif message.lower() in 'фото с сервера телеграм': # Отправить id файла (файл уже хранится где-то на серверах Telegram) send_photo_file_id(chat_id, 'AgACAgIAAxkBAAMqYVGBbdbivL53IzKLfUKUClBnB0cAApy0MRtfMZBKHL0tNw9aITwBAAMCAAN4AAMhBA') def run(): update_id = get_updates()[-1]['update_id'] # Присваиваем ID последнего отправленного сообщения боту while True: time.sleep(2) messages = get_updates(update_id) # Получаем обновления for message in messages: # Если в обновлении есть ID больше чем ID последнего сообщения, значит пришло новое сообщение if update_id < message['update_id']: update_id = message['update_id'] # Присваиваем ID последнего отправленного сообщения боту # Отвечаем тому кто прислал сообщение боту check_message(message['message']['chat']['id'], message['message']['text']) if __name__ == '__main__': run()
![]()
Фото с компьютера
![]()
Фото с сервера телеграм
![]()
Таким образом вы можете отправить документ, видео, или аудиофайл заменив в URL метод sendPhoto на подходящий.
- sendVoice Используйте этот метод для отправки аудиофайлов, если вы хотите, чтобы клиент Telegram отображал файл как воспроизводимое голосовое сообщение.
- sendDocument Используйте этот метод для отправки общих файлов.
- sendAudio Используйте этот метод для отправки аудиофайлов, если вы хотите, чтобы клиент Telegram отображал их в музыкальном проигрывателе.
- sendVideo Используйте этот метод для отправки видеофайлов, клиент Telegram поддерживают видео в формате mp4 (другие форматы могут быть отправлены как документ ).
- sendPhoto Используйте этот метод для отправки фотографий.
С полным списком методов можно ознакомиться здесь
Встроенная клавиатура
Добавим две функции для вывода настраиваемой клавиатуры в телеграм
InlineKeyboardMarkup - Этот объект представляет собой встроенную клавиатуру, которая появляется рядом с отправленным сообщением.
def inline_keyboard(chat_id, text): reply_markup = ]]> data = requests.post(f'/sendMessage', data=data)
ReplyKeyboardMarkup - Этот объект представляет собой настраиваемую клавиатуру с параметрами ответа
def reply_keyboard(chat_id, text): reply_markup = < "keyboard": [["Фото по url", "Сайт"], ["Привет"]], "resize_keyboard": True, "one_time_keyboard": True>data = requests.post(f'/sendMessage', data=data)
Отредактируем функцию check_message для вывода нашей клавиатуры
def check_message(chat_id, message): if message.lower() in ['привет', 'hello']: send_message(chat_id, 'Привет :)') elif message.lower() in 'сайт': inline_keyboard(chat_id, 'Вы можете ознакомиться\nс товаром на сайте') elif message.lower() in 'фото по url': # Отправить URL-адрес картинки (телеграм скачает его и отправит) send_photo_url(chat_id, 'https://ramziv.com/static/assets/img/home-bg.jpg') elif message.lower() in 'фото с компьютера': # Отправить файл с компьютера send_photo_file(chat_id, 'photo.jpg') elif message.lower() in 'фото с сервера телеграм': # Отправить id файла (файл уже хранится где-то на серверах Telegram) send_photo_file_id(chat_id, 'AgACAgIAAxkBAAMqYVGBbdbivL53IzKLfUKUClBnB0cAApy0MRtfMZBKHL0tNw9aITwBAAMCAAN4AAMhBA') else: reply_keyboard(chat_id, 'Вот что я умею')
Проверка
Проверим как все работает
Отправим боту сообщение Сайт
![]()
Если отправить сообщение на которые бот не может дать ответ, он выведет клавиатуру и сообщение Вот что я умею
![]()
import requests import time import json TOKEN = 'токен' URL = 'https://api.telegram.org/bot' def get_updates(offset=0): result = requests.get(f'/getUpdates?offset=').json() return result['result'] def send_message(chat_id, text): requests.get(f'/sendMessage?chat_id=&text=') def send_photo_url(chat_id, img_url): requests.get(f'/sendPhoto?chat_id=&photo=') def send_photo_file(chat_id, img): files = requests.post(f'/sendPhoto?chat_id=', files=files) def send_photo_file_id(chat_id, file_id): requests.get(f'/sendPhoto?chat_id=&photo=') def inline_keyboard(chat_id, text): reply_markup = ]]> data = requests.post(f'/sendMessage', data=data) def reply_keyboard(chat_id, text): reply_markup = < "keyboard": [["Фото по url", "Сайт"], ["Привет"]], "resize_keyboard": True, "one_time_keyboard": True>data = requests.post(f'/sendMessage', data=data) def check_message(chat_id, message): if message.lower() in ['привет', 'hello']: send_message(chat_id, 'Привет :)') elif message.lower() in 'сайт': inline_keyboard(chat_id, 'Вы можете ознакомиться\nс товаром на сайте') elif message.lower() in 'фото по url': # Отправить URL-адрес картинки (телеграм скачает его и отправит) send_photo_url(chat_id, 'https://ramziv.com/static/assets/img/home-bg.jpg') elif message.lower() in 'фото с компьютера': # Отправить файл с компьютера send_photo_file(chat_id, 'photo.jpg') elif message.lower() in 'фото с сервера телеграм': # Отправить id файла (файл уже хранится где-то на серверах Telegram) send_photo_file_id(chat_id, 'AgACAgIAAxkBAAMqYVGBbdbivL53IzKLfUKUClBnB0cAApy0MRtfMZBKHL0tNw9aITwBAAMCAAN4AAMhBA') else: reply_keyboard(chat_id, 'Вот что я умею') def run(): update_id = get_updates()[-1]['update_id'] # Присваиваем ID последнего отправленного сообщения боту while True: time.sleep(2) messages = get_updates(update_id) # Получаем обновления for message in messages: # Если в обновлении есть ID больше чем ID последнего сообщения, значит пришло новое сообщение if update_id < message['update_id']: update_id = message['update_id'] # Присваиваем ID последнего отправленного сообщения боту # Отвечаем тому кто прислал сообщение боту check_message(message['message']['chat']['id'], message['message']['text']) if __name__ == '__main__': run()
Вот и все, теперь бот может не только поприветствовать, но и отправить файл, и вывести настраиваемую клавиатуру. Скоро я выпушу третью часть, где мы добавим оплату через QIWI кошелек, или любой другой функционал который вы пожелаете. (напишите мне если вы хотите третью часть побыстрее)
Дополнительную информацию о методах вы можете получить в документации.