globall.dev — студия Telegram-ботов globall.dev
Контент и доставка

Бот доставки онлайн-курса по подписке: сам выдаёт уроки и защищает контент

Telegram-бот, который продаёт спортивный курс, ежедневно присылает тренировки по расписанию и закрывает доступ, когда подписка кончилась — без участия автора. Сделан для публичного шоу «Раздевайся и качай» с олимпийской гимнасткой Екатериной Галкиной.

Ниша: онлайн-курс по подписке Тип: бот + платёжный webhook Стек: Python · Aiogram · FastAPI · SQLAlchemy async
30
Дней доступа с ежедневной автодоставкой тренировок
protect
Защита контента от пересылки и копирования
7
Таблиц в базе: курсы, дни, медиа, коды, подписки
HMAC
Оплата через Tilda с подписанным webhook'ом
Проблема

Курс по подписке нужно выдавать каждый день — и защищать

Спортивный курс лимфодренажных тренировок продаётся как 30-дневная программа: один урок в день, по порядку, без возможности перескочить вперёд. Это сразу две головные боли для автора. Первая — выдавать контент строго по расписанию: каждое утро отправить нужный день нужным людям, не перепутав, на каком дне кто находится. Делать это руками на любой живой аудитории невозможно — это ежедневная смена оператора без выходных.

Вторая, более болезненная для платного инфопродукта — защита. Купив один доступ, человек может переслать видео тренировки кому угодно, и весь смысл подписки рушится. Для проекта публичного человека — олимпийской гимнастки Екатерины Галкиной и её шоу «Раздевайся и качай» — это вопрос не только денег, но и репутации: контент не должен утекать.

И третья деталь, которую часто забывают: доступ должен сам закрываться. Подписка на 30 дней — значит на 31-й человек не должен иметь ни тренировок, ни возможности листать старые сообщения. Иначе «подписка» превращается в разовую покупку навсегда.

Подход

Скоупинг: продажа на сайте, доставка и защита — в боте

У автора уже была витрина продаж на Tilda — менять её не было смысла. Поэтому мы не стали тянуть оплату внутрь бота, а состыковали две системы: продаёт лендинг, а доставляет и охраняет контент — бот. Разбили задачу на три контура и проектировали их по приоритету.

  1. Стык оплаты. Tilda присылает webhook об оплате — бот должен принять его, проверить подлинность (чтобы доступ нельзя было выдать себе поддельным запросом) и выдать покупателю ключ активации. Это первое, что проектировалось: если стык ненадёжен, дальше можно не строить.
  2. Доставка по расписанию. Планировщик, который каждый день в заданное время отправляет всем активным подписчикам именно их день курса — с трекингом прогресса, чтобы никто не сбился.
  3. Защита и срок жизни. Режим защиты контента на каждом сообщении плюс автоматическое закрытие доступа и удаление всех материалов по окончании подписки.

Отдельно заложили гибкость для автора: курс — это контент, который меняется. Поэтому дни, медиа и тексты должны редактироваться в админке без переписывания кода, а сам курс — загружаться из структурированного файла. Так проект остаётся «живым» и не требует разработчика на каждую правку.

Решение

Что в итоге работает

Получился бот, который ведёт покупателя от оплаты на сайте до последнего дня курса — и сам закрывает за собой дверь.

От оплаты к доступу

Человек оплачивает курс на лендинге razdevaisya-i-kachai.ru. Tilda отправляет боту webhook о платеже, бот проверяет HMAC-SHA256 подпись запроса, генерирует одноразовый код активации и отправляет его покупателю на email через SMTP. Пользователь вводит код в боте — и подписка на 30 дней активируется. Код привязан к email и конкретному курсу и срабатывает только один раз, так что поделиться им бессмысленно.

Ежедневная доставка по расписанию

Это сердце продукта. Планировщик (APScheduler с cron-триггером) в заданное время и с учётом часового пояса рассылает всем активным подписчикам ровно их день курса. Бот ведёт трекинг прогресса — текущий день из общего числа, рисует визуальную полосу прогресса и за 3 дня до конца напоминает, что подписка заканчивается. Каждый день — это не одно сообщение, а структурированная выдача: welcome-материалы, видео и фото тренировки, анимации и ссылки на музыкальные плейлисты (YouTube / Yandex / Apple Music).

Защита контента

