Краткое описание: В статье подробно рассматривается процесс создания и настройки Telegram‑бота, который позволяет преподавателям и студентам мгновенно загружать учебные материалы в КДН. Вы узнаете, какие шаги необходимо выполнить, какие команды использовать, а также получите рекомендации по безопасности и отладке.
Что такое КДН и зачем нужен Telegram‑бот?
Кабинет дистанционного обучения (КДН) – это централизованная платформа, где хранятся лекции, практические задания, тесты и прочие учебные ресурсы. Традиционная загрузка файлов через веб‑интерфейс часто требует:
- Открытия браузера;
- Навигации по нескольким меню;
- Заполнения формы загрузки.
Telegram‑бот упрощает процесс: достаточно отправить файл в чат с ботом, и он автоматически загрузит его в нужный раздел КДН. Это экономит время, особенно при работе с мобильными устройствами.
Требования к системе
- Учётная запись в Telegram.
- Администраторские права в КДН (право загружать файлы).
- Доступ к серверу, где будет размещён бот (можно использовать облачные сервисы: Heroku, Railway, Render и т.п.).
- Python 3.8+ (или любой другой язык, поддерживаемый Bot API).
Регистрация бота в Telegram
- Откройте чат с @BotFather.
- Отправьте команду
/newbot. - Укажите имя бота (например, КДН‑Помощник) и уникальное юзернейм‑имя (kdn_helper_bot).
- Сохраните полученный токен API – он понадобится в коде.
Архитектура решения
Схема взаимодействия выглядит так:
Telegram клиент ⇄ Telegram Bot API ⇄ Ваш сервер (бот) ⇄ API КДН ⇄ Хранилище файлов
Бот принимает сообщения, проверяет права пользователя, а затем через API КДН загружает файл в нужный курс/раздел.
Пример реализации на Python (используем aiogram)
Ниже – минимальный рабочий скрипт. В реальном проекте следует вынести конфигурацию в переменные окружения и добавить логирование.
import os
import aiohttp
from aiogram import Bot, Dispatcher, types
from aiogram.utils import executor
BOT_TOKEN = os.getenv('BOT_TOKEN')
KDN_API_URL = os.getenv('KDN_API_URL')
KDN_API_TOKEN = os.getenv('KDN_API_TOKEN')
bot = Bot(token=BOT_TOKEN)
dp = Dispatcher(bot)
ALLOWED_USERS = {123456789, 987654321}
def is_allowed(user_id: int) -> bool:
return user_id in ALLOWED_USERS
@dp.message_handler(content_types=types.ContentType.DOCUMENT)
async def handle_document(message: types.Message):
if not is_allowed(message.from_user.id):
await message.reply("❌ У вас нет прав для загрузки файлов.")
return
# Ожидаем, что в подписи к файлу будет указана цель загрузки:
# //
caption = message.caption or ''
try:
course_id, section_id, file_name = caption;split('/', 2)
except ValueError:
await message.reply(
"⚠️ В подписи к файлу укажите путь в виде "
"course_id/section_id/file_name."
)
return
# Скачиваем файл во временный буфер
file = await bot.get_file(message.document.file_id)
file_path = file.file_path
file_url = f"https://api.telegram.org/file/bot{BOT_TOKEN}/{file_path}"
async with aiohttp.ClientSession as session:
async with session.get(file_url) as resp:
file_bytes = await resp.read
# Формируем запрос к API КДН
upload_url = f"{KDN_API_URL}/courses/{course_id}/sections/{section_id}/files"
headers = {"Authorization": f"Bearer {KDN_API_TOKEN}"}
data = aiohttp.FormData
data.add_field('file', file_bytes,
filename=file_name,
content_type=message.document.mime_type)
async with aiohttp.ClientSession as session:
async with session.post(upload_url, headers=headers, data=data) as resp:
if resp.status == 201:
await message.reply(f"✅ Файл {file_name} успешно загружен в курс {course_id}.")
else:
err = await resp.text
await message.reply(f"❌ Ошибка загрузки: {resp.status}
{err}")
if __name__ == '__main__':
executor.start_polling(dp, skip_updates=True)
Кратко о работе кода:
- Проверяется, имеет ли пользователь право загружать файлы.
- Из подписи к документу извлекается путь загрузки (
course_id/section_id/file_name). - Файл скачивается с серверов Telegram.
- Отправляется запрос
POSTк API КДН.
Как оформить подпись к файлу
Для корректного определения места загрузки в КДН используйте следующую структуру подписи:
course123/section5/Тема_лекции.pdf
Пример:
- Курс:
course123– идентификатор курса в КДН. - Раздел:
section5– номер или ID раздела. - Имя файла:
Тема_лекции.pdf– как будет отображаться в КДН.
Безопасность и контроль доступа
- Whitelist пользователей. Храните список ID Telegram‑пользователей в базе данных или в переменных окружения.
- HTTPS. Все запросы к API КДН должны идти по защищённому протоколу.
- Токен доступа. Никогда не храните токен бота в открытом коде; используйте
.env‑файлы. - Лимиты. Ограничьте максимальный размер файла (например, 20 МБ), чтобы не перегружать сервер.
Отладка и типичные проблемы
- Bot не отвечает. Проверьте, запущен ли процесс бота и правильно ли указан
BOT_TOKEN. - Ошибка 401 от КДН. Вероятно, токен API КДН неверный или истёк.
- Файл не загружается, статус 413. Файл превышает лимит, установленный в КДН.
- Неправильный путь в подписи. Убедитесь, что подпись содержит ровно два символа «/».
Расширенные возможности
- Команды /list, /info. Позволяют пользователю узнать доступные курсы и разделы.
- Кнопки Inline‑keyboard. Делают процесс выбора курса интерактивным;
- Автоматическое переименование. Бот может добавить к имени файла дату и время загрузки.
Лучшие практики эксплуатации
- Регулярно обновляйте зависимости (
pip install -U aiogram aiohttp). - Внедряйте журналирование (например,
loguru) для быстрого поиска ошибок. - Создайте резервную копию загруженных файлов (например, синхронизация с облачным хранилищем).
- Проводите периодический аудит прав доступа.
Telegram‑бот – это простой и эффективный инструмент для быстрой передачи учебных материалов в КДН. Он экономит время преподавателей, снижает риск человеческих ошибок и позволяет работать с любой платформой – от смартфона до ноутбука. Следуя описанным шагам, вы сможете развернуть собственного бота за считанные минуты и адаптировать его под специфические нужды вашего учебного заведения.
Помните: безопасность данных и контроль доступа – ключевые аспекты любой автоматизации. Настройте whitelist, храните токены в безопасном месте и регулярно проверяйте логи работы бота.
Дата публикации: