Проблема с питоновской библиотекой telebot
Мне нужно, чтобы в зависимости от нажатой кнопки, шла какая-то определенная ветка событий. Но, когда нажимается кнопка "наличие товаров" (функция 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 шт):
Автор решения: Yallz
→ Ссылка
- У вас 2 обработчика текста, определяйте команды через
@bot.message_handler(commands=['command'])
- Передача данных и ожидание ввода реализуется через FSM. Вот пример
- Чтобы не висели часики на кнопках рекомендую использовать
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)