Почему callback_query_handler не видит call.data?

Вот код.
def get_phone(message): #получаем номер телефона
    global phone;
    phone = message.text;
    keyboard = types.InlineKeyboardMarkup();
    key_1 = types.InlineKeyboardButton(text='button 1', callback_data='b1');
    keyboard.add(key_1);
    key_2 = types.InlineKeyboardButton(text='button 2', callback_data='b2');
    keyboard.add(key_2);
    key_3 = types.InlineKeyboardButton(text='button 3', callback_data='b3');
    keyboard.add(key_3);
    key_4 = types.InlineKeyboardButton(text='button 4', callback_data='b4');
    keyboard.add(key_4);
    bot.send_message(message.from_user.id, text='Выберите, нажав одну из кнопок:', reply_markup=keyboard);
    bot.register_next_step_handler(message, get_storage);    


@bot.callback_query_handler(func=lambda call: True)
def get_storage(call):
    if call.data == "b1":
...


Получаю ошибку AttributeError: 'Message' object has no attribute 'data'. при обращении к строке if call.data == "b1": чего я не вижу?

Во всех примерах это работает именно так...
  • Вопрос задан
  • 81 просмотр
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
Во всех примерах это работает именно так...

Не верю.

bot.register_next_step_handler() принимает обработчик следующего сообщения, а не кнопки. Собственно, твоя функция и получает объект сообщения.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@codingoleg
Не понятно, на какой библиотеке вы это делаете. Вот вам пример на aiogram 2.25. Думаю, в остальных будет примерно так же, кроме добавленных слов async/await. Сделал по вашему шаблону, но лучше хэндлер с callback разделить на несколько, если их планируется много. Рекомендую ознакомиться, чем отличается types.Message от types.CallbackQuery, а также message_handler от callback_query_handler, чтобы в будущем не было проблем.
from aiogram import Bot, Dispatcher, executor, types

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

@dp.message_handler(commands=['start'])
async def get_phone(message: types.Message):
    keyboard = types.InlineKeyboardMarkup()
    key_1 = types.InlineKeyboardButton(text='button 1', callback_data='b1')
    keyboard.add(key_1)
    key_2 = types.InlineKeyboardButton(text='button 2', callback_data='b2')
    keyboard.add(key_2)
    await bot.send_message(message.from_user.id, text='Выберите, нажав одну из кнопок:', reply_markup=keyboard)

@dp.callback_query_handler(lambda call: True)
async def get_storage(callback: types.CallbackQuery):
    if callback.data == 'b1':
        await callback.message.answer('Вы нажали на button 1')
    if callback.data == 'b2':
        await callback.message.answer('Вы нажали на button 2')

    # Заглушка, чтобы кнопка не мигала после нажатия
    await callback.answer()

executor.start_polling(dp)
Ответ написан
nki
@nki
bezkart.ru готовая система лояльности
Какая-то каша - и callback и next_step_handler. Определитесь, что вы хотите сделать.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы