Почему возникает ошибка Python Telebot: AttributeError: у объекта 'Message' нет атрибута 'data'? Возможно, вы имели в виду атрибут 'date'?

Здравствуйте! На протяжении трех дней я сталкиваюсь с ошибкой в коде. Вот фрагмент кода: <br/> <pre><code class="python">@bot.callback_query_handler(func=lambda call: True)
def add(call):
    global category, purpose
    #обработка нажатия на кнопку доход или расход
    if call.data == "button1_in":
        category = 'Доход'
        purpose = 'Заработная плата'
        bot.send_message(call.message.chat.id, "Укажите сумму:")
        bot.register_next_step_handler(call.message, add_amount)

def add_amount(message):
    amount = message.text.strip()
    user_id = message.from_user.id
    if is_number(amount):
        print(user_id, category, purpose, amount)
        bot.send_message(message.chat.id, f"{category} {amount} учтен в категории: {purpose}")
        db.add_db(user_id, category, purpose, amount)
    else:
        bot.send_message(message.chat.id, "Введено некорректное значение! Повторите попытку.")</code></pre> <br/> <br/> Я получаю следующую ошибку: <br/> <pre><code>File "/home/nadir/PycharmProjects/MoneyGram/main.py", line 48, in add
    if call.data == "button1_in":
       ^^^^^^^^^
AttributeError: 'Message' object has no attribute 'data'. Did you mean: 'date'?</code></pre> <br/> <br/> Обратите внимание, что функция add_amount работает корректно, но затем выполнение возвращается к строке с условием if call.data == "button1_in", где возникает ошибка. Как я могу её исправить?
  • 21 февраля 2025 г. 19:54
Ответы на вопрос 1
Ошибка, с которой вы сталкиваетесь, связана с тем, что используете объект `call`, который, по всей видимости, является объектом типа `Message`, а не `CallbackQuery`, что вызывает проблему при попытке доступа к атрибуту `data`. 

Ваша функция `add` выглядит правильно, если она должна обрабатывать колбэки. Однако возможной причиной возникновения этой ошибки может быть то, что на самом деле в функцию `add` передается не колбэк-запрос (т.е. объект `callback_query`), а объект `message`. Это может произойти, если вы не вызываете правильный обработчик колбэков, а вместо этого используете обработчик сообщений (например, через `@bot.message_handler`).

Давайте перепроверим и убедимся, что вы вызываете именно правильный обработчик. Вот более точный вариант вашего кода с потенциальными исправлениями:

```python
@bot.callback_query_handler(func=lambda call: True)
def add(call):
    global category, purpose
    # обработка нажатия на кнопку доход или расход
    if call.data == "button1_in":
        category = 'Доход'
        purpose = 'Заработная плата'
        bot.send_message(call.message.chat.id, "Укажите сумму:")
        bot.register_next_step_handler(call.message, add_amount)

def add_amount(message):
    amount = message.text.strip()
    user_id = message.from_user.id
    if is_number(amount):
        print(user_id, category, purpose, amount)
        bot.send_message(message.chat.id, f"{category} {amount} учтен в категории: {purpose}")
        db.add_db(user_id, category, purpose, amount)
    else:
        bot.send_message(message.chat.id, "Введено некорректное значение! Повторите попытку.")

# Пример того, как вы можете настроить обработчик сообщений
@bot.message_handler(content_types=['text'])
def handle_text(message):
    # Обработка текстовых сообщений
    pass
```

Проверьте также, что вы не вызываете функцию `add` напрямую где-то в другом месте вашего кода с объектом типа `Message`. Она должна вызываться только в контексте обработки события колбэка.

Если вы найдете ошибку в другом месте, меняйте обработчики соответственно. Пожалуйста, дайте знать, если у вас есть дополнительные вопросы или если проблема сохраняется!
Похожие вопросы