TKBK Studio
TKBK Studio
Оплата звёздами или картой, одноразовые ссылки, напоминания о продлении и автоисключение по окончании
Бот для авторов, экспертов и сообществ, которые продают доступ в закрытый Telegram-канал или группу по подписке. Участник выбирает тариф, оплачивает его звёздами или картой и сразу получает одноразовую ссылку для входа.
Бот сам ведёт учёт сроков: напоминает о продлении за 3 дня и за день, а когда подписка закончилась — исключает из канала, не трогая администраторов. Если ссылкой поделились, вошедший без подписки будет исключён, а вы получите уведомление.
Промокоды со скидкой, лимитом и сроком, ручная выдача доступа и статистика выручки — прямо в Telegram. Данные хранятся в SQLite на вашем сервере, без комиссии сервисов-посредников.
Для кого: Авторы, эксперты, онлайн-школы, закрытые сообщества
Ключи и токены не вводятся на сайте — их кладут в файл .env на своём сервере.
BOT_TOKENТокен бота — @BotFather → /newbotADMIN_CHAT_IDЧат администратора — Ваш ID у @userinfobot или ID группы (отправьте боту /id в группе)CHANNEL_IDID закрытого канала — Начинается с -100; бот — администратор каналаPAYMENTS_PROVIDER_TOKENТокен ЮKassa — @BotFather → /mybots → бот → Payments → ЮKassa. Только для оплаты картойADMIN_IDSДополнительные администраторы — ID через запятую# {{BRAND}} — бот платного клуба в Telegram
Бот продаёт доступ в закрытый канал или группу по подписке: принимает оплату (Telegram Stars или картой через ЮKassa),
выдаёт одноразовую ссылку для входа, напоминает о продлении и сам исключает участника, когда подписка закончилась.
## Что умеет
- **Тарифы** на месяц, 3 месяца и год — цены задаются в мастере (тариф с ценой 0 скрыт).
- **Оплата**: Telegram Stars (`stars`) или картой через ЮKassa (`card`).
- **Одноразовая ссылка-приглашение**: на 1 вход и 24 часа (`createChatInviteLink`, `member_limit=1`).
Если ссылкой поделились и по ней вошёл человек без подписки — бот его исключит и сообщит администратору.
- **Учёт срока**: продление добавляет дни к текущей подписке, а не «сгорает».
- **Напоминания** за 3 дня и за 1 день до окончания — с кнопками продления.
- **Исключение по окончании** (ban + unban — участник сможет вернуться, оплатив снова). Администраторов канала бот не трогает.
- **Промокоды**: скидка в процентах, лимит использований, срок действия; промокод на 100 % — бесплатный доступ.
- **Администратору**: уведомления об оплатах, `/stats`, `/promo`, `/promos`, `/delpromo`, `/grant`.
## Запуск за 5 минут
### 1. Подготовьте канал и токены
| Что | Где взять |
|---|---|
| `BOT_TOKEN` | [@BotFather](https://t.me/BotFather) → `/newbot` → имя и юзернейм → скопируйте токен |
| `ADMIN_CHAT_ID` | Ваш ID — напишите [@userinfobot](https://t.me/userinfobot). Для группы администраторов: добавьте бота в группу и отправьте `/id` |
| `CHANNEL_ID` | Добавьте бота **администратором** закрытого канала (права «Приглашать пользователей» и «Блокировать пользователей»). ID канала (начинается с `-100`): откройте канал в [web.telegram.org](https://web.telegram.org) — число в адресной строке, или перешлите пост канала боту [@userinfobot](https://t.me/userinfobot) |
| `PAYMENTS_PROVIDER_TOKEN` | Только для оплаты картой: @BotFather → `/mybots` → бот → **Payments** → **ЮKassa** (для начала — тестовый) |
Скопируйте `.env.example` в `.env` и впишите значения.
### 2а. Запуск в Docker
```bash
docker compose up -d --build
docker compose logs -f # смотреть логи
```
### 2б. Запуск без Docker (Python 3.12+)
```bash
python -m venv .venv
# Windows: .venv\Scripts\activate Linux/macOS: source .venv/bin/activate
pip install -r requirements.txt
python -m app
```
При запуске бот проверит свои права в канале и напишет в лог, если их не хватает.
## Настройка
- **Цены, описание, тексты** — в начале `app/config.py` (значения из мастера TKBK Studio).
Цены в рублях для оплаты картой и в звёздах для Stars. Тариф с ценой `0` не показывается.
- **Способ оплаты** можно переключить без правки кода: `PAYMENT_METHOD=stars|card` в `.env`.
- **Промокоды** создаются командой в чате администратора: `/promo SUMMER 20 100 30` — скидка 20 %, 100 использований,
30 дней. `/promo FRIEND 100 1` — один бесплатный доступ.
## Команды
| Команда | Кто | Что делает |
|---|---|---|
| `/start`, `/status` | участники | тарифы и срок подписки |
| `/paysupport` | участники | вопрос по оплате — уходит администратору |
| `/stats` | админ | активные подписки, кто скоро закончится, выручка за 30 дней |
| `/promo КОД ПРОЦЕНТ [ЛИМИТ] [ДНЕЙ]` | админ | создать или изменить промокод |
| `/promos`, `/delpromo КОД` | админ | список и удаление промокодов |
| `/grant ID ДНЕЙ` | админ | выдать или продлить доступ вручную |
## Проверка
```bash
pip install -r requirements.txt pytest==9.1.1
pytest
```
Тесты проверяют тарифы, скидки, продление срока, напоминания и правила промокодов.
## Структура
```
app/
__main__.py запуск бота и фоновой проверки подписок
config.py настройки: .env + тарифы и тексты из мастера
plans.py тарифы, скидки, сроки, напоминания (чистая логика)
db.py SQLite: подписки, платежи, промокоды, ссылки
club.py тарифы, промокод, оплата, статус, ссылка для входа
access.py ссылки-приглашения, выдача доступа, исключение, защита от чужих ссылок
admin.py /stats, промокоды, /grant
scheduler.py напоминания и исключение по окончании (раз в 10 минут)
keyboards.py кнопки
```
## FAQ
**Бот не создаёт ссылку.** Бот должен быть администратором канала с правом «Приглашать пользователей». Ошибка придёт
в чат администратора.
**Участник не исключается после окончания.** Нужно право «Блокировать пользователей». Владельца и администраторов
канала бот не исключает.
**Как перенести существующих подписчиков?** Выдайте им доступ командой `/grant ID ДНЕЙ` — они должны хотя бы раз
нажать «Старт» у бота.
**Звёзды или карта?** По правилам Telegram цифровые товары и доступ к контенту внутри Telegram продают за Stars.
Оплата картой через ЮKassa подходит, если ваш продукт допускает её по правилам Telegram и платёжного провайдера.
**Где хранятся данные?** В SQLite: `data/club.db` (в Docker — том `club-data`). Делайте резервные копии.
Услуги, мастера, свободные окна на 14 дней, напоминания за сутки и за 2 часа, предоплата и отзывы
Оценка 0–10 после заказа: довольных — на Яндекс Карты, 2ГИС и WB, недовольных — сразу к менеджеру
Вопросы с кнопками, расчёт цены по формуле, телефон клиента — заявка менеджеру, в CSV и CRM