Cat

AIOgram3 8.2 Команда отправки файла, продолжение

В этом посте закончим делать команду отправляющую файл пользователю через Telegram.

Все статьи

Icon Link

Дополнительные материалы

Icon Link

Реклама

Icon Link
Telegram-бот на AIOgram3 proDream 15 Август 2023 Просмотров: 1811

Продолжим с того, на чём остановились.
В файле 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.
 

И бот в ответ пришлёт файл.

 

Надеюсь, что и у вас всё заработало как надо, если же нет, пишите вопросы и проблемы с которыми вы столкнулись в комментариях.

Автор

    Нет комментариев

    Реклама