Telebot вылазит ошибка "'CallbackQuery' object has no attribute 'chat'

Только начал делать своего первого +- большого бота, но тут же столкнулся с ошибкой:

*(async_telebot.py:591 MainThread) ERROR - TeleBot: "'CallbackQuery' object has no attribute 'chat'*

Когда нажимаю на кнопку назад, то вылазит эта ошибка, совсем без понятия что делать.

Код:

import asyncio
from telebot.async_telebot import AsyncTeleBot
from telebot.types import InlineKeyboardMarkup, InlineKeyboardButton

bot = AsyncTeleBot("TOKEN")

@bot.message_handler(commands=['start'])
async def cmd_start(message):
    await bot.send_message(message.chat.id, "Привет ✌️ ")
    markup = InlineKeyboardMarkup(row_width=1)
    item1 = InlineKeyboardButton("Все активы", callback_data='bt1')
    item2 = InlineKeyboardButton("Выбор счета", callback_data='bt2')
    item3 = InlineKeyboardButton("Группу счетов", callback_data='bt3')
    markup.add(item1, item2, item3)
    await bot.send_message(message.chat.id, 'Выбери где будут вестись финансы:', reply_markup=markup)

@bot.callback_query_handler(func=lambda callback: True)
async def handle_callback(callback):
    if callback.data == "bt1":
        await handle_all_assets(callback)
    elif callback.data == "bt2":
        await handle_account_selection(callback)
    elif callback.data == "bt3":
        await handle_group_selection(callback)
    elif callback.data == "back1" or callback.data == "back2" or callback.data == "back3":
        await cmd_start(callback)

async def handle_all_assets(callback):
    markup = InlineKeyboardMarkup(row_width=2)
    plus1 = InlineKeyboardButton(text="Добавить ➕", callback_data="plus1")
    minus1 = InlineKeyboardButton(text="Убрать ➖", callback_data="min1")
    back1 = InlineKeyboardButton(text="Назад", callback_data="back1")
    markup.add(plus1, minus1, back1)
    await bot.send_message(callback.message.chat.id, "Общее количество финансов:", reply_markup=markup)

async def handle_account_selection(callback):
    markup = InlineKeyboardMarkup(row_width=2)
    plus2 = InlineKeyboardButton(text="Добавить ➕", callback_data="plus2")
    minus2 = InlineKeyboardButton(text="Убрать ➖", callback_data="min2")
    back2 = InlineKeyboardButton(text="Назад", callback_data="back2")
    markup.add(plus2, minus2, back2)
    await bot.send_message(callback.message.chat.id, "Убрать/добавить счет:\n", reply_markup=markup)

async def handle_group_selection(callback):
    await bot.send_message(callback.message.chat.id, "Убрать/добавить новую группу:")

asyncio.run(bot.polling())

Ответы (1 шт):

Автор решения: Amgarak

Начнём с того, что у объекта callback нет параметра chat. Ваша функция cmd_start() ожидает объект Message, а вы передаёте в него CallbackQuery.

elif callback.data == "back1" or callback.data == "back2" or callback.data == "back3":
        await cmd_start(callback) # Тут ошибка

Что бы исправить ошибку, нужно передать в cmd_start() правильный объект, и на ваше счастье сделать это не сложно -> callback.message


Меняем:

await cmd_start(callback)

На:

await cmd_start(callback.message)
→ Ссылка