Пересылка сообщений из бота в канал

есть кодик

logging.basicConfig(level=logging.INFO)

bot = Bot(token=API_TOKEN)
dp = Dispatcher(bot)


@dp.message_handler(commands=['start'])
async def process_start_command(message: types.Message):
keyboard = types.ReplyKeyboardMarkup(resize_keyboard=True)
button1 = types.KeyboardButton(text="Оставить заявку")
button2 = types.KeyboardButton(text="Обратная связь")
keyboard.add(button1, button2)
await message.answer("Выберите действие:", reply_markup=keyboard)


@dp.message_handler(lambda message: message.text == "Оставить заявку")
async def process_request_command(message: types.Message):
await message.answer("Пришлите номер телефона и e-mail")


@dp.message_handler(lambda message: message.text == "Обратная связь")
async def process_feedback_command(message: types.Message):
await bot.send_message(chat_id=ADMIN_CHAT_ID, text=f"Пользователь t.me/{message.from_user.username} запрашивает обратную связь.")


@dp.message_handler()
async def echo_message(msg: types.Message):
await bot.send_message(chat_id=ADMIN_CHAT_ID, text=f"Номер телефона и e-mail: {msg.text}")
await bot.send_message(chat_id=msg.from_user.id, text="Ожидайте уведомление в течение суток")


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

Скрипт был залит на сервер, запущен, вроде бы работает, но есть "но", при отправке абсолютно любого сообщение он отправляет это сообщение в канал, и не важно была ли нажата какая либо кнопка. Мне хотелось бы чтобы он отправлял только одно сообщение из кнопки "оставить заявку", по типу - нажал на кнопку "оставить заявку" мне пришёл(обычному юзеру) ответ "пришлите номер тел .. " я пишу условно что то, и это что то он переслал в необходимый мне канал\чат


Ответы (1 шт):

Автор решения: Medvedev

Используйте машину состояний. Больше информации в документации.

Как пример:

class Form(StatesGroup): # настраиваем состояния
    name = State()
    phone = State()
    email = State()
   

@dp.message_handler(lambda message: message.text == "Оставить заявку")
async def start_form(message: types.Message, state: FSMContext):
    await state.set_state(Form.name) # устанавливаем состояние
    await bot.send_message(callback_query.from_user.id, "Как вас зовут?")
  
@dp.message(Form.name) # обрабатывает состояние по name
async def process_surname(message: types.Message, state: FSMContext):
    await state.update_data(surname=message.text)
    await state.set_state(Form.phone) # устанавливаем следующее состояние
    await bot.send_message(message.chat.id, "Какой у вас телефон?")
    


@dp.message(Form.phone)
async def process_phone(message: types.Message, state: FSMContext):
    await state.update_data(phone=message.text)
    await state.set_state(Form.email)
    await bot.send_message(message.chat.id, "Введите вашу почту:")
    


@dp.message(Form.email)
async def process_email(message: types.Message, state: FSMContext):
    user_data = await state.get_data()
    name = user_data.get('name')
    phone = user_data.get('phone')
    email = message.text
    ADMIN_ID = '00000000' # ваш ид чата
    await bot.send_message(ADMIN_ID, f"Фамилия: {name}\nТелефон: {phone}\nEmail: {email}")
    await state.finish() # завершаем
→ Ссылка