- Реализовал структуры для клавиатуры в ответе

- Добавил метод отправки фото
This commit is contained in:
2025-05-19 21:02:59 +03:00
parent c36dbb347b
commit 03a0be54d5
13 changed files with 270 additions and 95 deletions

View File

@@ -69,6 +69,9 @@
Запрос.УстановитьТелоИзДвоичныхДанных(Данные.ДвоичныеДанные);
Запрос.Заголовки.Вставить("Content-Length", Формат(Данные.ДвоичныеДанные.Размер(), "ЧН=0; ЧГ="));
Запрос.Заголовки.Вставить("Content-Type", "multipart/form-data; boundary=" + Данные.Разделитель);
Иначе
Запрос.Заголовки.Вставить("Content-Type","application/json");
Запрос.УстановитьТелоИзСтроки(HttpОбщегоНазначения.ОбъектВСтрокуJson(Данные));
КонецЕсли;
Иначе
Запрос.Заголовки.Вставить("Content-Type","application/json");

View File

@@ -1,8 +1,13 @@
#Область ПрограммныйИнтерфейс
Функция SendMessage(ИдЧата, СообщениеДляОтправки) Экспорт
Функция SendMessage(ИдЧата, СообщениеДляОтправки, Клавиатура = Неопределено) Экспорт
ТелоЗапроса = Новый Структура("chat_id, text", ИдЧата, СообщениеДляОтправки);
Если Клавиатура <> Неопределено Тогда
ТелоЗапроса.Вставить("reply_markup", Клавиатура);
КонецЕсли;
АдресРесурса = АдресРесурсаПоИмениМетода("sendMessage");
Возврат HttpОбщегоНазначения.ВыполнитьPostЗапрос(АдресРесурса,, ТелоЗапроса);
@@ -65,6 +70,24 @@
КонецФункции
Функция SendPhoto(ИдЧата, ФайлДляОтправки, ИмяФайла, Надпись = Неопределено, БезУведомления = Ложь) Экспорт
АдресРесурса = АдресРесурсаПоИмениМетода("sendPhoto");
ПараметрыЗапроса = Новый Структура("chat_id", Формат(ИдЧата, "ЧН=0; ЧГ="));
Если Надпись <> Неопределено Тогда
ПараметрыЗапроса.Вставить("caption", Надпись);
КонецЕсли;
Если БезУведомления Тогда
ПараметрыЗапроса.Вставить("disable_notification", "true");
КонецЕсли;
Разделитель = СтрЗаменить(Новый УникальныйИдентификатор, "-", "");
ДвоичныеДанныеФото = ДвоичныеДанныеФайла(ФайлДляОтправки, ИмяФайла, "image/jpeg", "photo", Разделитель);
ДанныеФото = Новый Структура("Разделитель, ДвоичныеДанные", Разделитель, ДвоичныеДанныеФото);
Возврат HttpОбщегоНазначения.ВыполнитьPostЗапрос(АдресРесурса, ПараметрыЗапроса, ДанныеФото);
КонецФункции
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
@@ -83,6 +106,9 @@
Функция ДвоичныеДанныеДокумента(ИдЧата, Документ, Надпись = Неопределено, БезУведомления = Ложь, Разделитель)
//Параметры ИдЧата, Надпись, БезУведомления можно передавать также в параметрах запроса, а не в теле как здесь
// Отправка фото сделана именно так. Все значения, кроме непосредственно фото задаются в параметрах запроса.
Если Документ = Неопределено ИЛИ Не (Документ.Свойство("ДанныеФайла") И ТипЗнч(Документ.ДанныеФайла) = Тип("ДвоичныеДанные")) Тогда
ВызватьИсключение "Неверный параметр Документ: ожидается непустой объект, содержащий двоичные данные";
КонецЕсли;
@@ -105,7 +131,23 @@
КонецФункции
Процедура ЗаписатьЭлементаЗапроса(ЗаписьДанных, Разделитель, ИмяПоля, Значение, ИмяФайла = Неопределено, ТипСодержимого = Неопределено)
Функция ДвоичныеДанныеФайла(Файл, ИмяФайла, ТипСодержимого, ИмяПараметра, Разделитель)
Если Файл = Неопределено ИЛИ ТипЗнч(Файл) <> Тип("ДвоичныеДанные") Тогда
ВызватьИсключение "Неверный параметр Файл: ожидается непустой объект, содержащий двоичные данные";
КонецЕсли;
ТелоЗапроса = Новый ПотокВПамяти();
ЗаписьДанных = Новый ЗаписьДанных(ТелоЗапроса, , , Символы.ВК + Символы.ПС, "");
ЗаписатьЭлементаЗапроса(ЗаписьДанных, Разделитель, ИмяПараметра, Файл, ИмяФайла, ТипСодержимого);
ЗаписьДанных.ЗаписатьСтроку("--" + Разделитель + "--");
ЗаписьДанных.Закрыть();
Возврат ТелоЗапроса.ЗакрытьИПолучитьДвоичныеДанные();
КонецФункции
Процедура ЗаписатьЭлементаЗапроса(ЗаписьДанных, Разделитель, ИмяПараметра, Значение, ИмяФайла = Неопределено, ТипСодержимого = Неопределено)
Если Значение = Неопределено Тогда
Возврат;
@@ -113,9 +155,9 @@
ЗаписьДанных.ЗаписатьСтроку("--" + Разделитель);
Если ИмяФайла <> Неопределено Тогда
ЗаписьДанных.ЗаписатьСтроку(СтрШаблон("Content-Disposition: form-data; name=%1; filename=%2", ИмяПоля, ИмяФайла));
ЗаписьДанных.ЗаписатьСтроку(СтрШаблон("Content-Disposition: form-data; name=%1; filename=%2", ИмяПараметра, ИмяФайла));
Иначе
ЗаписьДанных.ЗаписатьСтроку(СтрШаблон("Content-Disposition: form-data; name=%1", ИмяПоля));
ЗаписьДанных.ЗаписатьСтроку(СтрШаблон("Content-Disposition: form-data; name=%1", ИмяПараметра));
КонецЕсли;
Если ТипСодержимого <> Неопределено Тогда

