@TKDBOT
Учу python. Готов к конструктивной критике.

Как в callback_query_handler вставить register_next_step_handler?

Подскажите как вставить register_next_step_handler в обработчик инлайн клавиатуры?

Тут вызываю клавиатуру
elif message.text == ' Регистрация велосипеда ':
            markup = types.ReplyKeyboardMarkup(resize_keyboard=True, row_width=2)
            btn1 = types.KeyboardButton(' Где наша мастерская? ')
            btn2 = types.KeyboardButton(' Посмотреть прайс на ремонт ')
            btn3 = types.KeyboardButton(' Наши контакты ')
            btn4 = types.KeyboardButton('⏭ Далее ⏭')
            markup.add(btn1, btn2, btn3, btn4)
            bot.send_message(message.chat.id, 'Давайте запишем Ваш байк в базу данных.', reply_markup=markup)
            markup_inline = types.InlineKeyboardMarkup()
            bk1 = types.InlineKeyboardButton(text='Stels', callback_data='Stels')
            bk2 = types.InlineKeyboardButton(text='Forvard', callback_data='Forvard')
            bk3 = types.InlineKeyboardButton(text='Кама', callback_data='Кама')
            bk4 = types.InlineKeyboardButton(text='Урал', callback_data='Урал')
            markup_inline.add(bk1, bk2, bk3, bk4)
            bot.send_message(message.chat.id, 'Выберите модель', reply_markup=markup_inline)
            bot.register_next_step_handler(message, reg)


Тут обрабатываю callback_query_handler

@bot.callback_query_handler(func=lambda call: True)
def reg(call):
    if call.data == 'Stels':
        chat_id = call.message.chat.id
        conn = sqlite3.connect('db.db')
        cursor = conn.cursor()
        cursor.execute("UPDATE users SET brand = ? WHERE chat_id = ?", (f'{call.data}', f'{chat_id}'))
        conn.commit()
        conn.close()
    elif call.data == 'Forvard':
        chat_id = call.message.chat.id
        conn = sqlite3.connect('db.db')
        cursor = conn.cursor()
        cursor.execute("UPDATE users SET brand = ? WHERE chat_id = ?", (f'{call.data}', f'{chat_id}'))
        conn.commit()
        conn.close()
    elif call.data == 'Forvard':
        chat_id = call.message.chat.id
        conn = sqlite3.connect('db.db')
        cursor = conn.cursor()
        cursor.execute("UPDATE users SET brand = ? WHERE chat_id = ?", (f'{call.data}', f'{chat_id}'))
        conn.commit()
        conn.close()
    elif call.data == 'Кама':
        chat_id = call.message.chat.id
        conn = sqlite3.connect('db.db')
        cursor = conn.cursor()
        cursor.execute("UPDATE users SET brand = ? WHERE chat_id = ?", (f'{call.data}', f'{chat_id}'))
        conn.commit()
        conn.close()
    elif call.data == 'Урал':
        chat_id = call.message.chat.id
        conn = sqlite3.connect('db.db')
        cursor = conn.cursor()
        cursor.execute("UPDATE users SET brand = ? WHERE chat_id = ?", (f'{call.data}', f'{chat_id}'))
        conn.commit()
        conn.close()
    bot.send_message(chat_id, f'Записали!\nИдем дальше.')
    bot.send_message(chat_id, 'Введите серийный номер')


При запуске кода все идет хорошо до момента ввода серийного номера. Выходит
ошибка

