Как сделать, чтобы команда в aiogram заработала в боте?

Рейтинг: 0Ответов: 1Опубликовано: 16.05.2023

Хочу написать бота и мне нужно, чтобы после ввода пароля срабатывала команда /number. После ввода этой команды человек будет вводить номер телефона и программа будет уже обрабатывать его

from aiogram import Bot, Dispatcher, executor, types
from aiogram.contrib.fsm_storage.memory import MemoryStorage
from aiogram.dispatcher import FSMContext
from aiogram.dispatcher.filters.state import StatesGroup, State

import config

TOKEN = "mytoken"
bot = Bot(token=TOKEN)
storage = MemoryStorage()
dp = Dispatcher(bot, storage=storage)


class FSMInputName(StatesGroup):
    name = State()


@dp.message_handler(commands=["start"])
async def process_start_command(message: types.Message):
    await message.reply("Чтобы войти, введите команду /password")


@dp.message_handler(commands=["password"])
async def cmd_pass(message: types.Message):
    await message.answer("Введите пароль")
    await FSMInputName.name.set()


@dp.message_handler(state=FSMInputName.name)
async def state_pass(message: types.Message, state: FSMContext):
    async with state.proxy() as data:
        data['password'] = message.text
        if message.text == "hkpo123":
            await message.answer("Введите команду /number, чтобы ввести номер клиента")

            @dp.message_handler(commands=["number"])
            async def cmd_num(message1: types.Message):
                await message1.answer("Введите номер")
                await FSMInputName.name.set()

if __name__ == '__main__':
    executor.start_polling(dp, skip_updates=True)

Ответы

▲ 0Принят

Проверьте, в таком виде должен получиться желаемый результат. Команда /number была убрана и получение номера перенесено в FSM

from aiogram import Bot, Dispatcher, executor, types
from aiogram.contrib.fsm_storage.memory import MemoryStorage
from aiogram.dispatcher import FSMContext
from aiogram.dispatcher.filters.state import StatesGroup, State

import config

TOKEN = "mytoken"
bot = Bot(token=TOKEN)
storage = MemoryStorage()
dp = Dispatcher(bot, storage=storage)


class FSMInputName(StatesGroup):
    password = State()
    phone = State()


@dp.message_handler(commands=["start"])
async def process_start_command(message: types.Message):
    await message.reply("Чтобы войти, введите команду /password")


@dp.message_handler(commands=["password"])
async def cmd_pass(message: types.Message):
    await FSMInputName.password.set()
    await message.answer("Введите пароль")


@dp.message_handler(state=FSMInputName.password)
async def state_pass(message: types.Message, state: FSMContext):
    if message.text == "hkpo123":
        async with state.proxy() as data:
            data['password'] = message.text
        await FSMInputName.phone.set()
        await message.answer("Введите номер клиента")
    else:
        await message.answer("Вы ввели неверный пароль. Введите команду /password, чтобы попробовать еще раз")
        await state.finish()

@dp.message_handler(state=FSMInputName.phone)
async def cmd_phone(message: types.Message, state: FSMContext):
    await message.answer(f"Вы ввели номер {message.text}") # Тут вы можете обрабатывать номер телефона
    await state.finish()

if __name__ == '__main__':
    executor.start_polling(dp, skip_updates=True)