Как сделать так, чтобы телеграм-бот предлагал список доступных валют при вводе некоторого значения?
Помогите доделать телеграмм бота, чтобы пользователь вводил валюту, а бот дает курс валюты к рублю, но если он не знает в какой валюте, там должна быть кнопка (либо там, где сообщение бота, либо ниже), которая выдает их список. Суть - бот принимает валюту и при этом текстовое исключение, которое он будет обрабатывать, выдавая список всех доступных валют.
@bot.message_handler(commands=["help"])
def help(message):
markup = types.ReplyKeyboardMarkup(resize_keyboard=True,
row_width=3)
bt1 = types.KeyboardButton("Курсы валют к рублю")
bt2 = types.KeyboardButton("Моя VK страница")
markup.add(bt1, bt2)
bot.send_message(message.chat.id, "Нажмите кнопку с нужной вам функцией", reply_markup=markup)
@bot.message_handler(content_types=["text"])
def get_user_text(message):
...
# Что-то типа такого, но без вложенных if блоков (ведь в
# ними бот не отвечает на "Показать основные валюты" и
# "Показать все валюты" или ошибка, но точно не работает
# (не помню))
elif message.text == "Курсы валют к рублю":
markup = types.ReplyKeyboardMarkup(row_width=1,
resize_keyboard=True)
bt1 = types.KeyboardButton("Показать основные
валюты")
bt2 = types.KeyboardButton("Показать все доступные
валюты")
markup.add(bt1, bt2)
msg = bot.send_message(message.chat.id, "Введите
индекс валюты", reply_markup=markup)
if message.text == "Показать основные валюты":
bot.send_message(message.chat.id, """Индекс
Название\n
<u>USD Доллар США</u>\n
<u>EUR Евро</u>\n
<u>GBP Фунт стерлингов Великобритании</u>\n
<u>JPY Японская йена</u>\n
<u>CHF Швейцарский франк</u>\n
<u>CNY Китайский юань</u>\n
<u>RUB Российский рубль""",
parse_mode="html"
)
elif message.text == "Показать все валюты":
...
else:
bot.register_next_step_handler(msg,
get_curs_currency)
Ответы (1 шт):
Автор решения: oleksandrigo
→ Ссылка
Ну вы и написали всякого странного...
from telebot import TeleBot, types
import config
bot = TeleBot(config.BOT_TOKEN)
@bot.message_handler(commands=["help"])
def help_(message: types.Message):
markup = types.ReplyKeyboardMarkup(resize_keyboard=True, row_width=3)
markup.add("Курсы валют к рублю", "Моя VK страница")
bot.send_message(message.chat.id, "Нажмите кнопку с нужной вам функцией", reply_markup=markup)
# стоит сделать так чтобы срабатывали только эти кнопки
bot.register_next_step_handler(message, get_curency_and_vk_link)
def get_curency_and_vk_link(message: types.Message):
if message.text == "Курсы валют к рублю":
markup = types.ReplyKeyboardMarkup(row_width=1, resize_keyboard=True)
markup.add("Показать основные валюты", "Показать все доступные валюты")
bot.send_message(message.chat.id, "Введите индекс валюты", reply_markup=markup)
bot.register_next_step_handler(message, show_general_currency)
if message.text == "Курсы валют к рублю":
...
else:
# делаем так чтобы юзер был обязан нажать на кнопки
# (ну или сам написать то же что на кнопках)
bot.register_next_step_handler(message, get_curency_and_vk_link)
def show_general_currency(message: types.Message):
list_curency = ['USD', 'EUR', 'GBP', 'JPY', 'CHF', 'CNY', 'RUB']
# сработает если юзер ввел что-то из списка выше
if message.text in list_curency:
...
elif message.text == "Показать основные валюты":
bot.send_message(
chat_id=message.chat.id,
text="Индекс Название\n"
"<u>USD Доллар США</u>\n"
"<u>EUR Евро</u>\n"
"<u>GBP Фунт стерлингов Великобритании</u>\n"
"<u>JPY Японская йена</u>\n"
"<u>CHF Швейцарский франк</u>\n"
"<u>CNY Китайский юань</u>\n"
"<u>RUB Российский рубль",
parse_mode="html")
elif message.text == "Показать все доступные валюты":
...
else:
bot.register_next_step_handler(message, show_general_currency)
if __name__ == '__main__':
bot.infinity_polling(skip_pending=True)