Конфликт между командами бота
Пишу телеграм бота.Он имеет команды: погода и курс валют, когда я хочу вызвать два раза валюту отвечает функция погоды.Думаю, что это связанно с message.text.Не знаю как исправить, заранее благодарю за решение.Код:
import telebot
import requests
from datetime import datetime
from pycbrf import ExchangeRates
url = 'http://api.openweathermap.org/data/2.5/weather'
api_weather = ''
api_telegram = ''
bot = telebot.TeleBot(api_telegram)
@bot.message_handler(commands=['start'])
def send_welcome(message):
bot.send_message(message.chat.id, 'Чем вам помочь?')
bot.register_next_step_handler(message)
@bot.message_handler(commands=['currency'])
def currency(message):
markup = telebot.types.ReplyKeyboardMarkup(resize_keyboard=True)
item1 = telebot.types.KeyboardButton('EUR')
item2 = telebot.types.KeyboardButton('USD')
markup.add(item1, item2)
bot.send_message(chat_id=message.chat.id, text="<b>Какой курс валюты вас интересует?</b>", reply_markup=markup,
parse_mode="html")
bot.register_next_step_handler(message, exchange_rate)
@bot.message_handler(content_types=['USD', 'EUR'])
def exchange_rate(message):
message_norm = message.text.strip().lower()
if message_norm in ['usd', 'eur']:
rates = ExchangeRates(datetime.now())
bot.send_message(chat_id=message.chat.id,
text=f"<b>Сейчас курс: {message_norm.upper()} = {float(rates[message_norm.upper()].rate)}</b>",
parse_mode="html")
@bot.message_handler(commands=['weather'])
def weather(message):
bot.send_message(message.chat.id, 'Чтобы узнать погоду напишите в чат название города')
bot.register_next_step_handler(message, test)
@bot.message_handler(content_types=['text'])
def test(message):
city_name = message.text
try:
params = {'APPID': api_weather, 'q': city_name, 'units': 'metric', 'lang': 'ru'}
result = requests.get(url, params=params)
weather = result.json()
bot.send_message(message.chat.id, "В городе " + str(weather["name"]) + " температура: " + str(
int(weather["main"]['temp'])) + "\n" +
"Описание: " + str(weather['weather'][0]["description"]) + "\n")
except:
bot.send_message(message.chat.id, "Город " + city_name + " не найден")
if __name__ == '__main__':
bot.polling(none_stop=True)
Ответы (1 шт):
Автор решения: Violet
→ Ссылка
Не требуется указывать handler если вы используете bot.register_next_step_handler.
@bot.message_handler(commands=['currency'])
def currency(message):
markup = telebot.types.ReplyKeyboardMarkup(resize_keyboard=True)
item1 = telebot.types.KeyboardButton('EUR')
item2 = telebot.types.KeyboardButton('USD')
markup.add(item1, item2)
bot.send_message(chat_id=message.chat.id, text="<b>Какой курс валюты вас интересует?</b>", reply_markup=markup,
parse_mode="html")
bot.register_next_step_handler(message, exchange_rate)
def exchange_rate(message):
message_norm = message.text.strip().lower()
if message_norm in ['usd', 'eur']:
rates = ExchangeRates(datetime.now())
bot.send_message(chat_id=message.chat.id,
text=f"<b>Сейчас курс: {message_norm.upper()} = {float(rates[message_norm.upper()].rate)}</b>",
parse_mode="html")
--
@bot.message_handler(commands=['weather'])
def weather(message):
bot.send_message(message.chat.id, 'Чтобы узнать погоду напишите в чат название города')
bot.register_next_step_handler(message, test)
def test(message):
try:
params = {'APPID': api_weather, 'q': message.text, 'units': 'metric', 'lang': 'ru'}
result = requests.get(url, params=params)
weather = result.json()
bot.send_message(message.chat.id, "В городе " + str(weather["name"]) + " температура: " + str(
int(weather["main"]['temp'])) + "\n" +
"Описание: " + str(weather['weather'][0]["description"]) + "\n")
except:
bot.send_message(message.chat.id, "Город " + message.text + " не найден")
--
Однако вам потребуется @bot.message_handler(content_types=['text']):
пример грубоват
@bot.message_handler(content_types=['text'])
def text(message):
if message.text in ('USD', 'EUR'):
exchange_rate(message)
else:
print('else')
# если сообщение буквы и длина больше 2 символов вызываем test(message)