Возникли трудности при обработке кнопок в Telegram боте
Есть телеграм бот,у него есть кнопки но при вводе команды /start выводяться кнопки при нажатии на одну из них выводиться курс текущей валюты но после нажатия на другую кнопку,остальные не выдают результат и приходиться перезапускать командой /start
import config
import telebot
import requests
from telebot import types
bot = telebot.TeleBot(config.token)
# Декодировать json
response = requests.get(config.url).json()
@bot.message_handler(commands=['start', 'help'])
def send_welcome(message):
markup = types.ReplyKeyboardMarkup(resize_keyboard=True, row_width=3)
itembtn1 = types.KeyboardButton('USD')
itembtn2 = types.KeyboardButton('EUR')
itembtn3 = types.KeyboardButton('RUR')
itembtn4 = types.KeyboardButton('BTC')
markup.add(itembtn1, itembtn2, itembtn3, itembtn4)
msg = bot.send_message(message.chat.id,
"Привіт, обери валюту.", reply_markup=markup)
bot.register_next_step_handler(msg, process_coin_step)
def process_coin_step(message):
try:
markup = types.ReplyKeyboardMarkup(selective=True)
for coin in response:
if (message.text == coin['ccy']):
bot.send_message(message.chat.id, printCoin(coin['buy'], coin['sale']),
reply_markup=markup, parse_mode="Markdown")
except Exception as e:
bot.reply_to(message, 'ooops!')
def printCoin(buy, sale):
return "? *Курс купівлі:* " + str(buy) + "\n? *Курс продажу:* " + str(sale)
bot.enable_save_next_step_handlers(delay=2)
bot.load_next_step_handlers()
if __name__ == '__main__':
bot.polling(none_stop=True)
Ответы (1 шт):
Автор решения: Zhymabek Roman
→ Ссылка
Вот код который работает так как вы хотели. Единственное что нужно в нем доработать - это получение курс валюты от какого-либо сервера
import telebot
import requests
from telebot import types
bot = telebot.TeleBot('BOT TOKEN HERE')
coins_list = ['USD', 'EUR', 'RUB', 'BTC']
@bot.message_handler(commands=['start', 'help'])
def send_welcome(message):
markup = types.ReplyKeyboardMarkup(resize_keyboard=True, row_width=3)
markup.add(*coins_list)
msg = bot.send_message(message.chat.id,
"Привіт, обери валюту.", reply_markup=markup)
bot.register_next_step_handler(msg, process_coin_step)
def process_coin_step(message):
try:
markup = types.ReplyKeyboardMarkup(selective=True)
coin_name = message.text
course_of_coin = "25" # ToDo - получать данные из сервера какого-либо
msg = bot.send_message(message.chat.id, f"Вы выбрали валюту {coin_name}\n" + printCoin(course_of_coin, course_of_coin), reply_markup=markup)
bot.register_next_step_handler(msg, process_coin_step)
except Exception as e:
bot.reply_to(message, 'ooops!')
def printCoin(buy, sale):
return "? *Курс купівлі:* " + str(buy) + "\n? *Курс продажу:* " + str(sale)
if __name__ == '__main__':
bot.infinity_polling()
Удачи!