Вот готовый README.md для вашего GitHub-репозитория на основе анализа предоставленного кода:
Этот бот предназначен для предоставления статей по любой определенной теме. Пользователи могут просматривать структурированные темы, искать конкретные подтемы, а также оформлять подписку для получения расширенного доступа. Администратор может управлять контентом, пользователями и рассылками.
- 🔍 Поиск по темам: ввод названия — бот предложит подходящие варианты.
- 📚 Навигация по иерархии тем: древовидная структура тем.
- 💬 Просмотр контента: название, описание (в формате Telegraph-ссылки), медиафайлы и дополнительные ссылки.
- ⭐ Подписка: оплата через Telegram Stars (1 месяц — 65 ⭐️, 3 месяца — 110 ⭐️).
- 📅 Автоматическое обновление подписки: ежедневная проверка срока действия подписки.
- 🔒 Блокировка: заблокированные пользователи не могут взаимодействовать с ботом.
- ➕ Добавление новых тем и подтем.
- ✏️ Редактирование существующих тем: название, текст, ссылка, медиа.
- 🗑️ Удаление тем.
- 📰 Создание и рассылка новостей всем подписчикам.
- 🚫 Блокировка/разблокировка пользователей.
Бот использует SQLite (database.db
) с двумя основными таблицами:
Хранит информацию о пользователях:
user_id
— уникальный ID Telegram.step
— текущий этап взаимодействия (для FSM).news
— номер последней прочитанной новости.sub
— дата окончания подписки в формате"YYYY,MM,DD"
.subed
— флаг активной подписки (1
— активна,0
— нет).blocked
— флаг блокировки (1
— заблокирован).free_search
— количество бесплатных поисковых запросов.mail
— email (если используется).path
— текущий путь в иерархии тем (в формате JSON-строки).name
— имя пользователя (если задано).
Хранит темы и подтемы:
id
— уникальный ID темы.name
— название темы.text
— описание (обычно ссылка на статью в Telegraph).url
— дополнительная ссылка.media
— ID медиафайла в Telegram (фото/видео).step
— статус редактирования ('done'
— завершено, иначе — в работе).
Хранит ID сообщений с новостями для рассылки:
id
— автоинкрементный ID.message_id
— ID сообщения в Telegram.
Иерархия тем задаётся в файле topics.json
в формате вложенных словарей, где ключи — это ID тем из таблицы items
. Пример:
{
"1": {
"3": {}
},
"2": {}
}
Это означает:
- Тема с ID
1
содержит подтему с ID3
. - Тема с ID
2
— корневая и не имеет подтем.
При навигации бот использует эту структуру для построения клавиатур.
Бот использует APScheduler для ежедневной проверки подписок в заданное время (config.TIME
, по умолчанию — 16:00 по UTC+3).
Функция new_day()
:
- Проверяет у каждого пользователя дату окончания подписки.
- Если подписка истекла — деактивирует её (
subed = 0
). - Если до окончания остался ровно 1 месяц — продлевает автоматически (на 3 дня вперёд от текущей даты).
⚠️ На данный момент автоматическое продление реализовано как техническая заглушка и требует доработки для реального использования.
Оплата осуществляется через Telegram Stars (встроенные в Telegram платежи). Доступны два тарифа:
- 1 месяц — 65 ⭐️
- 3 месяца — 110 ⭐️
После оплаты бот устанавливает дату окончания подписки и активирует доступ.
-
Клонируйте репозиторий:
git clone https://github.com/KeyC-code/EducationalBot.git cd edu-bot
-
Установите зависимости:
pip install -r requirements.txt
-
Создайте файл
.env
в корне проекта:BOT_TOKEN=your_telegram_bot_token ADMIN_ID=your_telegram_user_id
-
Убедитесь, что файл
database.db
существует (или запустите миграцию, если она предусмотрена — в текущей версии таблицы должны быть созданы вручную). -
Запустите бота:
python bot.py
.
├── bot.py # Точка входа, инициализация бота и планировщика
├── config.py # Настройки (токен, ID админа, цены и т.д.)
├── db.py # Работа с SQLite-базой
├── topics.json # Иерархия тем
├── .env # Переменные окружения (не включён в Git)
└── app/
└── handlers.py # Обработчики команд и callback-ов (не показаны, но подключены через router)
└── keyboards.py # Генерация клавиатур
└── utils/
└── scheduler_utils.py # Логика ежедневной проверки подписок
└── message_utils.py # Мини утилитки для чистки предыдущих сообщений
- Бот написан с использованием aiogram 3.x.
- Все текстовые материалы хранятся внешне (например, на Telegraph), в базе — только ссылки.
- Админка доступна только одному пользователю (указанному в
ADMIN_ID
). - Функционал оплаты и автоматического продления требует тестирования в реальных условиях.