AIOgram3 8.2 Команда отправки файла, продолжение
В этом посте закончим делать команду отправляющую файл пользователю через Telegram.
Дополнительные материалы
Для скачивания материалов необходимо войти или зарегистрироваться
Файлы также можно получить в Telegram-боте по коду: 715723
Реклама
Продолжим с того, на чём остановились.
В файле send_file.py
напишем вторую асинхронную функцию send_file_get_data
, она так же принимает объект Message
и FSMContext
.
Логика функции.
В предыдущей функции send_file_start
мы получили от пользователя код файла, теперь необходимо выполнить запрос данных по API.
Если код неверный.
Делаем проверку на введённые данные, если там не только цифры, то отправляем пользователю сообщение, что код неверный и повторно ожидаем ввода.
Пропишем сообщение в файле views.py
в функции send_file_wrong_input
.
Если код верный.
Если формат верный, то в блоке if
отправляем сообщение из функции send_file_please_wait
во views.py
, что запрос выполняется.
Здесь же, в блоке if
, создаём переменную data
и выполняем функцию get_path
из файла api_actions.py
, передавая в неё текст сообщения от пользователя.
Если данные не вернулись.
Далее у нас снова проверка, в этот раз на содержимое переменной data
, если она пустая, то отправляем пользователю сообщение, что файл не найден и нужно попробовать снова.
Если данные вернулись.
Если же в переменной data
есть необходимые данные, то создаём переменную file
и присваиваем ей объект класса FSInputFile
, в параметры которого, передаём путь до файла полученный из переменной data
.
Удаляем предыдущее сообщение о выполнении запроса и отправляем файл.
В метод отправки файла передаём chat_id
, переменную с путём до файла и подпись к файлу из функции file_caption
в файле views.py
.
А потом закрываем машину состояний.
Код:
from aiogram.fsm.context import FSMContext
from aiogram.types import Message, FSInputFile
from botlogic import views
from botlogic.settings import bot
from botlogic.utils import api_actions
async def send_file_get_data(message: Message, state: FSMContext):
if message.text.isdigit():
await message.answer(views.send_file_please_wait())
data = api_actions.get_path(message.text)
if data:
file = FSInputFile(path=data['file_path'])
await bot.delete_message(message.chat.id, message.message_id + 1)
await bot.send_document(message.chat.id, document=file, caption=views.file_caption(data['title']))
await state.clear()
else:
await message.answer(views.send_file_not_found())
else:
await message.answer(views.send_file_wrong_input())
Регистрируем функцию.
Осталось зарегистрировать в файле main.py
:
from botlogic.utils.statesform import SendFileSteps
dp.message.register(send_file.send_file_get_data, SendFileSteps.get_code_from_user)
Тестирование.
Можем проверять.
Запустим Django в отдельном окне и запустим бота.
Перейдя в бота напишем нашу команду /get_file
и в ответ на запрос код файла 0
.
И бот в ответ пришлёт файл.
Надеюсь, что и у вас всё заработало как надо, если же нет, пишите вопросы и проблемы с которыми вы столкнулись в комментариях.
Все статьи