Не могу сохранить сообщение пользователя Telegram боту как число
@bot.message_handler(commands = ['calc'])
def text(chat_data):
bot.send_message(chat_data.chat.id, 'В <b>Pyrocalc</b> есть множество типов калькуляторов! Чтобы использовать какой-либо из них, напишите в чат: «поиск n», «поиск i» ', parse_mode='html')
@bot.message_handler()
def text(chat_data):
if chat_data.text == 'поиск n':
bot.send_message(chat_data.chat.id, 'Пожалуйста, введите известное значение <b>i</b> в следующем сообщении.', parse_mode='html')
Calculator.calcsave = chat_data.text
i = Calculator.calcsave
while i == 'поиск n':
Calculator.calcsave = chat_data.text
i = Calculator.calcsave
print(i)
if i > 0:
n = 2**i
bot.send_message(chat_data.chat.id, f'<b>N</b> = {n}', parse_mode='html')
else:
bot.send_message(chat_data.chat.id, f'Ошибка! i должна быть больше нуля!')
В этом отрывке кода я пишу команду, бот на нее реагирует и просит ввести значение i, однако на этом моменте все ломается. Мне нужно чтобы сообщение сохранялось как целое число, чтобы бот мог возвести 2 в указанную мною степень. До этого у меня было много попыток сделать это, но безуспешно. Работаю с ботом в первый раз, надеюсь на помощь.
Ответы (1 шт):
from telebot import TeleBot
from telebot.types import Message
bot = TeleBot('ТОКЕН')
class Calculator:
calcsave = None
@bot.message_handler(commands=['calc'])
def text(message: Message):
bot.send_message(message.chat.id, 'В <b>Pyrocalc</b> есть множество типов калькуляторов! Чтобы использовать какой-либо из них, напишите в чат: «поиск n», «поиск i» ', parse_mode='html')
@bot.message_handler(func=lambda message: message.text.lower() == 'поиск n')
def handle_search_n(message: Message):
bot.send_message(message.chat.id, 'Пожалуйста, введите известное значение <b>i</b> в следующем сообщении.', parse_mode='html')
Calculator.calcsave = 'поиск n'
@bot.message_handler(func=lambda message: Calculator.calcsave == 'поиск n')
def handle_i_value(message: Message):
try:
i = int(message.text)
if i > 0:
n = 2 ** i
bot.send_message(message.chat.id, f'<b>N</b> = {n}', parse_mode='html')
else:
bot.send_message(message.chat.id, f'Ошибка! i должна быть больше нуля!')
except ValueError:
bot.send_message(message.chat.id, 'Пожалуйста, введите целое число для значения <b>i</b>.', parse_mode='html')
bot.polling(none_stop=True)
Рабочий вариант кода, который выполняет данную задачу. Возможно Вам нужно будет подкорректировать под себя.
Вместе цикла while для ожидания ответа, здесь используется @bot.message_handler(func=lambda message: True).
Также добавил ответ на случай, когда введено не число или отрицательное число.
Чтобы преобразовать переменную в число, достаточно всего лишь воспользоваться функцией int(название_переменной).
upd: Возможно вот такой вариант программы Вам подойдёт и от него будет легче отталкиваться:
import telebot
TOKEN = 'TOKEN'
bot = telebot.TeleBot(TOKEN)
@bot.message_handler(commands=['start'])
def handle_start(message):
bot.send_message(message.chat.id, 'Привет! Для использования бота напиши команду /calc.')
@bot.message_handler(commands=['calc'])
def handle_calc(message):
bot.send_message(message.chat.id, 'Теперь введи два числа через пробел.')
bot.register_next_step_handler(message, get_numbers) ## переход на следующий шаг;
def get_numbers(message):
try:
numbers = [int(num) for num in message.text.split()] ## берём оба числа;
result = numbers[0] ** numbers[1] ## возводим первое в степень другого;
bot.send_message(message.chat.id, f'Результат: {result}')
except (ValueError, IndexError): ## в случае ошибки;
bot.send_message(message.chat.id, 'Ошибка. Введены некорректные данные. Пожалуйста, повторите попытку.')
bot.polling(none_stop=True)
Пример:
\calc
>>> Теперь введи два числа через пробел.
8 2
>>> Результат: 64.0