В начало

Отправить отчет в тему группы

 

Необходимо отправить отчет в тему группы.

Создаем группу, в группе создаем новую тему. Смотрим в информации по теме id темы.

Рис. Id темы группового чата в Телеграм

 

            Далее записываем в общий модуль процедуры и функции для отправки отчета в тему группы Телеграм. В общем модуле создаем процедуру для  вызова ее через регламентное задание.

 

Листинг. Общий модуль

Процедура ПроверкаСообщенийДляРеглЗадания() Экспорт

 

            Сервер = "api.telegram.org";  

            Токен = "1234567:asdfghjk-zxcvbnm";

 

            мСообщений = ПолучитьМассивСообщений2(Сервер, Токен);

           

            Для Каждого Эл Из мСообщений Цикл

                       

                        Если НЕ Эл.свойство("message") Тогда

                                   Продолжить;

                        КонецЕсли;

                       

                        Если ЗначениеЗаполнено(Эл.message.chat.id) И

                                    ЗначениеЗаполнено(Эл.message.date) Тогда

                                                                      

                                   НЗ = РегистрыСведений.ЖурналКомандБота.СоздатьНаборЗаписей();

                                   НЗ.Отбор.chat_id.Установить(Эл.message.chat.id);

                                   НЗ.Отбор.date.Установить(Эл.message.date);

                                   НЗ.Прочитать();

                                  

                                   Если НЗ.Количество() > 0 Тогда

                                              

                                               Для Каждого Зап Из НЗ Цикл

                                                           Если НЕ Зап.Выполнено Тогда

                                                                       //***********************************************

            ВыполнитьКомандуБотаПоИмени(Сервер, Токен, Зап);                                                                   //***********************************************

                                                           КонецЕсли;

                                               КонецЦикла;

                                              

                                               НЗ.Записать();

                                              

                                   Иначе

                                               МЗ = РегистрыСведений.ЖурналКомандБота.СоздатьМенеджерЗаписи();

                                               МЗ.chat_id = Эл.message.chat.id;

                                               МЗ.date = Эл.message.date;   

                                               МЗ.Время = Дата(1970, 1, 1) + 3600 * 3 + Эл.message.date;

 

                                               Если Эл.message.свойство("text") Тогда

                                                           МЗ.Команда = Эл.message.text;

                                               Иначе

                                                           МЗ.Команда = "";

                                               КонецЕсли;

 

                                               МЗ.Выполнено = ВыполнитьКомандуБотаПоИмени(Сервер, Токен, МЗ);

                                               МЗ.Записать();

                                              

                                   КонецЕсли;

                        КонецЕсли;

            КонецЦикла;

           

КонецПроцедуры

 

Функция ВыполнитьКомандуБотаПоИмени(Знач вхСервер, Знач вхТокен, Знач ЗаписьРегистра)

           

            Если ЗаписьРегистра.Команда = "/report1" ИЛИ

                         ЗаписьРегистра.Команда = "/report1@Bot" Тогда

                        ВывестиОтчет_ЖурналОтключений(вхТокен, ЗаписьРегистра.chat_id, "5270", Перечисления.Города. Смоленск);

КонецЕсли;

КонецФункции

 

&НаСервере

Процедура ВывестиОтчет_ЖурналОтключений(Знач вхТокен, Знач chat_id, Знач MessageThreadId, Знач перГород)

           

            ИмяФайла = ПолучитьИмяВременногоФайла("xlsx");

 

            Об = Обработки.ЖурналОтключений.Создать();

            ТабДок = Об.кмдСформироватьВМодулеОбъекта(перГород);        

            ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLSX);

                           

            ДД  = Новый ДвоичныеДанные(ИмяФайла);

            ТекстСообщ = "Отчет";

            ИмяПрилФайла = "Отчет.xlsx";

           

            Если ЗначениеЗаполнено(MessageThreadId) Тогда

                        ОтправитьФайлОтчетаВТемуГруппыТелеграм(вхТокен, СтрЗаменить(Формат(chat_id, "ЧДЦ=; ЧС=; ЧРГ=."), ".", ""), MessageThreadId, ДД, ИмяПрилФайла, ТекстСообщ);

            Иначе 

                        ОтправитьФайлОтчетаВТелеграм(вхТокен, СтрЗаменить(Формат(chat_id, "ЧДЦ=; ЧС=; ЧРГ=."), ".", ""), ДД, ИмяПрилФайла, ТекстСообщ);

            КонецЕсли;   

           

 

            УдалитьФайлы(ИмяФайла);//Удаляем временные файлы

           

КонецПроцедуры

 

