Я хочу написать таймер для telegram-бота с помощью python. Бот получает «время» из сообщения пользователя (str). Как я могу преобразовать «время» из msg в тип (int)?

#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 тег