Все материалы курса отправляются с включённым режимом защиты Telegram (protect_content) — переслать, сохранить или скопировать видео и фото нельзя. А когда подписка истекает, бот автоматически удаляет все отправленные сообщения с тренировками — доступ к контенту закрывается полностью, как и обещано в подписке.

Автор управляет курсом сам

Админ-панель внутри бота даёт автору полный контроль без программиста: управление курсами, генерация кодов активации, просмотр подписок и статистики, загрузка курса из JSON и редактор дней и медиа. Меню у пользователя меняется динамически в зависимости от статуса подписки — middleware проверяет доступ и показывает только то, что человеку сейчас положено.

Технически

Под капотом

Оплата и активация

Tilda webhook + HMAC-SHA256
Платёж приходит из Tilda по webhook, подпись HMAC-SHA256 подтверждает подлинность запроса — доступ нельзя выдать поддельным вызовом.
Одноразовые коды активации
8-символьный код привязан к email и курсу, генерируется автоматически и срабатывает ровно один раз.
Отправка кода на email (SMTP)
После оплаты код уходит покупателю на почту через SMTP — связка сайт → бот без ручных действий.
Cloudflare Tunnel для webhook
Webhook принимается через Cloudflare Tunnel — без открытия портов наружу.

Доставка и подписка

APScheduler по расписанию
Cron-триггер с настраиваемым временем и часовым поясом рассылает каждому подписчику его день курса.
Трекинг прогресса 30 дней
Текущий день из общего числа, визуальная полоса прогресса и напоминание за 3 дня до истечения подписки.
Media groups до 9 файлов
Видео, фото и анимации в одном сообщении, кэширование file_id для быстрых повторных отправок.
Middleware проверки подписки
Меню переключается динамически — бот показывает пользователю только то, что доступно по его статусу.

Защита и срок жизни доступа

protect_content на материалах
Тренировки нельзя переслать, сохранить или скопировать — контент остаётся внутри подписки.
Автоудаление по окончании
Когда 30 дней истекли, бот удаляет все отправленные сообщения — доступ закрывается полностью.

Управление и инфраструктура

Админ-панель в боте
Управление курсами, генерация кодов, просмотр подписок и статистики, загрузка курса из JSON, редактор дней и медиа.
SQLAlchemy 2.0 async, 7 таблиц
Пользователи, курсы, дни, медиа, коды, подписки и отправленные сообщения — SQLite или PostgreSQL.
Python · Aiogram · FastAPI
Бот на Aiogram, приём webhook на FastAPI — единый сервис под доставку и приём оплаты.
Структурированный контент
Welcome-сообщения, ежедневные тренировки и ссылки на плейлисты YouTube / Yandex / Apple Music.
Python FastAPI SQLAlchemy async Aiogram SQLite / PostgreSQL Tilda webhook Cloudflare Tunnel
Результат

Курс доставляет себя сам

На выходе — бот, который сам доставляет тренировки по расписанию, закрывает доступ по окончании подписки и защищает контент. Покупатель платит на сайте, получает код, активирует доступ — и дальше каждый день получает свою тренировку без единого касания со стороны автора. На 31-й день подписка закрывается, материалы удаляются, контент не утекает за пределы оплаченного доступа.

Это рабочий инструмент для публичного проекта — шоу «Раздевайся и качай» с олимпийской гимнасткой Екатериной Галкиной. Витрина курса живёт здесь: razdevaisya-i-kachai.ru. Автор управляет курсом сам — через админку в боте, без программиста на каждую правку.

Цифры по продажам и удержанию подписчиков — это данные владельца проекта и предоставляются по запросу под конкретную задачу, без выдуманных метрик.

Если у вас инфопродукт, курс или закрытый контент по подписке — будь то фитнес, обучение или любой материал, который нужно выдавать по расписанию и защищать от пересылки, — это ровно та механика «оплата → выдача по графику → защита → автозакрытие», которую мы собираем под ключ.

Нужен бот, который сам продаёт и выдаёт ваш курс?

Расскажите о продукте — за день пришлём фиксированную смету и сроки. Оплата, выдача по расписанию, защита контента и админка для вас — собираем под ключ, исходники ваши с первого дня.

Бесплатно. Отвечу в течение часа в рабочее время. Без спама.

Берём в работу ограниченное число проектов одновременно — это держит сроки реальными.