При интеграции 1С с ботами Telegram часто возникает задача загрузки документов, фотографий или отчетов, отправленных пользователями в диалог с ботом. Для ее решения требуется реализовать двухэтапное взаимодействие с Telegram Bot API: сначала получить относительный путь к файлу на серверах Telegram, а затем скачать сам файл в локальный каталог или сохранить его в базе 1С. Рассмотрим подробно, как настроить этот процесс с использованием встроенных объектов 1С.
Когда пользователь отправляет боту документ или изображение, входящее сообщение содержит идентификатор файла — file_id. Чтобы узнать прямой путь для его загрузки, необходимо вызывать метод getFile Telegram Bot API.
Разберем по шагам формирование запроса и получение ответа в формате JSON:
Процедура СкачатьФайлИзТелеграм(FileID, ПутьДляСохранения)
ТокенБота = Константы.КлючAPI.Получить();
Сервер = "api.telegram.org";
// Формируем ресурс для получения метаданных файла
Ресурс = "bot" + ТокенБота + "/getFile?file_id=" + FileID;
Соединение = Новый HTTPСоединение(Сервер, , , , , , Новый ЗащищенноеСоединениеOpenSSL);
Запрос = Новый HTTPЗапрос(Ресурс);
Ответ = Соединение.Получить(Запрос);
Если Ответ.КодСостояния <> 200 Тогда
ВызватьИсключение "Ошибка запроса к Telegram API: " + Ответ.КодСостояния;
КонецЕсли;
// Декодируем полученный JSON-ответ
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());
ОтветСтруктура = ПрочитатьJSON(Чтение, Истина);
Чтение.Закрыть();
FilePath = "";
Если ОтветСтруктура.Получить("ok") = Истина Тогда
FilePath = ОтветСтруктура["result"]["file_path"];
Иначе
ВызватьИсключение "Не удалось получить путь к файлу из Telegram";
КонецЕсли;
После успешного получения относительного пути file_path (например, documents/file_1.pdf или photos/file_2.jpg) выполняем запрос на скачивание файла. Проанализируем основные способы сохранения полученного содержимого на диске.
Способ 1. Передача пути сохранения в метод Получить()
Наиболее простой и прямой путь — передать путь к сохраняемому файлу вторым параметром в метод Получить() объекта HTTPСоединение. Платформа самостоятельно сохранит поток данных на диск:
// Формируем ресурс скачивания
РесурсФайла = "file/bot" + ТокенБота + "/" + FilePath;
ЗапросФайла = Новый HTTPЗапрос(РесурсФайла);
// Скачиваем ответ прямо в указанный файл
Соединение.Получить(ЗапросФайла, ПутьДляСохранения);
КонецПроцедуры
Способ 2. Получение двоичных данных из HTTPОтвета
Если перед сохранением на диск требуется обработать файл в памяти или записать его в реквизит с типом ХранилищеЗначения, используем метод ПолучитьТелоКакДвоичныеДанные() объекта HTTPОтвет:
РесурсФайла = "file/bot" + ТокенБота + "/" + FilePath;
ЗапросФайла = Новый HTTPЗапрос(РесурсФайла);
ОтветФайла = Соединение.Получить(ЗапросФайла);
Если ОтветФайла.КодСостояния = 200 Тогда
ДвоичныеДанные = ОтветФайла.ПолучитьТелоКакДвоичныеДанные();
ДвоичныеДанные.Записать(ПутьДляСохранения);
КонецЕсли;
Способ 3. Прямая загрузка через объект ДвоичныеДанные
В современных версиях платформы 1С скачивание по прямой ссылка HTTPS можно выполнить с помощью конструктора объекта ДвоичныеДанные, передав абсолютный URL:
URLФайла = "https://api.telegram.org/file/bot" + ТокенБота + "/" + FilePath;
ДвоичныеДанные = Новый ДвоичныеДанные(URLФайла);
ДвоичныеДанные.Записать(ПутьДляСохранения);
Выясним особенности работы с Telegram Bot API, которые следует брать во внимание при разработке:
getFile. Для работы с большими файлами потребуется использование собственного локального сервера Telegram Bot API (Local Bot API Server).HTTPСоединение обязательно передавать объект Новый ЗащищенноеСоединениеOpenSSL.1C:Enterprise Server имеет необходимые права на запись в целевой каталог файловой системы.