До сих пор твои боты были вежливыми молчунами: ты пишешь, они отвечают. Сами рта не раскрывали. Сегодня всё меняется. Бот научится писать первым, без твоего сообщения. Это нужно для напоминалки: поставил задачу, бот молчит, а в нужный момент сам пишет «эй, пора».
После урока сможешь: объяснить тему «Бот, который пишет первым» и выполнить связанный с ней учебный шаг без подсказки.
В чём сложность
Казалось бы, просто: подожди сколько надо и отправь. Но если бот в ожидании просто «заснёт», он перестанет отвечать всем остальным. Представь официанта, который замер на десять минут у одного столика, а весь зал ждёт. Так нельзя. Нужен будильник, который тикает в сторонке и срабатывает в назначенное время, не мешая боту.
Будильник: threading.Timer
В Python встроен модуль threading, ставить ничего не надо. Подключаем сверху: import threading. Главный инструмент тут Timer, будильник:
threading.Timer(5, funkciya).start()
Читается просто: «через 5 секунд вызови funkciya». .start() в конце запускает будильник. Дальше бот продолжает работать, а через пять секунд будильник сам вызовет нужную функцию. Никто никого не ждёт.
Что вызвать по будильнику
Будильнику нужно сказать, что сделать. Опишем это в отдельной функции, пусть отправляет сообщение:
def napomnit(chat_id, text):
bot.send_message(chat_id, f"Напоминаю: {text}")
Функции нужно знать, куда писать (chat_id) и что писать (text). Передадим ей это через будильник:
threading.Timer(5, napomnit, args=[chat_id, "это работает"]).start()
args=[chat_id, "это работает"] это список того, что будильник передаст функции, когда сработает. Через пять секунд napomnit получит эти два значения и отправит сообщение.
Первый бот, который пишет сам
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=['test'])
def test(message):
chat_id = message.chat.id
bot.send_message(chat_id, "Засёк! Напомню через 5 секунд...")
threading.Timer(5, napomnit, args=[chat_id, "это работает"]).start()
bot.infinity_polling()
Запусти, напиши /test. Бот сразу ответит «засёк», а потом замолчит. Подожди пять секунд, и он сам напишет «Напоминаю: это работает». И всё это время бот отвечал бы другим, проверь: напиши что-нибудь ещё, пока ждёшь.
Контрольный вопрос. Каким инструментом модуля threading бот ставит «будильник», чтобы написать через несколько секунд? Напиши имя: threading.____(5, func).
Подсказка: threading.Timer(5, …).start()
Онлайн-проверка ответа появится позже
Задание. Подключи threading и собери бота из урока. Напиши /test и дождись, пока бот напишет сам через 5 секунд. Поменяй паузу на 10 секунд и проверь снова.
Подсказка: threading.Timer(секунды, функция, args=[…]).start(). Функция шлёт сообщение через bot.send_message.
✅ Готово, если: ты ввёл(а) верный ответ, и онлайн-проверка его приняла.
Онлайн-проверка ответа появится позже
Зачёт, если:
✅ библиотека threading подключена, бот из урока собран;
✅ после /test бот отвечает сразу, а через заданную паузу пишет сам;
✅ проверено на паузе 5 секунд, потом на 10.
