Inline кнопки не отвечают на нажатия
Вот код
@dp.message_handler(state=Form.buy_or_more)
async def process_inline(message: types.Message):
keyboard = InlineKeyboardMarkup()
buy_button = InlineKeyboardButton('Купить билет', callback_data='buy')
more_button = InlineKeyboardButton('Подробнее о встрече 10 декабря', callback_data='more')
keyboard.add(buy_button)
keyboard.add(more_button)
await message.answer("Выберите действие:", reply_markup=keyboard)
@dp.callback_query_handler(lambda c: c.data == 'buy')
async def process_callback_buy(callback_query: types.CallbackQuery):
await bot.answer_callback_query(callback_query.id)
buy_ticket_text = "Вы можете купить билет по ссылке: [Ссылка на покупку билета]"
await bot.send_message(callback_query.from_user.id, buy_ticket_text)
await bot.send_message(callback_query.from_user.id, "Если вы купили, отправьте скриншот")
await Form.screen.set()
@dp.message_handler(content_types=['photo'], state=Form.screen)
async def process_screenshot(message: types.Message, state: FSMContext):
# Process the screenshot
await bot.send_message(message.from_user.id, "Спасибо. Мне нужно немного времени, чтобы обработать запрос. "
"Электронный билет придет на почту в ближайшее время.")
await bot.send_message(message.from_user.id, "Напишите от 1 до 3х вопросов, которые интересуют вас по теме WWTalks. "
"Самые интересные мы обсудим на нашей встрече.")
await Form.next()
@dp.message_handler(state=Form.questions)
async def process_questions(message: types.Message, state: FSMContext):
# Process the questions
await bot.send_message(message.from_user.id, "Спасибо за участие в формировании актуальных вопросов для ####. "
"Ждем вас на нашей встрече!\n\nКоманда ######")
await Form.buy_or_more.set()
@dp.callback_query_handler(lambda c: c.data == 'more')
async def process_callback_buy(callback_query: types.CallbackQuery):
await bot.answer_callback_query(callback_query.id)
details_text = "Тема: 'Карьера'\n"
await bot.send_message(callback_query.from_user.id, details_text)
Почему не работают inline кнопки? Я думаю это как-то связано с состояниями.
У меня есть код который работает. В нем нету состояния у inline кнопок
@dp.message_handler(commands=['start'])
async def start(message: types.Message):
keyboard = types.InlineKeyboardMarkup()
buy_button = types.InlineKeyboardButton('Купить билет', callback_data='buy')
more_button = types.InlineKeyboardButton('Подробнее о встрече 10 декабря', callback_data='more')
keyboard.add(buy_button, more_button)
await message.answer("Выберите действие:", reply_markup=keyboard)
@dp.callback_query_handler(lambda c: c.data == 'buy')
async def process_callback_buy(callback_query: types.CallbackQuery):
await bot.answer_callback_query(callback_query.id)
buy_ticket_text = "Вы можете купить билет по ссылке: [Ссылка на покупку билета]"
await bot.send_message(callback_query.from_user.id, buy_ticket_text)
await bot.send_message(callback_query.from_user.id, "Если вы купили, отправьте скриншот")
await Form.screen.set()
@dp.message_handler(content_types=['photo'], state=Form.screen)
async def process_screenshot(message: types.Message, state: FSMContext):
await bot.send_message(message.from_user.id, "Спасибо. Мне нужно немного времени, чтобы обработать запрос. "
"Электронный билет придет на почту в ближайшее время.")
await bot.send_message(message.from_user.id, "Напишите от 1 до 3х вопросов, которые интересуют вас по теме WWTalks. "
"Самые интересные мы обсудим на нашей встрече.")
await Form.questions.set()
@dp.message_handler(state=Form.questions)
async def process_questions(message: types.Message, state: FSMContext):
await bot.send_message(message.from_user.id, "Спасибо за участие в формировании актуальных вопросов для #####. "
"Ждем вас на нашей встрече!\n\nКоманда #####")
await state.finish()
@dp.callback_query_handler(lambda c: c.data == 'more')
async def process_callback_buy(callback_query: types.CallbackQuery):
await bot.answer_callback_query(callback_query.id)
details_text = "Тема: 'Карьера'\n"
await bot.send_message(callback_query.from_user.id, details_text)
Ответы (1 шт):
Автор решения: ZxNuClear
→ Ссылка
В предыдущем вашем вопросе я подсказал по поводу состояний, если брать тот кусок кода с клавиатурой
@dp.message_handler(state=Form.email)
async def process_phone(message: types.Message):
email = message.text
if email.startswith("@"):
keyboard = InlineKeyboardMarkup()
buy_button = InlineKeyboardButton('Купить билет', callback_data='buy')
more_button = InlineKeyboardButton('Подробнее о встрече 10 декабря', callback_data='more')
keyboard.add(buy_button)
keyboard.add(more_button)
await message.answer("Выберите действие:", reply_markup=keyboard)
# await Form.buy_or_more.set() <- тут убираем явное назначение состояния
else:
await message.answer("Напиши, пожалуйста, email (важно, т.к. электронный адрес должен совпадать с тем, что ты укажешь при оплате")
убираем в нем явное назначение следующего состояния. И вместо этого для обработчиков кнопок указывайте state='*' вот так
для кнопки 'Купить билет'
@dp.callback_query_handler(text='buy', state='*')
async def process_callback_buy(call: types.CallbackQuery):
await bot.answer_callback_query(call.id)
buy_ticket_text = "Вы можете купить билет по ссылке: [Ссылка на покупку билета]" # Замените ссылкой на покупку билета
await bot.send_message(call.from_user.id, buy_ticket_text)
await bot.send_message(call.from_user.id, "Если вы купили, отправьте скриншот")
await Form.screen.set() # <- регистрируем следующее состояние
@dp.message_handler(content_types=['photo'], state=Form.screen)
async def process_screenshot(message: types.Message, state: FSMContext):
# Process the screenshot
await bot.send_message(message.from_user.id, "Спасибо. Мне нужно немного времени, чтобы обработать запрос. "
"Электронный билет придет на почту в ближайшее время.")
await bot.send_message(message.from_user.id, "Напишите от 1 до 3х вопросов, которые интересуют вас по теме WWTalks. "
"Самые интересные мы обсудим на нашей встрече.")
await Form.next()
для кнопки 'Подробнее о встрече 10 декабря'
@dp.callback_query_handler(text='more', state='*')
async def process_callback_buy(callback_query: types.CallbackQuery, state: FSMContext):
await bot.answer_callback_query(callback_query.id)
details_text = "Тема: 'Карьера'\n"
await bot.send_message(callback_query.from_user.id, details_text)
в таком случае хэндлеры должны отлавливать нажатия кнопок, когда запущено какое нибудь состояние