ValueError: invalid literal for int() with base 10. Что бы войти в меню нужно 2 раза нажать на "Конвертация валют"
При одном нажатий на "Конвертация валют", ноль реакций, нужно нажать 2 раза что бы открылось след.меню. Тем самым бот принимает не число, а строку, и выдает ошибку. Как сделать так что бы след.меню открывалось при одном нажатий, может быть я что-то написал неправильно. Не судите строго, только начинаю копаться в этом) Код и скрины прикреплю ниже.
import telebot
import random
import requests
import json
import datetime
from currency_converter import CurrencyConverter
from telebot import types
TOKEN = '7171434296:AAHjbM-mqtlebhdaW50fvD-ERW0dkIXxWpo'
API = '567db01078f63c8b02ee40db526f3f79'
bot = telebot.TeleBot(TOKEN)
currency = CurrencyConverter()
@bot.message_handler(commands=['start'])
def welcome(message):
sti = open('static/welcome.webp', 'rb')
bot.send_sticker(message.chat.id, sti)
# keyboard
markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
item1 = types.KeyboardButton("? Рандомное число")
item2 = types.KeyboardButton("? Конвертация валют")
item3 = types.KeyboardButton("⛅️ Погода")
markup.add(item1, item2, item3)
bot.send_message(message.chat.id,
"Добро пожаловать, {0.first_name}!\nЯ - <b>{1.first_name}</b>, бот созданный чтобы быть Локи и показывать погоду.".format(
message.from_user, bot.get_me()),
parse_mode='html', reply_markup=markup)
@bot.message_handler(content_types=['text'])
def button_handler(message):
if message.chat.type == 'private':
if message.text == '? Рандомное число':
bot.send_message(message.chat.id, str(random.randint(0,1000)))
if message.text == '⛅️ Погода':
bot.send_message(message.chat.id, 'Введите название города:')
bot.register_next_step_handler(message, get_weather)
elif message.text == '? Конвертация валют':
bot.register_next_step_handler(message, summa)
elif message.text == "◀️ Назад":
markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
item1 = types.KeyboardButton("? Рандомное число")
item2 = types.KeyboardButton("? Конвертация валют")
item3 = types.KeyboardButton("⛅️ Погода")
markup.add(item1, item2, item3)
bot.send_message(message.chat.id, "◀️ Назад", reply_markup=markup)
def summa(message):
global amount
amount = int(message.text.strip())
if amount > 0:
markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
btn1 = types.KeyboardButton('USD/EUR')
btn2 = types.KeyboardButton('EUR/USD')
btn3 = types.KeyboardButton('USD/GBP')
btn4 = types.KeyboardButton('Другое значение')
back = types.KeyboardButton("◀️ Назад")
markup.add(btn1, btn2, btn3, btn4, back)
bot.send_message(message.chat.id, "Выберите пару валют:", reply_markup=markup)
if message.text == "◀️ Назад":
markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
item1 = types.KeyboardButton("? Рандомное число")
item2 = types.KeyboardButton("? Конвертация валют")
item3 = types.KeyboardButton("⛅️ Погода")
markup.add(item1, item2, item3)
bot.send_message(message.chat.id, "◀️ Назад", reply_markup=markup)
def get_weather(message):
code_to_smile = {
"Clear": "Ясно \U00002600",
"Clouds": "Облачно \U00002601",
"Rain": "Дождь \U00002614",
"Drizzle": "Дождь \U00002614",
"Thunderstorm": "Гроза \U000026A1",
"Snow": "Снег \U0001F328",
"Mist": "Туман \U0001F32B"
}
city = message.text.strip()
res = requests.get(f'https://api.openweathermap.org/data/2.5/weather?q={city}&appid={API}&units=metric')
data = json.loads(res.text)
cur_weather = {data["main"]["temp"]}
weather_description = data["weather"][0]["main"]
if weather_description in code_to_smile:
wd = code_to_smile[weather_description]
else:
wd = "Посмотри в окно, не пойму что там за погода, похоже на осадки в виде фрикаделек"
humidity = data["main"]["humidity"]
pressure = data["main"]["pressure"]
wind = data["wind"]["speed"]
sunrise_timestamp = datetime.datetime.fromtimestamp(data["sys"]["sunrise"])
sunset_timestamp = datetime.datetime.fromtimestamp(data["sys"]["sunset"])
length_of_the_day = datetime.datetime.fromtimestamp(data["sys"]["sunset"]) - datetime.datetime.fromtimestamp(
data["sys"]["sunrise"])
bot.reply_to(message, f"***{datetime.datetime.now().strftime('%Y-%m-%d %H:%M')}"
f'Погода в городе: {city}\nТемпература: {cur_weather}C° {wd}'
f"\nВлажность: {humidity}%\nДавление: {pressure} мм.рт.ст\nВетер: {wind} м/с\n"
f"Восход солнца: {sunrise_timestamp}\nЗакат солнца: {sunset_timestamp}\nПродолжительность дня: {length_of_the_day}")
bot.polling(none_stop=True)
Ответы (1 шт):
Это означает, что вы не можете преобразовать вашу строку в число. Ошибка происходит в 64 строке.
Вы пытаетесь преобразовать ? Конвертация валют
В число, но это невозможно.
amount = int(message.text.strip()) # Error
Что теперь касательно кода? Всё достаточно просто, в функции button_hander()
вы проверяете сообщение пользователя, если оно равно ? Конвертация валют
, вы ожидаете ответа от пользователя.
elif message.text == '? Конвертация валют':
bot.register_next_step_handler(message, summa)
Перед register_next_step_handler()
напишите что-нибудь, чтобы пользователь понял, что от него просят число. Именно на скриншоте отлично продемонстрировано, что вы сами не поняли, что бот хочет получить. А как это должен понять пользователь?
elif message.text == '? Конвертация валют':
bot.send_message(message.chat.id, 'Введите количество')
bot.register_next_step_handler(message, summa)
А то получается так, что код работает, просто он ждёт число, а приходит строка.
Также рекомендую в функции summa()
сразу же проверять, можно ли преобразовать текст пользователя в число, самый простой способ реализовать это - обработка исключений в python.
Если подытожить - ошибка вызывалась из-за того, что вы дублировали текст ? Конвертация валют
нажатием кнопки, а бот ожидал получить число.