Собираем Бот-Напоминалку

Напоминалка почти готова, но падает от любого кривого ввода. Написал «привет» вместо «5 текст», и бот свалился. Сегодня добавим проверку, подсказку и соберём надёжную Бот-Напоминалку. Это артефакт модуля и реально полезный бот, которым будешь пользоваться сам.

После урока сможешь: объяснить тему «Собираем Бот-Напоминалку» и выполнить связанный с ней учебный шаг без подсказки.

Иллюстрация: бот-напоминалка — робот со звонком-будильником пишет первым

Проверяем ввод

Перед разбором сообщения убедимся, что оно правильное. Нужно два условия: частей должно быть две, и первая часть должна быть числом.

parts = message.text.split(maxsplit=1)
if len(parts) < 2 or not parts[0].isdigit():
    bot.send_message(message.chat.id, "Не понял. Напиши число минут и текст. Например: 5 попить воды")
    return

len(parts) < 2 это «частей меньше двух», человек написал одно слово без текста. not parts[0].isdigit() это «первое слово не число». Между ними or, «или»: если сработало хоть одно, ввод кривой. Бот показывает формат и делает return, то есть выходит, ничего не планируя. Падения нет.

Подсказка на старте

@bot.message_handler(commands=['start'])
def start(message):
    bot.send_message(message.chat.id, "Привет! Я напомню о деле. Напиши: сколько минут и о чём. Например: 5 позвонить маме")

Маленькая забота, а человеку сразу понятно, что делать.

Полный код Бот-Напоминалки

import telebot
import threading
from config import TOKEN

bot = telebot.TeleBot(TOKEN)

def napomnit(chat_id, text):
    bot.send_message(chat_id, f"Напоминаю: {text}")

@bot.message_handler(commands=['start'])
def start(message):
    bot.send_message(message.chat.id, "Привет! Я напомню о деле. Напиши: сколько минут и о чём. Например: 5 позвонить маме")

@bot.message_handler(func=lambda message: True)
def planirovat(message):
    parts = message.text.split(maxsplit=1)
    if len(parts) < 2 or not parts[0].isdigit():
        bot.send_message(message.chat.id, "Не понял. Напиши число минут и текст. Например: 5 попить воды")
        return
    minut = int(parts[0])
    text = parts[1]
    threading.Timer(minut * 60, napomnit, args=[message.chat.id, text]).start()
    bot.send_message(message.chat.id, f"Хорошо! Напомню через {minut} минут: {text}")

bot.infinity_polling()

Запусти, нажми /start, поставь напоминание на минуту, а потом нарочно напиши «привет». Бот вежливо поправит, но не упадёт. Так и должен вести себя надёжный бот.

Честная оговорка: будильники живут в памяти бота. Если программа перезапустится, все напоминания пропадут, как пропадала память в угадайке. Для учебного бота это нормально. Чтобы напоминания переживали перезапуск и срабатывали точно по часам, есть более серьёзные инструменты, но это уже за рамками нашего курса.

Сделай бота своим

  • добавь команду показать текущее время;
  • сделай фразы напоминания весёлыми или строгими, на твой вкус;
  • придумай боту имя и характер.

Контрольный вопрос. Каким методом строки проверяют, что первое слово — это число? Напиши имя: parts[0].____().

Подсказка: «10».isdigit() вернёт True.

Онлайн-проверка ответа появится позже

Задание. Собери свою Бот-Напоминалку: подсказка формата на /start, формат «минуты текст», подтверждение, напоминание в срок, защита от кривого ввода. Добавь свой штрих. Пришли короткое видео: ставишь напоминание и получаешь его в срок.

Подсказка: Сначала проверь len(parts) < 2 or not parts[0].isdigit() и сделай return при ошибке. Иначе заводи Timer на minut*60.

✅ Готово, если: ты ввёл(а) верный ответ, и онлайн-проверка его приняла.

Онлайн-проверка ответа появится позже

Зачёт, если:
✅ бот запускается без красных ошибок;
✅ напоминание приходит в срок, бот пишет первым, текст и время задаёшь ты, на кривой ввод бот не падает;
✅ добавлен свой штрих;
✅ прислано видео: ставишь напоминание и получаешь его в срок.

Назад  ·  ↑ В начало урока  ·  ⌂ В начало курса  ·  Вперёд →

Школа Виктора Комлева