View File

@@ -45,7 +45,13 @@
Функция ОбновленияТелеграм(ТелоЗапроса) Экспорт
ДанныеОбновления = HttpОбщегоНазначения.СтрокаJsonВОбъект(ТелоЗапроса);
Если ТипЗнч(ТелоЗапроса) = Тип("Соответствие") Тогда
ДанныеОбновления = ТелоЗапроса;
ИначеЕсли ТипЗнч(ТелоЗапроса) = Тип("Строка") Тогда
ДанныеОбновления = HttpОбщегоНазначения.СтрокаJsonВОбъект(ТелоЗапроса);
Иначе
Возврат Неопределено;
КонецЕсли;
МассивСообщенийТелеграм = Новый Массив;

View File

@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<MetaDataObject xmlns="http://v8.1c.ru/8.3/MDClasses" xmlns:app="http://v8.1c.ru/8.2/managed-application/core" xmlns:cfg="http://v8.1c.ru/8.1/data/enterprise/current-config" xmlns:cmi="http://v8.1c.ru/8.2/managed-application/cmi" xmlns:ent="http://v8.1c.ru/8.1/data/enterprise" xmlns:lf="http://v8.1c.ru/8.2/managed-application/logform" xmlns:style="http://v8.1c.ru/8.1/data/ui/style" xmlns:sys="http://v8.1c.ru/8.1/data/ui/fonts/system" xmlns:v8="http://v8.1c.ru/8.1/data/core" xmlns:v8ui="http://v8.1c.ru/8.1/data/ui" xmlns:web="http://v8.1c.ru/8.1/data/ui/colors/web" xmlns:win="http://v8.1c.ru/8.1/data/ui/colors/windows" xmlns:xen="http://v8.1c.ru/8.3/xcf/enums" xmlns:xpr="http://v8.1c.ru/8.3/xcf/predef" xmlns:xr="http://v8.1c.ru/8.3/xcf/readable" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.19">
<CommonModule uuid="b5c4da46-161d-4c6d-adbf-375e3fbc5f45">
<Properties>
<Name>ТелеграмРаботаСКлавиатурой</Name>
<Synonym>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Телеграм работа с клавиатурой</v8:content>
</v8:item>
</Synonym>
<Comment/>
<Global>false</Global>
<ClientManagedApplication>false</ClientManagedApplication>
<Server>true</Server>
<ExternalConnection>true</ExternalConnection>
<ClientOrdinaryApplication>false</ClientOrdinaryApplication>
<ServerCall>true</ServerCall>
<Privileged>false</Privileged>
<ReturnValuesReuse>DontUse</ReturnValuesReuse>
</Properties>
</CommonModule>
</MetaDataObject>

View File

@@ -0,0 +1,45 @@
Функция КлавиатураОтвета(Клавиатура, Компактная = Ложь, Одноразовая = Ложь) Экспорт
СоответствиеКлавиатуры = Новый Соответствие();
СоответствиеКлавиатуры.Вставить("keyboard", Клавиатура);
Если Компактная Тогда
СоответствиеКлавиатуры.Вставить("resize_keyboard", Компактная);
КонецЕсли;
Если Одноразовая Тогда
СоответствиеКлавиатуры.Вставить("one_time_keyboard", Одноразовая);
КонецЕсли;
Возврат СоответствиеКлавиатуры;
КонецФункции
Функция КнопкаКлавиатуры(Надпись) Экспорт
СоответствиеКнопка = Новый Соответствие;
СоответствиеКнопка.Вставить("text", ?(НЕ ЗначениеЗаполнено(Надпись), "<?>", Надпись));
Возврат СоответствиеКнопка;
КонецФункции
Функция РядКнопок(СписокНаименованийКнопокСтрокой) Экспорт
Результат = Новый Массив;
МассивНаименованийКнопок = СтрРазделить(СписокНаименованийКнопокСтрокой, ";");
Если МассивНаименованийКнопок.Количество() = 0 Тогда
Возврат Результат;
КонецЕсли;
Для каждого НадписьКнопки Из МассивНаименованийКнопок Цикл
Результат.Добавить(КнопкаКлавиатуры(НадписьКнопки));
КонецЦикла;
Возврат Результат;
КонецФункции