Процедура ОтправитьФайлОтчетаВТемуГруппыТелеграм(Токен, ChatId, MessageThreadId, ДвоичныеДанные, ИмяФайла, Сообщение) 

 

            Разделитель = Строка(Новый УникальныйИдентификатор());

            Тело = Новый ПотокВПамяти();

            ЗаписьДанных = Новый ЗаписьДанных(Тело, КодировкаТекста.UTF8, ПорядокБайтов.LittleEndian, Символы.ВК + Символы.ПС, Символы.ПС, Истина);

           

    // chat_id – идентификатор чата/группы в Телеграм

    ЗаписьДанных.ЗаписатьСтроку("--" + Разделитель);

    ЗаписьДанных.ЗаписатьСтроку("Content-Disposition: form-data; name=""chat_id""");

    ЗаписьДанных.ЗаписатьСтроку("");

    ЗаписьДанных.ЗаписатьСтроку(ChatId);

 

    // message_thread_id – идентификатор темы в группе Телеграм

    ЗаписьДанных.ЗаписатьСтроку("--" + Разделитель);

    ЗаписьДанных.ЗаписатьСтроку("Content-Disposition: form-data; name=""message_thread_id""");

    ЗаписьДанных.ЗаписатьСтроку("");

    ЗаписьДанных.ЗаписатьСтроку(MessageThreadId);

           

    // disable_notification

    ЗаписьДанных.ЗаписатьСтроку("--" + Разделитель);

    ЗаписьДанных.ЗаписатьСтроку("Content-Disposition: form-data; name=""disable_notification""");

    ЗаписьДанных.ЗаписатьСтроку("");

    ЗаписьДанных.ЗаписатьСтроку("True");

       

    Если Не ПустаяСтрока(Сообщение) Тогда

        // caption

        ЗаписьДанных.ЗаписатьСтроку("--" + Разделитель);

        ЗаписьДанных.ЗаписатьСтроку("Content-Disposition: form-data; name=""caption""");

        ЗаписьДанных.ЗаписатьСтроку("");

        ЗаписьДанных.ЗаписатьСтроку(Сообщение);       

       

        // parse_mode

        ЗаписьДанных.ЗаписатьСтроку("--" + Разделитель);

        ЗаписьДанных.ЗаписатьСтроку("Content-Disposition: form-data; name=""parse_mode""");

        ЗаписьДанных.ЗаписатьСтроку("");

        ЗаписьДанных.ЗаписатьСтроку("HTML");

    КонецЕсли;

   

    // document   

    ЗаписьДанных.ЗаписатьСтроку("--" + Разделитель);

            ЗаписьДанных.ЗаписатьСтроку("Content-Disposition: form-data; name=""document""; filename=" + ИмяФайла + "");

 

   

    // Добавим файл

    ЗаписьДанных.Записать(ДвоичныеДанные);

   

    // Завершение записи

    ЗаписьДанных.ЗаписатьСтроку("");

    ЗаписьДанных.ЗаписатьСтроку("--" + Разделитель + "--");

    ЗаписьДанных.Закрыть();

   

    ДанныеТела = Тело.ЗакрытьИПолучитьДвоичныеДанные();  

 

    // Сформировать соединение и запрос

    Соединение = Новый HTTPСоединение("api.telegram.org",443,,,,15,Новый ЗащищенноеСоединениеOpenSSL());

    Заголовки   = Новый Соответствие;

    Заголовки.Вставить("Content-Type",      "multipart/form-data; boundary=" + Разделитель);

    Заголовки.Вставить("Accept",            "*/*");

    Заголовки.Вставить("Cache-Control",     "no-cache");

    Заголовки.Вставить("Host",              "api.telegram.org");

    Заголовки.Вставить("Accept-Encoding",   "gzip, deflate");

    Заголовки.Вставить("Content-Length",    Формат(ДанныеТела.Размер(), "ЧДЦ=0; ЧН=0; ЧГ=0"));

    Заголовки.Вставить("Connection",        "close");

    Адрес       = СтрШаблон("/bot%1/sendDocument", Токен);

    Запрос      = Новый HTTPЗапрос(Адрес, Заголовки);

    Запрос.УстановитьТелоИзДвоичныхДанных(ДанныеТела);

 

    Ответ = Соединение.ОтправитьДляОбработки(Запрос);

           

            Если Ответ.КодСостояния = 200 Тогда

                        ЧтениеJSON = Новый ЧтениеJSON();

                        ЧтениеJSON.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8));

                        РезСтруктура = ПрочитатьJSON(ЧтениеJSON);

                        ЧтениеJSON.Закрыть();                  

            КонецЕсли;

           

КонецПроцедуры

 

 

            Таким образом, можно отправить отчет в конкретную тему группового чата.