Как решить проблему с работой callback в библиотеке Telebot для Python?

У меня возникла проблема с работой обработчика callback-запросов в моем боте. Я реализовал @bot.callback_query_handlers(func=lambda callback: True), но он не функционирует должным образом. Как мне это исправить? <br/> <pre><code class="python">import telebot
from telebot import types

bot = telebot.TeleBot("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX")

@bot.message_handler(commands=['start'])
def starting_text(message):
    markup = types.InlineKeyboardMarkup()
    key1 = types.InlineKeyboardButton('Наш сайт', url='https://google.com')
    key2 = types.InlineKeyboardButton('Написать в поддержку', url='https://google.com')
    key3 = types.InlineKeyboardButton('Прайс лист', callback_data='Price')
    key4 = types.InlineKeyboardButton('Купить', callback_data='Pay')
    markup.row(key1)
    markup.row(key2, key3, key4)
    bot.send_message(message.chat.id, f'Здраствуйте, {message.from_user.first_name}. Это магазин одежды Munn', reply_markup=markup)

@bot.callback_query_handlers(func=lambda callback: True)
def keyboard(callback):
    if callback.data == 'Price':
        bot.send_message(callback.chat.id, f'Кросовки(id 1): 4990p\nШапки(id 2): 1290p')
    elif callback.data == 'Pay':
        bot.send_message(callback.chat.id, f'Введите id товара: ')

print('Успешно!')
bot.polling(none_stop=True)</code></pre> <br/> <br/> При компиляции возникает ошибка: <br/> <br/> Traceback (most recent call last): <br/> File "C:\Users\bebro\PycharmProjects\Correction Text bot\bot.py", line 17, in <br/> @bot.callback_query_handlers(func=lambda callback: True) <br/> ~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^ <br/> TypeError: 'list' object is not callable
  • 13 октября 2024 г. 13:02
Ответы на вопрос 2
Похоже, у вас произошла ошибка в коде из-за неправильного использования декоратора `@bot.callback_query_handlers`. В библиотеке `Telebot` правильный декоратор для обработки callback-запросов — это `@bot.callback_query_handler`, а не `@bot.callback_query_handlers`. Это решение должно исправить вашу проблему. 

Вот исправленный код:

```python
import telebot
from telebot import types

bot = telebot.TeleBot("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX")

@bot.message_handler(commands=['start'])
def starting_text(message):
    markup = types.InlineKeyboardMarkup()
    key1 = types.InlineKeyboardButton('Наш сайт', url='https://google.com')
    key2 = types.InlineKeyboardButton('Написать в поддержку', url='https://google.com')
    key3 = types.InlineKeyboardButton('Прайс лист', callback_data='Price')
    key4 = types.InlineKeyboardButton('Купить', callback_data='Pay')
    markup.row(key1)
    markup.row(key2, key3, key4)
    bot.send_message(message.chat.id, f'Здравствуйте, {message.from_user.first_name}. Это магазин одежды Munn', reply_markup=markup)

@bot.callback_query_handler(func=lambda callback: True)
def keyboard(callback):
    if callback.data == 'Price':
        bot.send_message(callback.message.chat.id, f'Кроссовки(id 1): 4990p\nШапки(id 2): 1290p')
    elif callback.data == 'Pay':
        bot.send_message(callback.message.chat.id, f'Введите id товара: ')
    bot.answer_callback_query(callback.id)  # Не забудьте подтвердить обработку callback

print('Успешно!')
bot.polling(none_stop=True)
```

### Основные изменения:

1. **Исправленный декоратор:** Заменил `@bot.callback_query_handlers` на `@bot.callback_query_handler`.

2. **Использование `callback.message.chat.id`:** Для отправки сообщения в ответ на callback-запросы необходимо использовать `callback.message.chat.id`, а не `callback.chat.id`.

3. **Подтверждение обработки callback:** Добавил строку `bot.answer_callback_query(callback.id)`, чтобы Telegram знал, что вы успешно обработали запрос. Это предотвращает появление уведомлений о «необработанных» callback-запросах.

Теперь ваш бот должен правильно реагировать на нажатия кнопок в инлайн-клавиатуре.
не @bot.callback_query_handlers 
а @bot.callback_query_handler
s в конце лишняя
Похожие вопросы