Проблема с питоновской библиотекой telebot

Рейтинг: 0Ответов: 1Опубликовано: 26.05.2023

Мне нужно, чтобы в зависимости от нажатой кнопки, шла какая-то определенная ветка событий. Но, когда нажимается кнопка "наличие товаров" (функция nal), бот не воспринимает сообщения пользователя, а в ветке "перевести рубли в юани" (функция RU), воспринимает кнопку как введённый пользователем текст.

Подскажите, пожалуйста, что в коде нужно поправить?

import telebot;
from telebot import types
bot = telebot.TeleBot('ТУТ ТОКЕН')
bot.set_webhook()

@bot.message_handler(content_types=['text'])
def main(message):
    if message.text=='/start':
        keyboard = types.InlineKeyboardMarkup(); #наша клавиатура
        key_val = types.InlineKeyboardButton(text='Перевести валюту', callback_data='val'); #кнопка «Да»
        keyboard.add(key_val); #добавляем кнопку в клавиатуру
        key_nal= types.InlineKeyboardButton(text='Проверить наличие товара', callback_data='nal');
        keyboard.add(key_nal);
        bot.send_message(message.from_user.id,'Выбери, что надо сделать:', reply_markup=keyboard)
    if message.text == "/help":
        bot.send_message(message.from_user.id, "Напиши число которое хочешь перевести из юаней в рубли или название товара товара через слэш(например /adik), чтобы проверить его наличие")

def val(message):
keyboard = types.InlineKeyboardMarkup(); 
    key_RU = types.InlineKeyboardButton(text='Перевести рубли в юани', callback_data='RU'); 
    keyboard.add(key_RU); 
    key_UR= types.InlineKeyboardButton(text='Перевести юани в рубли', callback_data='UR');
    keyboard.add(key_UR);
    bot.send_message(message.chat.id,'Что во что?', reply_markup=keyboard)

def RU(message):
    if message.text.isdigit():
        bot.send_message(message.from_user.id, str(int(message.text)*N)+' CNY')
    else:
        bot.send_message(message.chat.id, "Число пиши")

def UR(message):
    if message.text.isdigit():
        bot.send_message(message.from_user.id, str(int(message.text)/N)+' CNY')
    else:
        bot.send_message(message.chat.id, "Число пиши")

@bot.message_handler(content_types=['text'])
def nal(message):
    if message.text in a:
        bot.send_message(message.chat.id, 'Товар '+message.text+" есть в наличие.\n"+ "Размеры: "+ b[a.index(message.text)]+"\n"+"Цена: "+c[a.index(message.text)]+" CNY")
    else:
        bot.send_message(message.chat.id, "Товара нет в наличии. Перепроверьте, провильно ли вы ввели имя товара")

@bot.callback_query_handler(func=lambda call: True)
def callback_worker(call: types.CallbackQuery):
    if call.data =='val':
        val(call.message)
    if call.data =='nal':
        bot.send_message(call.message.chat.id, 'А теперь выбери какой товар посмотреть')
        nal(call.message)
    if call.data =='RU':
        RU(call.message)
    if call.data =='UR':
        UR(call.message)
bot.polling(none_stop=True, interval=0)

Ответы

▲ 1
  1. У вас 2 обработчика текста, определяйте команды через

@bot.message_handler(commands=['command'])

  1. Передача данных и ожидание ввода реализуется через FSM. Вот пример
  1. Чтобы не висели часики на кнопках рекомендую использовать bot.answer_callback_query(callback_query_id=call.id)

Должно быть примерно так (nal изменён, N определён, нужно вернуть как вам надо, FSM для nal надо дописать)

    import telebot
    from telebot import types
    
    bot = telebot.TeleBot('TOKEN')
    N = 10
    
    
    @bot.message_handler(commands=['start'])
    def start_command(message):
        keyboard = types.InlineKeyboardMarkup();  # наша клавиатура
        key_val = types.InlineKeyboardButton(text='Перевести валюту', callback_data='val')  # кнопка «Да»
        keyboard.add(key_val)  # добавляем кнопку в клавиатуру
        key_nal = types.InlineKeyboardButton(text='Проверить наличие товара', callback_data='nal')
        keyboard.add(key_nal)
        bot.send_message(message.from_user.id, 'Выбери, что надо сделать:', reply_markup=keyboard)
    
    
    @bot.message_handler(commands=['help'])
    def help_command(message):
        if message.text == "/help":
            bot.send_message(message.from_user.id,
                             "Напиши число которое хочешь перевести из юаней в рубли или название товара товара через слэш(например /adik), чтобы проверить его наличие")
    
    
    def val(message):
        keyboard = types.InlineKeyboardMarkup()
        key_RU = types.InlineKeyboardButton(text='Перевести рубли в юани', callback_data='RU')
        keyboard.add(key_RU)
        key_UR = types.InlineKeyboardButton(text='Перевести юани в рубли', callback_data='UR')
        keyboard.add(key_UR)
        bot.send_message(message.chat.id, 'Что во что?', reply_markup=keyboard)
    
    
    def RU(message):
        if message.text.isdigit():
            bot.send_message(message.from_user.id, str(int(message.text) * N) + ' CNY')
        else:
            bot.send_message(message.chat.id, "Число пиши")
    
    
    def UR(message):
        if message.text.isdigit():
            bot.send_message(message.from_user.id, str(int(message.text) / N) + ' CNY')
        else:
            bot.send_message(message.chat.id, "Число пиши")
    
    
    def nal(message):
        bot.send_message(message.chat.id,
                         'Товар ' + message.text + " есть в наличие.\n" + "Размеры: " + '10' + "\n" + "Цена: " + '1000' + " CNY")
    
    
    @bot.callback_query_handler(lambda c: c.data in ['val', 'nal', 'RU', 'UR'])
    def callback_worker(call: types.CallbackQuery):
        print(call.data)
        if call.data == 'val':
            val(call.message)
        if call.data == 'nal':
            bot.send_message(call.message.chat.id, 'А теперь выбери какой товар посмотреть')
            nal(call.message)
        if call.data == 'RU':
            bot.send_message(call.message.chat.id, 'Введите сумму')
            bot.register_next_step_handler(message=call.message, callback=RU)
        if call.data == 'UR':
            bot.send_message(call.message.chat.id, 'Введите сумму')
            bot.register_next_step_handler(message=call.message, callback=UR)
        bot.answer_callback_query(callback_query_id=call.id)

    
    
    bot.polling(none_stop=True, interval=0)