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 шт):

Автор решения: Ben Puls

Это означает, что вы не можете преобразовать вашу строку в число. Ошибка происходит в 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.

Если подытожить - ошибка вызывалась из-за того, что вы дублировали текст ? Конвертация валют нажатием кнопки, а бот ожидал получить число.

→ Ссылка