2022-04-20 21:59:18,309 (__init__.py:615 MainThread) ERROR - TeleBot: "Infinity polling exception: 'Message' object has no attribute 'data'"
2022-04-20 21:59:18,309 (__init__.py:617 MainThread) ERROR - TeleBot: "Exception traceback:
Traceback (most recent call last):
File "C:\VeloUgona.NET\venv\lib\site-packages\telebot\__init__.py", line 611, in infinity_polling
self.polling(none_stop=True, timeout=timeout, long_polling_timeout=long_polling_timeout,
File "C:\VeloUgona.NET\venv\lib\site-packages\telebot\__init__.py", line 658, in polling
self.__threaded_polling(non_stop, interval, timeout, long_polling_timeout, allowed_updates)
File "C:\VeloUgona.NET\venv\lib\site-packages\telebot\__init__.py", line 720, in __threaded_polling
raise e
File "C:\VeloUgona.NET\venv\lib\site-packages\telebot\__init__.py", line 680, in __threaded_polling
self.worker_pool.raise_exceptions()
File "C:\VeloUgona.NET\venv\lib\site-packages\telebot\util.py", line 135, in raise_exceptions
raise self.exception_info
File "C:\VeloUgona.NET\venv\lib\site-packages\telebot\util.py", line 87, in run
task(*args, **kwargs)
File "C:/VeloUgona.NET - копия/bot.py", line 320, in reg
if call.data == 'Stels':
AttributeError: 'Message' object has no attribute 'data'


Задумка следующая:
Шаг 1. Пользователь вводит номер
Шаг 2. Пользователь указывает город
Шаг 3. Пользователь указывает модель велика
Шаг 4. Пользователь вводит номер велика
Шаг 5. Сохранить все это в БД
Загвоздка начинается при переходе с 3 шага.
  • Вопрос задан
  • 2978 просмотров
Решения вопроса 1
@twistfire92
Python backend developer
Советую начать с выбора модели велика. Это видимо единственный пункт, который выбирается Inline кнопками.
Да и если у пользователя велосипед не из предложенного набора, тут же соскочит и не будет вводить лишнее.

возьму ваш же код за основу и чуть видоизменю
...
	elif message.text == ' Регистрация велосипеда ':
		markup = types.ReplyKeyboardMarkup(resize_keyboard=True, row_width=2)
		btn1 = types.KeyboardButton(' Где наша мастерская? ')
	 	btn2 = types.KeyboardButton(' Посмотреть прайс на ремонт ')
		btn3 = types.KeyboardButton(' Наши контакты ')
		btn4 = types.KeyboardButton('⏭ Далее ⏭')
		markup.add(btn1, btn2, btn3, btn4)
		bot.send_message(message.chat.id, 'Давайте запишем Ваш байк в базу данных.', reply_markup=markup)
		markup_inline = types.InlineKeyboardMarkup()
		#  Обратите внимание на callback_data при создании кнопки
		bk1 = types.InlineKeyboardButton(text='Stels', callback_data='bike_model|Stels')
		bk2 = types.InlineKeyboardButton(text='Forvard', callback_data='bike_model|Forvard')
		bk3 = types.InlineKeyboardButton(text='Кама', callback_data='bike_model|Кама')
		bk4 = types.InlineKeyboardButton(text='Урал', callback_data='bike_model|Урал')
		markup_inline.add(bk1, bk2, bk3, bk4)
		bot.send_message(message.chat.id, 'Выберите модель', reply_markup=markup_inline)

#  На случай, если у вас будут еще какие-либо инлайн кнопки,
#  этот хендлер сработает только на тех, у которых callback_data начинается с bike_model
@bot.callback_query_handler(func=lambda call: call.data.startswith('bike_model'))
def reg(call):
    # получаем модель велика
    bike_model = call.data.split('|')[1]
    chat_id = call.message.chat.id
    conn = sqlite3.connect('db.db')
    cursor = conn.cursor()
    cursor.execute(f"UPDATE users SET brand = {bike_model} WHERE chat_id = {chat_id}")
    conn.commit()
    conn.close()
    bot.send_message(chat_id, f'Записали!\nИдем дальше.')
    mes = bot.send_message(chat_id, 'Введите серийный номер')
    bot.register_next_step_handler(mes, serial_number)

def serial_number(message):
  ...

Дальше идет стандартная череда функций с register_next_step_handler
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
SoreMix
@SoreMix Куратор тега Python
yellow
Убрать bot.register_next_step_handler(message, reg). Он для чего вообще
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы