Бот не реагирует на нажатие InlineButton в aiogram 2.25.1
Столкнулся с такой проблемой - бот не реагирует на нажатие InlineKeyboardButton в aiogram 2.25.1. Что должен делать бот:
При первом запуске бот должен запросить номер телефона пользователя. После получения номера бот записывает его в БД с отрицательным флагом активности нового пользователя. Админам бота приходит сообщение о регистрации нового пользователя. К этому сообщению прикрепляются две инлайн кнопки - "добавить" и "отменить". При нажатии на "добавить" бот меняет флаг активности пользователя на активный и пользователь получает доступ к базе знаний бота.
Но в моём случае бот не реагирует на нажатие кнопок. То есть он не переходит в коллбек функцию, которая должна отловить нажатие кнопок. Отладочные принты не печатаются.
В этой функции я создаю клавиатуру и кнопки:
@dp.message_handler(state=UserInfoStateGroup.phone)
async def get_users_phone(message: types.Message, state: FSMContext):
user_phone = message.text
if user_phone.isdigit() and len(user_phone) == 11:
# Проверяем, есть ли этот номер в базе данных, если нет - присылаем админу сообщение,
# в котором он либо добавит человека, либо нет
wwdb = WorkWithDB()
user_name = f"{message.from_user.full_name}"
response = wwdb.check_current_user(
phone_number=user_phone,
name=user_name,
telegram_id=message.from_user.id
)
await bot.send_message(chat_id=message.from_user.id, text=response[0])
if response[1] is True:
with open('admin_users.json', 'r', encoding='utf-8') as admins_list:
admins = json.load(admins_list)['admins_list']
for admin in admins:
keyboard = InlineKeyboardMarkup(row_width=2)
button_add = InlineKeyboardButton(text="Добавить в БД", callback_data=f"add:{message.from_user.id}")
button_cancel = InlineKeyboardButton(text="Отменить", callback_data=f"cancel:{message.from_user.id}")
keyboard.add(button_add, button_cancel)
await bot.send_message(chat_id=admin, text="Ваши действия", reply_markup=keyboard)
else:
await message.answer("Попробуйте еще раз")
await state.set_state(UserInfoStateGroup.phone)
Вот так выглядит моя коллбек функция, которая должна отлавливать нажатие кнопок:
@dp.callback_query_handler(lambda c: c.data.startswith('add:'))
async def change_user_status(callback: CallbackQuery):
print("Я обрабатываю кнопку админа")
user_id = int(callback.data.split(":")[1])
db = WorkWithDB()
db.change_users_active_flag(user_id)
with open("admin_users.json", "r", encoding="utf-8") as admins_list:
admins = json.load(admins_list)['admins_list']
for admin in admins:
await bot.send_message(chat_id=admin, text="Пользователь стал активным")
await bot.send_message(chat_id=user_id, text="Ты зарегистрирован")
@dp.callback_query_handler(lambda c: c.data.startswith('cancel:'))
async def cancel_registration(callback: CallbackQuery):
user_id = int(callback.data.split(":")[1])
await bot.send_message(chat_id=user_id, text="Ты отменил регистрацию пользователя!")
Прошу помощи! Бьюсь не первый день с этим вопросом!
Ответы (1 шт):
Нашел решение на заморском сайте!
Нужно добавить:
state="*"
в функцию
@dp.callback_query_handler(lambda c: c.data.startswith('add:'))
И вот оно - счастье!