AIOgram3 8.1 Команда отправки файла
В этом посте начнём писать функцию для отправки файла пользователю через Telegram. В этой функции будет использоваться машина состояний.
Дополнительные материалы
Для скачивания материалов необходимо войти или зарегистрироваться
Файлы также можно получить в Telegram-боте по коду: 523628
Реклама
Работы много, по этому без лишних слов, приступим!
В пакете handlers
создадим файл send_file.py
и откроем его. Так же сразу откроем файл main.py
, views.py
и statesform.py
. В основном работать будем в send_file.py
, но другие три тоже будут нужны.
Команда отправки файла.
В файле send_file.py
создадим асинхронную функцию send_file_start
, в качестве аргументов она будет получать объект типа Message
и FSMContext
.
FSMContext
- это асинхронный контекст, который хранит информацию о текущем состоянии пользователя во время работы Telegram-бота. Он предоставляет функции для переключения между состояниями, сохранения и извлечения данных, а также другие операции, связанные с управлением состояниями.
Сообщение пользователю.
Перейдём в views.py
и создадим функцию send_file_start_msg
, возвращающую строку с сообщением для пользователя.
def send_file_start_msg():
return """Для получения файла с дополнительными материалами к посту,
пожалуйста введите код из поста."""
Состояния.
Теперь перейдём в файл statesform.py
и создадим класс SendFileSteps
унаследованный от StatesGroup
.
Пропишем первое поле, он же шаг в машине состояний.
from aiogram.fsm.state import StatesGroup, State
class SendFileSteps(StatesGroup):
get_code_from_user = State()
Тело функции send_file_start
.
Вернёмся в send_file.py
и в теле функции напишем отправку сообщения пользователю и переход к следующему шагу.
from aiogram.fsm.context import FSMContext
from aiogram.types import Message
from botlogic import views
from botlogic.utils.statesform import SendFileSteps
async def send_file_start(message: Message, state: FSMContext):
await message.answer(views.send_file_start_msg())
await state.set_state(SendFileSteps.get_code_from_user)
Регистрация функции.
Перейдём в файл main.py
и после обработки событий запуска/остановки, зарегистрируем функцию на обработку команды get_file
:
from aiogram.filters import Command
from botlogic.handlers import send_file
dp.message.register(send_file.send_file_start, Command(commands='get_file'))
При регистрации функции echo
, мы не указывали второго параметра, поскольку нам надо было обрабатывать все входящие сообщения. Здесь мы указали вторым параметром объект класса Command
, являющийся фильтром.
Что тут происходит?
При вызове команды, запускается машина состояний, тем самым все вводимые команды будут проигнорированы, а сообщения будут обработаны так, как этого требует логика.
После того как запустилась машина, пользователю отправляется сообщение, о необходимости ввести код и до тех пор, пока пользователь не отправит сообщение, перехода на следующий шаг не будет.
Когда пользователь отправит сообщение, машина сменит состояние на следующую функцию.
Все статьи