Похожие элементы

Aiogram - это современный и полностью асинхронный фреймворк для Telegram Bot API, написанный на Python с использованием asyncio и aiohttp.

Документация на Aiogram

Особенности Aiogram 3.2

  • Асинхронный (документы asyncio, PEP 492)
  • Имеет подсказки типа (PEP 484) и может использоваться с mypyramid
  • Поддерживает PyPy
  • Поддерживает Telegram Bot API 6.9 и получает быстрые обновления до последних версий Bot API
  • Код интеграции Telegram Bot API был сгенерирован автоматически и может быть легко восстановлен при обновлении AOI
  • Обновления маршрутизатора (чертежи)
  • Имеет конечный автомат
  • Использует мощные магические фильтры
  • Промежуточное программное обеспечение (входящие обновления и вызовы API)
  • Предоставляет ответы в Webhook
  • Интегрированная поддержка I18n/L10n с GNU Gettext (или Fluent)

Репозиторий на GitHub

Источники

Telegram Bot API

Курсы

Книги

Хабр - 

Основные моменты.

Важно! Для создания бота с использованием AIOgram нужно пройти указанные курсы. 

FSM-бот - FsmBot

FSM (Finite State Machine), машина состояний, конечный автомат. На каждое состояние FSM пишется отдельный обработчик (handler). Обработчик срабатывает на каждую команду и каждое состояние FSM.

# Cоздаем класс, наследуемый от StatesGroup, для группы состояний нашей FSM
class FSMFillForm(StatesGroup):
    # Создаем экземпляры класса State, последовательно перечисляя возможные состояния, в которых будет находиться
    # бот в разные моменты взаимодействия с пользователем
    fill_name = State()        # Состояние ожидания ввода имени
    fill_age = State()         # Состояние ожидания ввода возраста
    fill_gender = State()      # Состояние ожидания выбора пола
    upload_photo = State()     # Состояние ожидания загрузки фото
    fill_education = State()   # Состояние ожидания выбора образования
    fill_wish_news = State()   # Состояние ожидания выбора получать ли новости

# Обработчики:
# Этот хэндлер будет срабатывать на команду /start вне состояний
# и предлагать перейти к заполнению анкеты, отправив команду /fillform
@dp.message(CommandStart(), StateFilter(default_state))
async def process_start_command(message: Message):

# Этот хэндлер будет срабатывать на команду "/cancel" в состоянии
# по умолчанию и сообщать, что эта команда работает внутри машины состояний
@dp.message(Command(commands='cancel'), StateFilter(default_state))
async def process_cancel_command(message: Message):

# Этот хэндлер будет срабатывать на команду "/cancel" в любых состояниях,
# кроме состояния по умолчанию, и отключать машину состояний
@dp.message(Command(commands='cancel'), ~StateFilter(default_state))
async def process_cancel_command_state(message: Message, state: FSMContext):

# Этот хэндлер будет срабатывать на команду /fillform и переводить бота в состояние ожидания ввода имени
@dp.message(Command(commands='fillform'), StateFilter(default_state))
async def process_fillform_command(message: Message, state: FSMContext):

# Этот хэндлер будет срабатывать, если введено корректное имя и переводить в состояние ожидания ввода возраста
@dp.message(StateFilter(FSMFillForm.fill_name), F.text.isalpha())
async def process_name_sent(message: Message, state: FSMContext):

# Этот хэндлер будет срабатывать, если во время ввода имени будет введено что-то некорректное
@dp.message(StateFilter(FSMFillForm.fill_name))
async def warning_not_name(message: Message):

# Этот хэндлер будет срабатывать, если введен корректный возраст и переводить в состояние выбора пола
@dp.message(StateFilter(FSMFillForm.fill_age),
            lambda x: x.text.isdigit() and 4 <= int(x.text) <= 120)
async def process_age_sent(message: Message, state: FSMContext):

# Этот хэндлер будет срабатывать на нажатие кнопки при выборе пола и переводить в состояние отправки фото
@dp.callback_query(StateFilter(FSMFillForm.fill_gender), F.data.in_(['male', 'female', 'undefined_gender']))
async def process_gender_press(callback: CallbackQuery, state: FSMContext):

# Этот хэндлер будет срабатывать, если во время выбора пола будет введено/отправлено что-то некорректное
@dp.message(StateFilter(FSMFillForm.fill_gender))
async def warning_not_gender(message: Message):

# Этот хэндлер будет срабатывать, если отправлено фото и переводить в состояние выбора образования
@dp.message(StateFilter(FSMFillForm.upload_photo), F.photo[-1].as_('largest_photo'))
async def process_photo_sent(message: Message, state: FSMContext, largest_photo: PhotoSize):

# Этот хэндлер будет срабатывать, если выбрано образование и переводить в состояние согласия получать новости
@dp.callback_query(StateFilter(FSMFillForm.fill_education), F.data.in_(['secondary', 'higher', 'no_edu']))
async def process_education_press(callback: CallbackQuery, state: FSMContext):

# Этот хэндлер будет срабатывать, если во время выбора образования будет введено/отправлено что-то некорректное
@dp.message(StateFilter(FSMFillForm.fill_education))
async def warning_not_education(message: Message):

# Этот хэндлер будет срабатывать на выбор получать или не получать новости и выводить из машины состояний
@dp.callback_query(StateFilter(FSMFillForm.fill_wish_news), F.data.in_(['yes_news', 'no_news']))
async def process_wish_news_press(callback: CallbackQuery, state: FSMContext):

# Этот хэндлер будет срабатывать, если во время согласия на получение новостей будет введено/отправлено что-то некорректное
@dp.message(StateFilter(FSMFillForm.fill_wish_news))
async def warning_not_wish_news(message: Message):

# Этот хэндлер будет срабатывать на отправку команды /showdata и отправлять в чат данные анкеты, либо сообщение об отсутствии данных
@dp.message(Command(commands='showdata'), StateFilter(default_state))
async def process_showdata_command(message: Message):

# Этот хэндлер будет срабатывать на любые сообщения, кроме тех для которых есть отдельные хэндлеры, вне состояний
@dp.message(StateFilter(default_state))
async def send_echo(message: Message):
Bookbot  - бот для чтения книги, BookBot

 

Add comment