AttributeError: 'Message' object has no attribute 'chat_id'

Это игровой бот для телеграма на PyTelegramBotApi. Делал по гайду: https://mastergroosha.github.io/telegram-tutorial/docs/lesson_02/

bot.py:

bot = telebot.TeleBot(config.TOKEN)

@bot.message_handler(commands=['game'])
def game(message):
    db_worker = SQLigher(config.database_name)
    row = db_worker.select_single(random.randint(1, utils.get_rows_count()))
    markup = utils.generate_markup(row[2], row[3])
    bot.send_voice(message.chat_id, row[1], reply_markup=markup)
    utils.set_user_game(message.chat_id, row[2])
    db_worker.close()
@bot.message_handler(func=lambda message: True, content_types=['Text'])
def check_answer(message):
    answer = utils.get_answer_for_user(message.chat_id)
    if not answer:
        bot.send_message(message.chat_id, 'Чтобы начать игру, выберите команду /game')
    else:
        keyboard_hider = telebot.types.ReplyKeyboardRemove()
        if message.text == answer:
            bot.send_message(message.chat_id, 'Верно!', reply_markup=keyboard_hider)
        else:
            bot.send_message(message.chat_id, 'Увы, неверено. Попробуйте еще раз!')
        utils.finish_user_game(message.chat_id)

if __name__ == '__main__':
    utils.count_row()
    random.seed()
    bot.infinity_polling()

utils.py:

    from telebot import types
import shelve
from random import shuffle
from SQLighter import SQLigher
from config import shelve_name, database_name

def count_row():
    db = SQLigher(database_name)
    rowsnum = db.count_rows()
    with shelve.open(shelve_name) as storage:
        storage['rows_count'] = rowsnum
def get_rows_count():
    with shelve.open(shelve_name) as storage:
        rowsnum = storage['rows_count']
    return rowsnum
def set_user_game(chat_id, estimated_answer):
    with shelve.open(shelve_name) as storage:
        storage[str(chat_id)] = estimated_answer
def finish_user_game(chat_id):
    with shelve.open(shelve_name) as storage:
        del storage[str(chat_id)]
def get_answer_for_user(chat_id):
    with shelve.open(shelve_name) as storage:
        try:
            answer = storage[str(chat_id)]
            return answer
        except KeyError:
            return None
def generate_markup(right_answer, wrong_answers):
    markup = types.ReplyKeyboardMarkup(one_time_keyboard=True, resize_keyboard=True)
    all_answers = '{}, {}'.format(right_answer, wrong_answers)
    list_items = []
    for item in all_answers.split(','):
        list_items.append(item)
    shuffle(list_items)
    for item in list_items:
        markup.add(item)
    return markup

Выдает ошибку:

      File "bot.py", line 15, in game
    bot.send_voice(message.chat_id, row[1], reply_markup=markup)
AttributeError: 'Message' object has no attribute 'chat_id'

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

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

Ошибка в том, что Вы обращаетесь к несуществующему параметру chat_id, объекта Message. Если Вы хотите получить ID чата, то сделать это можно так: message.chat.id (даже в гайде так указано :))

Конкретно в Вашем случае:

bot = telebot.TeleBot(config.TOKEN)

@bot.message_handler(commands=['game'])
def game(message):
    db_worker = SQLigher(config.database_name)
    row = db_worker.select_single(random.randint(1, utils.get_rows_count()))
    markup = utils.generate_markup(row[2], row[3])
    bot.send_voice(message.chat.id, row[1], reply_markup=markup)
    utils.set_user_game(message.chat.id, row[2])
    db_worker.close()
@bot.message_handler(func=lambda message: True, content_types=['Text'])
def check_answer(message):
    answer = utils.get_answer_for_user(message.chat.id)
    if not answer:
        bot.send_message(message.chat.id, 'Чтобы начать игру, выберите команду /game')
    else:
        keyboard_hider = telebot.types.ReplyKeyboardRemove()
        if message.text == answer:
            bot.send_message(message.chat.id, 'Верно!', reply_markup=keyboard_hider)
        else:
            bot.send_message(message.chat.id, 'Увы, неверено. Попробуйте еще раз!')
        utils.finish_user_game(message.chat.id)

if __name__ == '__main__':
    utils.count_row()
    random.seed()
    bot.infinity_polling()
→ Ссылка