#python #types #timer #message #telegram-bot
#python #типы #таймер #Сообщение #telegram-бот
Вопрос:
Я написал этот код, и мне нужно получить «местное время» из сообщения пользователя (строковый тип). Но мне нужно это как целое число, чтобы установить таймер. В «local_time = int ( Есть ошибка типаmsg.from_user.id , msg.текст)». Как я могу это исправить?
from aiogram import Bot, types
from aiogram.dispatcher import Dispatcher
from aiogram.utils import executor
import time
from Config import TOKEN
bot = Bot(token=TOKEN)
dp = Dispatcher(bot)
@dp.message_handler(commands=['start'])
async def process_start_command(message: types.Message):
await message.reply("Hi!")
@dp.message_handler(commands=['help'])
async def process_help_command(message: types.Message):
await message.reply("/timer - set timer")
@dp.message_handler(commands=['timer'])
async def set_timer(msg: types.Message):
await bot.send_message(msg.from_user.id, text='How many minutes?')
time.sleep(5)
local_time = int(msg.from_user.id, msg.text)
local_time_b = int(local_time * 60)
await bot.send_message(msg.from_user.id, text='Timer set')
time.sleep(local_time_b)
await bot.send_message(msg.from_user.id, text='The timer has worked')
print("Hello")
if __name__ == '__main__':
executor.start_polling(dp)
local_time = int(msg.from_user.id , msg.текст)
TypeError: объект ‘str’ не может быть интерпретирован как целое число
Ответ №1:
Функция int требует текст в качестве первого параметра, второй (необязательный) является базовым (который вам нужен, если вы Python для интерпретации строки с другой базой — т.Е. binany)
local_time = int(msg.text)
msg.text — это пользовательский ввод (это должно быть число), который преобразуется в int.
Если вы обрабатываете ввод с помощью обработчика команд, вам нужно учитывать, что текстовое сообщение включает команду ie /start 12
.
Один из вариантов — удалить команду и получить следующие значения
# remove '/start'
interval = msg.text[7:]
local_time = int(interval)
print(local_time)
Комментарии:
1. Не работает. local_time = int(msg.text) ValueError: недопустимый литерал для int() с основанием 10: ‘/timer’
2. что вводит пользователь? это должно быть действительное число (которое код пытался преобразовать в int, чтобы установить его для таймера)
3. Я пользователь. Я пишу целое число (например, «1») и получаю ValueError . Что мне делать?
4. Вы пытаетесь привести число, улавливающее любое исключение. Если есть исключение, которое вы можете попросить, пожалуйста, введите действительный номер
5. Компилятору нужно число для установки таймера. Я отправляю этот номер, но компилятор считает, что это строка. Как я могу преобразовать строку («1») в целое число (1)? Это мой вопрос.
Ответ №2:
Прежде всего
Прекратить использование time.sleep()
в асинхронных функциях. Использовать await asyncio.sleep()
вместо этого!
Второй
Изучить основы python
.
В-третьих
@dp.message_handler(commands=['timer'])
async def timer_handler(message: Message):
# get args from message (it's `str` type!)
timer_string = message.get_args()
# let's try to convert it to `int`
try:
timer = int(timer_string)
except (ValueError, TypeError):
return await message.answer("Please set a digit for timer. E.g.: /timer 5")
# success! timer is set!
await message.answer(f'Timer set for {timer}')
# sleeping (this way, instead of blocking `time.sleep`)
await asyncio.sleep(timer)
# it's time to send message
await message.answer("It's time! :)")
PS: Кто-нибудь, пожалуйста, добавьте aiogram
тег