Telegram-бот для закрытых файлов: выдача документов по временным ссылкам
«Пришлите, пожалуйста, актуальную версию». Эта просьба сопровождает инструкции, отчёты, учебные материалы и клиентские документы. Если отвечать вложением, в переписке быстро появляется собственный архив, где новая версия ничем не лучше старой, кроме даты сообщения. Бот может выдавать файл из единого хранилища, проверяя доступ и ограничивая срок действия ссылки.
Но временная ссылка не делает скачанный документ временным. Получатель может сохранить его и передать дальше. Поэтому задача системы — контролировать выдачу и доступ к оригиналу, а не обещать исчезновение всех копий после таймера.
Содержание
Выдавайте документы из своего хранилища
Разместите бота и реестр доступа на VPS MAATRIX. Для небольшого сервиса с внешним хранилищем рассмотрите 2 vCPU и 4 GB RAM.
Подобрать VPS для ботаВыбираем способ доставки по смыслу документа
Есть два основных варианта. Бот отправляет файл прямо в Telegram через sendDocument либо присылает ссылку на закрытое хранилище. В первом случае пользователь получает удобное вложение, но оно уже передано платформе и может остаться в истории. Во втором скачивание происходит из вашего источника по правилам, которые вы настроили.
Для общих учебных материалов вложение может быть вполне подходящим. Для отчёта, который нужно выдавать только после проверки полномочий, полезнее ссылка. Если требуется проверять личность при каждом открытии, нужна страница приложения с авторизацией, а не просто длинный случайный адрес.
Возможности отправки документов описаны в Telegram Bot API. Не стройте защиту на ограничении пересылки как на абсолютном запрете копирования. Техническое затруднение пересылки и контроль получателей — разные свойства.
Пользователь Telegram ещё не сотрудник компании
Бот получает числовой идентификатор пользователя. Это удобный ключ для связи с вашей учётной записью, но сам по себе он не доказывает принадлежность к отделу или клиентскому договору. Имя профиля и username тем более не должны давать доступ к документам.
Для корпоративного проекта свяжите Telegram с существующей учётной записью. Например, сотрудник входит в закрытый личный кабинет, получает одноразовый код подключения и передаёт его боту. Код имеет короткий срок, используется один раз и связан с конкретной учётной записью. После подтверждения сохраняется соответствие идентификаторов.
Для небольшой команды первоначальное подключение может подтверждать администратор. Но процедура должна быть явной: кого подключили, кто разрешил и когда. Публичная кнопка «я сотрудник» достаточно убедительна только для самой кнопки.
При выдаче каждого файла заново проверяйте активность учётной записи и право на конкретный документ. Увольнение или завершение договора должно прекращать новые выдачи. Общие принципы такой проверки собраны в рекомендациях OWASP по авторизации.
Каталог документов вместо путей из сообщения
Создайте реестр файлов: внутренний ID, понятное название, версия, владелец, правила доступа и ключ объекта в хранилище. Пользователь выбирает документ из разрешённого списка. Бот передаёт на сервер внутренний ID, а сервер сам находит настоящий объект.
Не принимайте путь к файлу или имя бакета из текста команды. Даже если интерфейс показывает только безопасные кнопки, запрос можно подделать. Проверка должна происходить на сервере, где известны пользователь, документ и разрешения.
Для нового выпуска создавайте отдельную версию объекта. Указатель «актуальный документ» можно переключить после проверки. Так журнал выдачи сохранит, какую редакцию получил человек, а старая ссылка не начнёт незаметно открывать другой файл с тем же именем.
Файлы храните в закрытом бакете или каталоге вне публичной папки сайта. Случайное имя объекта не заменяет запрет анонимного чтения. Проверьте прямое открытие адреса без авторизации до подключения бота: оно должно быть запрещено.
Временная ссылка из S3
Для объектного хранилища распространённый вариант — предварительно подписанная ссылка на чтение. Она разрешает определённую операцию с объектом в течение ограниченного времени. В Amazon S3 такая ссылка работает как пропуск для любого, кто её получил; повторные обращения до истечения срока обычно допустимы. Это описано в руководстве S3.
Ниже небольшой фрагмент для существующего Python-сервиса с Boto3. Он только создаёт ссылку для уже выбранного и разрешённого объекта. Аутентификация пользователя, проверка прав и обработчик Telegram находятся до вызова этой функции. Пример относится к Amazon S3; для другого совместимого хранилища сверяйте endpoint, регион и поддерживаемые параметры.
import boto3
s3 = boto3.client("s3")
def download_url(bucket: str, approved_object_key: str) -> str:
return s3.generate_presigned_url(
"get_object",
Params={"Bucket": bucket, "Key": approved_object_key},
ExpiresIn=300,
)
Пакет устанавливается как boto3; credentials должны поступать через штатный механизм окружения или роли, а не быть записаны в исходном коде. Учётной записи сервиса выдайте чтение только нужного набора объектов. Подписанная ссылка не добавляет полномочий, которых нет у подписавшей стороны.
Пять минут здесь учебный срок, его нужно согласовать с размером файла и поведением пользователей. Слишком короткий интервал неудобен для медленного соединения, слишком длинный увеличивает время использования утёкшей ссылки. Временные credentials могут завершить действие ссылки раньше указанного срока.
Точное применение generate_presigned_url приведено в документации Boto3. Не называйте такую ссылку одноразовой: для одноразового допуска понадобится собственный слой состояния и отдельные правила скачивания.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США и РФ. Оплата картой РФ и по СБП.
АРЕНДОВАТЬ СЕРВЕРПуть от кнопки до файла
После команды «Документы» бот определяет связанного пользователя и запрашивает список доступных записей. В сообщении показывает название, редакцию и короткое описание. Кнопка содержит непрозрачный ID документа, а не секрет хранилища.
При нажатии сервер повторно проверяет права, убеждается, что версия доступна, создаёт ссылку и записывает событие выдачи. Пользователю приходит сообщение с названием, сроком и кнопкой скачивания. Для такой выдачи лучше использовать личный диалог, чтобы ссылка не оказалась в общем чате.
Отключите автоматическое создание превью ссылки, если это уместно для интерфейса. Предпросмотр и сторонние проверяющие системы могут обращаться к адресу до самого человека. Поэтому собственный одноразовый токен не стоит бездумно погашать на первом GET-запросе: первым посетителем иногда оказывается не получатель.
Если ссылка истекла, предложите запросить новую через бота. Повторная выдача снова проходит авторизацию. Не продлевайте старый адрес без проверки: права пользователя могли измениться с момента первого запроса.
Журнал хранит пользователя, ID и версию документа, время, результат проверки и номер выдачи. Саму подписанную ссылку в обычный журнал лучше не записывать. Иначе система защиты создаст второе, менее заметное хранилище действующих пропусков.
Когда нужен собственный шлюз скачивания
Если требуется немедленный отзыв, подтверждение личности при открытии или строгий учёт разрешённых скачиваний, поставьте перед хранилищем своё приложение. Ссылка ведёт на страницу, пользователь входит, сервер проверяет текущие права и только затем передаёт файл либо выдаёт короткий внутренний доступ.
В таком варианте учтите повторные запросы, докачку и частичное чтение. Большой файл браузер может загружать несколькими обращениями. Одноразовое разрешение лучше связывать с контролируемой сессией скачивания, а не считать любой второй запрос нарушением.
Разделяйте события «ссылка выдана», «скачивание начато» и «передача завершена». Ни одно из них не доказывает, что человек прочитал документ. Для обязательного ознакомления нужен отдельный процесс подтверждения с понятными правилами организации.
Отзыв доступа к оригиналу тоже не удаляет уже скачанные копии. Для особо чувствительных материалов заранее решите, допустима ли вообще выдача файла. Иногда подходящим продуктом будет защищённый просмотр в приложении, хотя и он не способен отменить возможность сфотографировать экран.
Проверяем с двух учётных записей
Для оператора подготовьте возможность временно отключить выдачу конкретной версии. Если в отчёте обнаружена ошибка, новые запросы должны получать объяснение и предложение дождаться исправления. Не заменяйте файл молча: пользователю полезно знать, что прежняя редакция отозвана. Отдельно решите, нужно ли уведомлять тех, кому она уже выдавалась. Журнал выдачи помогает сформировать такой список, хотя и не показывает все последующие пересылки скачанных копий.
Создайте учебные документы для двух пользователей и один общий файл. Проверьте список, прямой запрос чужого ID и попытку использовать старую кнопку после отзыва прав. Скрытый из списка документ не должен становиться доступным через подмену идентификатора.
Затем испытайте истёкшую ссылку, новую версию файла и недоступность хранилища. Сообщение об ошибке не должно раскрывать внутренние пути и ключи. Если документ отсутствует, бот сообщает о проблеме, а оператор получает ID записи для проверки.
Проверьте пересылку временной ссылки другому тестовому пользователю. Для обычной подписанной ссылки она может работать до истечения срока — это ожидаемое свойство, которое нужно принять или заменить архитектурой с авторизацией при открытии. Такой тест полезнее обещания «ссылку невозможно передать».
Сам бот и небольшой реестр можно разместить на VPS MAATRIX Uab Start с 2 vCPU и 4 GB RAM на поддерживаемой Ubuntu или Debian. Это ориентир для пилота. Если файлы передаются через VPS, отдельно рассчитывайте диск и трафик; при прямой выдаче из объектного хранилища его стоимость учитывается отдельно. Резервируйте реестр, версии и настройки доступа.
На VPS MAATRIX можно разместить собственный сервис выдачи и подключить Telegram. Пользователь увидит простую кнопку, а за ней останется понятный порядок: кто запросил документ, почему ему разрешено его получить и какая версия была выдана.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США и РФ. Оплата картой РФ и по СБП.
АРЕНДОВАТЬ СЕРВЕРОбсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →