изменение сообщения в aiogram
я хочу сделать что бы на команду a_or_b высылалась inline клавиатура с выбором a или b при нажатии например на a что то делалось и снизу была кнопка с текстом назад при нажатии возвращало на выбор a или b, я хочу это реализовать в одном сообщение. Я сделал вот такой код
class MainStates(StatesGroup):
MENU = State()
ACTION_A = State()
ACTION_B = State()
@router.message(Command('a_or_b'))
async def a_or_b(message: Message, state: FSMContext):
# Отправляем сообщение с клавиатурой выбора кнопок A и B
msg = await message.reply(text='Выберите кнопку A или B', reply_markup=a_or_b_inline())
# Устанавливаем состояние, в котором находимся (MENU)
await state.set_state(MainStates.MENU)
# Сохраняем message_id сообщения, чтобы в дальнейшем изменить его текст и клавиатуру
await state.update_data(msg_id=msg.message_id)
@router.callback_query(MainStates.MENU)
async def process_callback_menu(callback: CallbackQuery, state: FSMContext, bot: Bot):
if callback.data == 'button_a':
await bot.answer_callback_query(callback_query_id=callback.id, text="Вы выбрали A")
# Выполняем какие-то действия при выборе кнопки A
# Устанавливаем состояние, в котором находимся (ACTION_A)
await state.set_state(MainStates.ACTION_A)
# Отправляем сообщение с текстом и клавиатурой для выбора кнопки
message_id = (await state.get_data()).get('msg_id')
await bot.edit_message_text(chat_id=callback.from_user.id, text='Подтвердите выбор', message_id=message_id,
reply_markup=a_or_b_inline_next())
elif callback.data == 'button_b':
await bot.answer_callback_query(callback_query_id=callback.id, text="Вы выбрали B")
# Выполняем какие-то действия при выборе кнопки B
# Отправляем сообщение с текстом и клавиатурой для выбора кнопки
message_id = (await state.get_data()).get('msg_id')
await bot.edit_message_text(chat_id=callback.from_user.id, text='Подтвердите выбор', message_id=message_id,
reply_markup=a_or_b_inline_next())
@router.callback_query(F.text == 'back', MainStates.ACTION_A, MainStates.ACTION_B)
async def process_callback_back(callback_query: CallbackQuery, state: FSMContext, bot: Bot):
await bot.answer_callback_query(callback_query.id)
# Отправляем сообщение с текстом и клавиатурой для выбора кнопок A и B
message_id = (await state.get_data()).get('msg_id')
await bot.edit_message_text('Выберите кнопку A или B', message_id, reply_markup=a_or_b_inline())
# Возврат к начальному состоянию (MENU)
await state.set_state(MainStates.MENU)
клавиатура:
def a_or_b_inline():
keyboard = InlineKeyboardBuilder()
keyboard.button(text='A', callback_data='button_a')
keyboard.button(text='B', callback_data='button_b')
keyboard.adjust(2)
return keyboard.as_markup()
def a_or_b_inline_next():
keyboard = InlineKeyboardBuilder()
keyboard.button(text='Назад', callback_data='back')
return keyboard.as_markup()
можете ли вы исправь этот код почему он не работает весь код если кому нужен
Ответы (1 шт):
Автор решения: Baggrisha
→ Ссылка
Как посмотрел у тя была ошибка(В следующий раз приклепряй, какую ошибку выдает), что ты айди чата не указал, посмотри вроде ошибок быть не должно
def a_or_b_inline():
keyboard = InlineKeyboardBuilder()
keyboard.button(text='A', callback_data='button_a')
keyboard.button(text='B', callback_data='button_b')
keyboard.adjust(2)
return keyboard.as_markup()
def a_or_b_inline_next():
keyboard = InlineKeyboardBuilder()
keyboard.button(text='Назад', callback_data='back')
return keyboard.as_markup()
class MainStates(StatesGroup):
MENU = State()
ACTION_A = State()
ACTION_B = State()
@dp.message(Command('a_or_b'))
async def a_or_b(message: Message, state: FSMContext):
# Отправляем сообщение с клавиатурой выбора кнопок A и B
msg = await message.reply(text='Выберите кнопку A или B', reply_markup=a_or_b_inline())
# Устанавливаем состояние, в котором находимся (MENU)
await state.set_state(MainStates.MENU)
# Сохраняем message_id сообщения, чтобы в дальнейшем изменить его текст и клавиатуру
await state.update_data(msg_id=msg.message_id)
@dp.callback_query(MainStates.MENU)
async def process_callback_menu(callback: CallbackQuery, state: FSMContext, bot: Bot):
if callback.data == 'button_a':
await bot.answer_callback_query(callback_query_id=callback.id, text="Вы выбрали A")
# Выполняем какие-то действия при выборе кнопки A
# Устанавливаем состояние, в котором находимся (ACTION_A)
await state.set_state(MainStates.ACTION_A)
# Отправляем сообщение с текстом и клавиатурой для выбора кнопки
await bot.edit_message_text(chat_id=callback.from_user.id, text='Подтвердите выбор', message_id=callback.message.message_id, reply_markup=a_or_b_inline_next())
elif callback.data == 'button_b':
await bot.answer_callback_query(callback_query_id=callback.id, text="Вы выбрали B")
# Выполняем какие-то действия при выборе кнопки B
# Отправляем сообщение с текстом и клавиатурой для выбора кнопки
# message_id = (await state.get_data()).get('msg_id')
await bot.edit_message_text(chat_id=callback.from_user.id, text='Подтвердите выбор', message_id=callback.message.message_id, reply_markup=a_or_b_inline_next())
await state.clear()
@dp.callback_query(F.data.startswith('back'))
async def process_callback_back(callback: CallbackQuery, state: FSMContext, bot: Bot):
await bot.answer_callback_query(callback.id)
# Отправляем сообщение с текстом и клавиатурой для выбора кнопок A и B
# message_id = (await state.get_data()).get('msg_id')
await bot.edit_message_text(chat_id=callback.from_user.id ,text='Выберите кнопку A или B', message_id=callback.message.message_id, reply_markup=a_or_b_inline())
# Возврат к начальному состоянию (MENU)
await state.set_state(MainStates.MENU)