MasterGroosha / aiogram-3-guide

Пишем Telegram-ботов с aiogram 3.x
https://mastergroosha.github.io/aiogram-3-guide/
MIT License
879 stars 135 forks source link

Вопрос по aiogram #91

Closed Dev-Cored closed 2 months ago

Dev-Cored commented 2 months ago

Привет, Груша! Прости за глупый вопрос, но я не нашел в твоей книге про то, как сделать, чтобы после сообщения бот ждал от пользователя ответ набранный с клавиатуры как сообщение. И чтобы затем можно было это сообщение обработать. Пошарился по этому вопросу в интернете, все ответы на эту тему кардинально отличаются друг от друга и ничего не работает. Было бы очень приятно, если бы ты немного дополнил свою наикрутейшую, без преувеличений, книгу! Спасибо заранее))

MasterGroosha commented 2 months ago

Привет, по этому вопросу есть целая глава: https://mastergroosha.github.io/aiogram-3-guide/fsm/

Dev-Cored commented 2 months ago

Проблема в том, что там обсуждается ввода готового текста с кнопки, а меня интересует ввод пользователем с клавиатуры. Т.е. После вопроса от бота "Введите число от 1 до 100" не добавлять 100 кнопок, а на прямую от пользователя получить ввод. И спасибо за быстрый отклик)

Dev-Cored commented 2 months ago

Все, понял! Прости за беспокойство

MasterGroosha commented 2 months ago

Вот минимальный воспроизводимый пример с решением: (aiogram 3.10.0)

import asyncio

from aiogram import Bot, Dispatcher, Router
from aiogram.filters import BaseFilter, CommandStart, StateFilter
from aiogram.fsm.context import FSMContext
from aiogram.types import Message

dp = Dispatcher()
bot = Bot(token="токен")
router = Router()

class TextNumberFilter(BaseFilter):
    async def __call__(self, message: Message) -> bool:
        if not message.text.isdigit():
            return False
        return 1 <= int(message.text) <= 100

@router.message(CommandStart())
async def cmd_start(message: Message, state: FSMContext):
    await message.answer("Введите число")
    await state.set_state("entering_number")

@router.message(StateFilter("entering_number"), TextNumberFilter())
async def on_valid_number(message: Message, state: FSMContext):
    await message.answer("Да, это хорошее число. Спасибо! Повторить: /start")
    await state.clear()

@router.message(StateFilter("entering_number"))
async def on_invalid_number(message: Message):
    await message.answer("Это плохое число. Попробуйте ещё раз.")

async def main():
    dp.include_router(router)
    print("Starting polling...")

    async with bot:
        await dp.start_polling(bot)

if __name__ == '__main__':
    asyncio.run(main())
Dev-Cored commented 2 months ago

@MasterGroosha Мастер Груша, прости за очередное беспокойство! Я просто не понимаю, что не так в моем коде. Бот полностью игнорирует все сообщения. https://github.com/Dev-Cored/life-author-telegram-bot Вот ссылка на реп. Пытался повторить структуру файлов как в главе с роутерами, но просто нет реакции на сообщения. Просто пишет про игнорирование команды...