diff --git a/src/cf/Catalogs/узЗадачи/Ext/ObjectModule.bsl b/src/cf/Catalogs/узЗадачи/Ext/ObjectModule.bsl index 2f892b608..bfafeeae0 100644 --- a/src/cf/Catalogs/узЗадачи/Ext/ObjectModule.bsl +++ b/src/cf/Catalogs/узЗадачи/Ext/ObjectModule.bsl @@ -523,9 +523,12 @@ КонецЕсли; //- #190 SZ 16.03.2020 + //+ #240 Пиганов Г.В. 2020-09-08 // +++ 79Vlad 20.12.2018 - узТелеграммСервер.ВыполнитьРассылку(ДопПараметры); + //узТелеграммСервер.ВыполнитьРассылку(ДопПараметры); // --- 79Vlad 20.12.2018 + узТелеграмБот.ОтправитьСообщение(ДопПараметры.ТекстПисьма, Исполнитель); + //- #240 Пиганов Г.В. 2020-09-08 КонецПроцедуры @@ -613,9 +616,12 @@ КонецЕсли; //- #190 SZ 16.03.2020 + //+ #240 Пиганов Г.В. 2020-09-08 // +++ 79Vlad 20.12.2018 - узТелеграммСервер.ВыполнитьРассылку(ДопПараметры); + //узТелеграммСервер.ВыполнитьРассылку(ДопПараметры); // --- 79Vlad 20.12.2018 + узТелеграмБот.ОтправитьСообщение(ДопПараметры.ТекстПисьма, СтарыйИсполнитель); + //- #240 Пиганов Г.В. 2020-09-08 КонецПроцедуры @@ -652,8 +658,11 @@ узОбщийМодульСервер.ОтправитьПисьмо(ДопПараметры); + //+ #240 Пиганов Г.В. 2020-09-08 //Павлюков - узТелеграммСервер.ВыполнитьРассылку(ДопПараметры); + //узТелеграммСервер.ВыполнитьРассылку(ДопПараметры); + узТелеграмБот.ОтправитьСообщение(ДопПараметры.ТекстПисьма, МассивНаблюдателей); + //- #240 Пиганов Г.В. 2020-09-08 КонецПроцедуры diff --git a/src/cf/CommonModules/узТелеграммСервер.xml b/src/cf/CommonModules/узТелеграмБот.xml similarity index 86% rename from src/cf/CommonModules/узТелеграммСервер.xml rename to src/cf/CommonModules/узТелеграмБот.xml index f3fc03858..c1488c6f8 100644 --- a/src/cf/CommonModules/узТелеграммСервер.xml +++ b/src/cf/CommonModules/узТелеграмБот.xml @@ -1,12 +1,12 @@  - + - узТелеграммСервер + узТелеграмБот ru - Уз телеграмм сервер + Уз телеграм бот @@ -15,7 +15,7 @@ true false false - true + false false DontUse diff --git a/src/cf/CommonModules/узТелеграмБот/Ext/Module.bsl b/src/cf/CommonModules/узТелеграмБот/Ext/Module.bsl new file mode 100644 index 000000000..b45e7eee6 --- /dev/null +++ b/src/cf/CommonModules/узТелеграмБот/Ext/Module.bsl @@ -0,0 +1,640 @@ +#Область ПрограммныйИнтерфейс + +// #240 Пиганов Г.В. 2020-09-08 +// Возвращает настройки бота +// +// Возвращаемое значение: +// Структура - структура с параметрами +// * ТокенБота - Строка - токен телеграмм-бота +// * ТекущийПрокси - Число,Неопределено - текущий индекс прокси. Заполняется в ЗаполнитьНастройкиПрокси +// +Функция НастройкиБота() Экспорт + + НастройкиБота = Новый Структура; + НастройкиБота.Вставить("ТокенБота", Константы.узТелеграмм_ТокенБота.Получить()); + НастройкиБота.Вставить("ТекущийПрокси", Неопределено); + + Возврат НастройкиБота; + +КонецФункции + +// #240 Пиганов Г.В. 2020-09-08 +// Добавляет в настройки бота данные прокси +// +// Параметры: +// НастройкиБота - Структура - структура настроек для заполнения +// +// Возвращаемое значение: +// НастройкиБота - Структура - входящие настройки бота +// * ТекущийПрокси - Число - Индекс текущего прокси. Равен 0 и изменяется при выполнении запросов +// * Прокси - Массив структур - Массив доступных прокси. Задаются в регистре сведений узПроксиСерверы +// ** Адрес - Строка - адрес прокси +// ** Порт - Число - порт прокси +// ** Логин - Строка - логин прокси +// ** Пароль - Строка - пароль прокси +// +Процедура ЗаполнитьНастройкиПрокси(НастройкиБота) Экспорт + + Прокси = РегистрыСведений.узПроксиСерверы.ПолучитьМассивНастроекПроксиСерверов(); + Если Прокси.Количество() > 0 Тогда + НастройкиБота.Вставить("Прокси", Прокси); + НастройкиБота.ТекущийПрокси = 0; + КонецЕсли; + +КонецПроцедуры + +// #240 Пиганов Г.В. 2020-09-08 +// Возвращает новые сообщения относительно переданного ИД +// +// Параметры: +// MaxMessageID - Необязательное. Идентификатор последнего полученного сообщения (не номер в чате). +// Сообщения получаются после этого номера. Если не указано, то значение +// получается из элемента-константы ТелеграмMaxMessangeID. +// Ответ - HTTPОтвет - если указана переменная, то в нее помещается ответ, полученный при запросе +// НеПолучатьПовторно - Булево - Если Истина, то последний идентификатор сообщения +// будет сохранен в элемент-константу ТелеграмMaxMessangeID +// +// Возвращаемое значение: +// Массив структур - Данные полученных сообщений: +// * Номер - Строка - Номер сообщения в чате +// * ДатаУниверсальная - Дата и время - дата сообщения (UTC+0:00) +// * Дата - Дата и время - дата сообщения приведенная к текущему часовому поясу сеанса +// * ПользовательПредставление - Строка - представление пользователя в телеграмм +// * ПользовательИД - Строка - идентификатор пользователя телеграмм +// * ПользовательИмя - Строка - имя пользователя в телеграмм. Может быть пустым +// * Текст - Строка - Текст сообщения +// * Пользователь - СправочникСсылка.Пользователи - ссылка на пользователя, найденная по данным ПользовательИД +// * Файлы - Массив структур - Массив файлов сообщения: +// ** Имя - Строка - имя файла с расширением. Для фото не задано +// ** ИД - Строка - идентификатор файла. Используется для получения файла +// ** Размер - Число - размер файла +// ** Ширина - Число - ширина изображения. Задано только для фото +// ** Высота - Число - высота изображения. Задано только для фото +// +Функция ПолучитьНовыеСообщения(MaxMessageID = "", Ответ = Неопределено, НеПолучатьПовторно = Истина) Экспорт + + ПолученныеСообщения = Новый Массив; + + НастройкиБота = НастройкиБота(); + Если ПустаяСтрока(НастройкиБота.ТокенБота) Тогда + Возврат ПолученныеСообщения; + КонецЕсли; + ЗаполнитьНастройкиПрокси(НастройкиБота); + + Если ПустаяСтрока(MaxMessageID) Тогда + ИДПоследнегоПринятогоСообщения = Справочники.узКонстанты.ПолучитьЗначениеКонстанты("ТелеграмMaxMessangeID", Тип("Строка"), , Ложь); + Иначе + ИДПоследнегоПринятогоСообщения = MaxMessageID; + КонецЕсли; + + ПараметрыЗапроса = Новый Соответствие; + Если НЕ ПустаяСтрока(ИДПоследнегоПринятогоСообщения) Тогда + ПараметрыЗапроса.Вставить("offset", ИДПоследнегоПринятогоСообщения); + КонецЕсли; + + Если НЕ ВыполнитьЗапросHTTP(НастройкиБота, "getUpdates", ПараметрыЗапроса, Ответ) Тогда + ЗаписьЖурналаРегистрации("Телеграм.ПолучениеСообщений", УровеньЖурналаРегистрации.Ошибка,,, + "Не смогли получить сообщения телеграм"); + Возврат ПолученныеСообщения; + КонецЕсли; + + ОтветСтрокаJSON = Ответ.ПолучитьТелоКакСтроку(); + ОтветСоответствие = СоответствиеИзСтрокиJSON(ОтветСтрокаJSON); + Если ОтветСоответствие["ok"] <> Истина Тогда + Возврат ПолученныеСообщения; + КонецЕсли; + + ИндексыКУдалению = Новый СписокЗначений; + ИндексыСообщений = Новый Соответствие; + ИндексСообщения = 0; + + КэшПользователей = ВсеПользователиТелеграмм(); + ОтборПользователя = Новый Структура("ПользовательИД"); + + Для Каждого Update Из ОтветСоответствие["result"] Цикл + + ИДСообщения = Формат(Update["update_id"] + 1, "ЧГ="); + Если ИДПоследнегоПринятогоСообщения < ИДСообщения Тогда + ИДПоследнегоПринятогоСообщения = ИДСообщения; + КонецЕсли; + + ДанныеСообщения = Новый Структура; + ДанныеСообщения.Вставить("Обработано", Ложь); + ДанныеСообщения.Вставить("ИД", ИДСообщения); + + Message = Update["message"]; + Если Message = Неопределено Тогда + EditedMessage = Update["edited_message"]; + Если EditedMessage <> Неопределено Тогда + // Получено отредактированное сообщение + Message = EditedMessage; + ИндексИсходногоСообщения = ИндексыСообщений[Message["message_id"]]; + Если ИндексИсходногоСообщения = Неопределено Тогда + // Исходное сообщение было в предыдущем запросе и уже обработано. + // При текущей реализации такие отредактированные сообщения не обрабатываем + Продолжить; + КонецЕсли; + // Отредактированные сообщения должны быть удалены после обработки + ИндексыКУдалению.Добавить(ИндексИсходногоСообщения); + КонецЕсли; + КонецЕсли; + + Если Message <> Неопределено Тогда + msgChat = Message["chat"]; // данные чата пользователя + //msgFrom = Message["from"]; // данные пользователя сообщения + + ДанныеСообщения.Вставить("Номер", Message["message_id"]); + + ДанныеСообщения.Вставить("ДатаУниверсальная", '19700101' + Message["date"]); + // Преобразование универсальной даты в местное время сеанса + ДанныеСообщения.Вставить("Дата", МестноеВремя(ДанныеСообщения.ДатаУниверсальная)); + + ДанныеСообщения.Вставить("ПользовательПредставление", msgChat["last_name"] + " " + msgChat["first_name"]); + ДанныеСообщения.Вставить("ПользовательИД", msgChat["id"]); + ДанныеСообщения.Вставить("ПользовательИмя", msgChat["username"]); + + ДанныеСообщения.Вставить("Текст", Строка(Message["text"])); + + // Добавление артинок и файлов + ПрикрепленныеФайлы = Новый Массив; + + msgPhoto = Message["photo"]; // прикрепленные фото + Если ТипЗнч(msgPhoto) = Тип("Массив") Тогда + // Если в массиве 3 картинки, то это "превью маленькое" 320*190, "настоящая картинка", "превью большое" 800*475 + Если msgPhoto.Количество() = 3 Тогда + msgPhoto = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(msgPhoto[1]); + КонецЕсли; + Для Каждого msgPhotoSize Из msgPhoto Цикл + ДанныеФайла = Новый Структура; + ДанныеФайла.Вставить("Имя", ""); + ДанныеФайла.Вставить("ИД", msgPhotoSize["file_id"]); + ДанныеФайла.Вставить("Ширина", msgPhotoSize["width"]); + ДанныеФайла.Вставить("Высота", msgPhotoSize["height"]); + ДанныеФайла.Вставить("Размер", msgPhotoSize["file_size"]); + ПрикрепленныеФайлы.Добавить(ДанныеФайла); + КонецЦикла; + КонецЕсли; + + msgDocument = Message["document"]; // прикрепленные документы и картинки как файлы + Если ТипЗнч(msgDocument) = Тип("Соответствие") Тогда + ДанныеФайла = Новый Структура; + ДанныеФайла.Вставить("Имя", msgDocument["file_name"]); + ДанныеФайла.Вставить("ИД", msgDocument["file_id"]); + ДанныеФайла.Вставить("Размер", msgDocument["file_size"]); + ПрикрепленныеФайлы.Добавить(ДанныеФайла); + КонецЕсли; + + Если ПрикрепленныеФайлы.Количество() > 0 Тогда + // Для файлов передается заголовок, а не текст + ДанныеСообщения.Текст = Строка(Message["caption"]); + КонецЕсли; + ДанныеСообщения.Вставить("Файлы", ПрикрепленныеФайлы); + + // Поиск пользователя по ИД пользователя телеграмм + ПользовательСсылка = Неопределено; + ОтборПользователя.ПользовательИД = ДанныеСообщения.ПользовательИД; + НайденныеСтроки = КэшПользователей.НайтиСтроки(ОтборПользователя); + Если НайденныеСтроки.Количество() > 0 Тогда + ПользовательСсылка = НайденныеСтроки[0].Ссылка; + КонецЕсли; + ДанныеСообщения.Вставить("Пользователь", ПользовательСсылка); + КонецЕсли; + + Если НЕ ПустаяСтрока(ДанныеСообщения.Текст) ИЛИ ДанныеСообщения.Файлы.Количество() > 0 Тогда + ПолученныеСообщения.Добавить(ДанныеСообщения); + + ИндексыСообщений[ДанныеСообщения.Номер] = ИндексСообщения; + ИндексСообщения = ИндексСообщения + 1; + КонецЕсли; + КонецЦикла; + + // Удаление исходных отредактированных сообщений + ИндексыКУдалению.СортироватьПоЗначению(НаправлениеСортировки.Убыв); + Для Каждого ЭлементСписка Из ИндексыКУдалению Цикл + ПолученныеСообщения.Удалить(ЭлементСписка.Значение); + КонецЦикла; + + Если НеПолучатьПовторно Тогда + Справочники.узКонстанты.УстановитьЗначениеКонстанты("ТелеграмMaxMessangeID", ИДПоследнегоПринятогоСообщения); + КонецЕсли; + + Возврат ПолученныеСообщения; + +КонецФункции + +// #240 Пиганов Г.В. 2020-09-08 +// Скачивает и помещает во временное хранилище файл с указанным ИД +// Параметры: +// ИД - Строка - идентификатор файла телеграмм. Передается с сообщением. +// НастройкиБота - Структура - структура с настройками бота. Если передана +// не переменная, то в нее будут помещены настройки. +// +// Возвращаемое значение: +// Строка - адрес во временном хранилище с двоичными данными файла +// +Функция ПолучитьФайл(ФайлИД, НастройкиБота = Неопределено) Экспорт + + Если НастройкиБота = Неопределено Тогда + НастройкиБота = НастройкиБота(); + КонецЕсли; + + ПараметрыЗапроса = Новый Соответствие; + ПараметрыЗапроса.Вставить("file_id", ФайлИД); + + Ответ = Неопределено; + + Если НЕ ВыполнитьЗапросHTTP(НастройкиБота, "getFile", ПараметрыЗапроса, Ответ) Тогда + ЗаписьЖурналаРегистрации("Телеграм.ПолучениеСообщений", УровеньЖурналаРегистрации.Ошибка,, + , "Не смогли получить файл телеграм"); + Возврат Неопределено; + КонецЕсли; + + ОтветСоответствие = СоответствиеИзСтрокиJSON(Ответ.ПолучитьТелоКакСтроку()); + + msgFile = ОтветСоответствие["result"]; + + ФайлURL = "https://api.telegram.org/file/bot" + НастройкиБота.ТокенБота + "/" + msgFile["file_path"]; + + ПараметрыПолучения = ПолучениеФайловИзИнтернетаКлиентСервер.ПараметрыПолученияФайла(); + ПараметрыПолучения.ЗащищенноеСоединение = Истина; + ДанныеФайла = ПолучениеФайловИзИнтернета.СкачатьФайлВоВременноеХранилище(ФайлURL, ПараметрыПолучения, Истина); + + АдресФайла = ?(ДанныеФайла.Статус, ДанныеФайла.Путь, Неопределено); + + Возврат АдресФайла; + +КонецФункции + +// #240 Пиганов Г.В. 2020-09-08 +// Отправляет текстовое сообщение переданным пользователям +// +// Параметры: +// ТекстСообщения - Строка - Текст сообщения в формате markdown +// Получатели - Массив, СправочникСсылка.Пользователь - массив пользователей для получения сообщения. +// Сообщение отправляется только пользователям с заполненным ИД телеграмма +// и с установленным флагом "Использовать рассылку через телеграмм" +// Ответ - Структура или Соответствие - доп. параметры, которые должны быть переданы в параметры запроса +// +Процедура ОтправитьСообщение(ТекстСообщения, Получатели, УведомлятьПользователя = Ложь, Ответ = Неопределено) Экспорт + + Ответ = Неопределено; + + НастройкиБота = НастройкиБота(); + Если ПустаяСтрока(НастройкиБота.ТокенБота) Тогда + Если УведомлятьПользователя Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю( + "Сообщение не отправлено, т.к. не задан токен телеграмм-бота"); + КонецЕсли; + Возврат; + КонецЕсли; + + Выборка = ВыборкаПользователейТелеграмДляОтправки(Получатели); + Если Выборка.Количество() = 0 Тогда + Если УведомлятьПользователя Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю( + "Сообщение не отправлено, т.к. не заданы получатели или у получателей не включена рассылка через телеграмм"); + КонецЕсли; + Возврат; + КонецЕсли; + + ИспользоватьПрокси = Справочники.узКонстанты.ПолучитьЗначениеКонстанты( + "ТелеграммИспользоватьПроксиДляОтправки", Тип("Булево"), Ложь, Истина, Истина); + Если ИспользоватьПрокси Тогда + ЗаполнитьНастройкиПрокси(НастройкиБота); + КонецЕсли; + + ПараметрыЗапроса = Новый Соответствие; + ПараметрыЗапроса.Вставить("parse_mode", "Markdown"); + ПараметрыЗапроса.Вставить("disable_web_page_preview", "true"); + ПараметрыЗапроса.Вставить("text", ТекстСообщения); + + Пока Выборка.Следующий() Цикл + ПараметрыЗапроса.Вставить("chat_id", Формат(Выборка.ПользовательИД, "ЧГ=")); + ОтветУспешен = ВыполнитьЗапросHTTP(НастройкиБота, "sendMessage", ПараметрыЗапроса, Ответ); + Если НЕ ОтветУспешен Тогда + ЗаписьЖурналаРегистрации("Телеграмм.Отправка", УровеньЖурналаРегистрации.Ошибка,, + , "Не смогли отправить пользователю <" + Выборка.ПользовательИД + ":" + Выборка.Пользователь + ">"); + КонецЕсли; + Если УведомлятьПользователя Тогда + Если ОтветУспешен Тогда + ТекстСообщения = "Сообщение удачно отправлено" ; + Иначе + ТекстСообщения = "Не смогли отправить сообщение телеграм пользователю [" + Выборка.ПользовательИД + "]. Подробнее смотрите в журнале регистрации." + КонецЕсли; + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения); + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +// #240 Пиганов Г.В. 2020-09-08 +// Заменяет в переданной строки символы для корректного отражения в строке URL +// Может быть использована при выполнении GET-запросов +// +Функция ЗаменитьЗарезервированныеСимволыURL(ОбрабатываемаяСтрока) Экспорт + Если ПустаяСтрока(ОбрабатываемаяСтрока) Тогда + Возврат ОбрабатываемаяСтрока; + КонецЕсли; + + пТелеграммИспользоватьЗаменуСимволовВДругуюКодировку = Справочники.узКонстанты.ПолучитьЗначениеКонстанты( + "ТелеграммИспользоватьЗаменуСимволовВДругуюКодировку",Тип("Булево"),,Истина,Истина); + + Если пТелеграммИспользоватьЗаменуСимволовВДругуюКодировку Тогда + ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(37),"%25"); // "%" + ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(33),"%21"); // "!" + ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(34),"%22"); // """ (кавычка) + ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(35),"%23"); // "#" + ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(36),"%24"); // "$" + ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(38),"%26"); // "&" + ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(39),"%27"); // "'" + ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(42),"%2A"); // "*" + ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(44),"%2C"); // "," + ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(58),"%3A"); // ":" + ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(59),"%3B"); // ";" + ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(60),"%3C"); // "<" + ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(61),"%3D"); // "=" + ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(62),"%3E"); // ">" + ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(63),"%3F"); // "?" + ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(91),"%5B"); // "[" + ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(93),"%5D"); // "]" + ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(94),"%5E"); // "^" + ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(96),"%60"); // "`" + ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(123),"%7B"); // "{" + ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(124),"%7C"); // "|" + ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(125),"%7D"); // "}" + ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(32),"%20"); // " " (пробел) + Иначе + ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%25",Символ(37) ); // "%" + ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%21",Символ(33) ); // "!" + ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%22",Символ(34) ); // """ (кавычка) + ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%23",Символ(35) ); // "#" + ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%24",Символ(36) ); // "$" + ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%26",Символ(38) ); // "&" + ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%27",Символ(39) ); // "'" + ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%2A",Символ(42) ); // "*" + ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%2C",Символ(44) ); // "," + ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%3A",Символ(58) ); // ":" + ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%3B",Символ(59) ); // ";" + ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%3C",Символ(60) ); // "<" + ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%3D",Символ(61) ); // "=" + ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%3E",Символ(62) ); // ">" + ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%3F",Символ(63) ); // "?" + ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%5B",Символ(91) ); // "[" + ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%5D",Символ(93) ); // "]" + ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%5E",Символ(94) ); // "^" + ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%60",Символ(96) ); // "`" + ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%7B",Символ(123)); // "{" + ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%7C",Символ(124)); // "|" + ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%7D",Символ(125)); // "}" + ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%20",Символ(32) ); // " " (пробел) + КонецЕсли; + + Возврат ОбрабатываемаяСтрока; + +КонецФункции + +// #240 Пиганов Г.В. 2020-09-08 +// Выполняет HTTPЗапрос для телеграмм по переданным параметрам и с обходом доступных прокси, если они заданы +// +// Параметры: +// НастройкиБота - Структура - структура настроек бота +// * ТокенБота - Строка - токен бота телеграмм. Получается при создании бота +// * ТекущийПрокси - Строка,Неопределено - если Неопределено, то прокси не используется, +// иначе индекс прокси в массиве НастройкиБота.Прокси +// * Прокси - Массив структур - Необязательный. Массив настроек доступных прокси +// ** Адрес - Строка - Адрес прокси +// ** Порт - Число - Порт прокси +// ** Логин - Строка - Логи прокси +// ** Пароль - Строка - Пароль прокси +// Команда - Строка - команда телеграмм API +// ПараметрыЗапроса - Структура,Соответствие - дополнительные параметры запроса. Передаются в HTTPЗапрос +// Ответ - HTTPОтвет - переменная для получения результата запроса +// ЭтоЗапросPOST - Булево - Признак выполнения POST, а не GET запроса. При GET запросе параметры +// передаются в строке URL, а при POST передаюттся в теле запроса +// +// Возвращаемое значение: +// Булево - признак успешного выполнения запроса (код ответа 200 или 300) +// +Функция ВыполнитьЗапросHTTP(НастройкиБота, Команда, ПараметрыЗапроса, Ответ, ЭтоЗапросPOST = Истина) Экспорт + + ЕстьПрокси = НастройкиБота.ТекущийПрокси <> Неопределено; + + // Цикл обхода прокси, если они есть или запрос без прокси + Пока Истина Цикл + + СоединениеHTTP = НовоеСоединениеHTTP(НастройкиБота); + + Ресурс = "bot" + НастройкиБота.ТокенБота + "/" + Команда; + + Если ЭтоЗапросPOST Тогда + + // Запрос POST. Параметры в теле запроса + СтрокаJSON = СтрокаJSONИзСоответствия(ПараметрыЗапроса); + + ЗапросHTTP = Новый HTTPЗапрос(Ресурс); + ЗапросHTTP.Заголовки.Вставить("Content-type", "keep-alive"); + ЗапросHTTP.Заголовки.Вставить("Content-type", "application/json"); + ЗапросHTTP.УстановитьТелоИзСтроки(СтрокаJSON); + + Попытка + Ответ = СоединениеHTTP.ОтправитьДляОбработки(ЗапросHTTP); + Исключение + ЗаписьЖурналаРегистрации("Телеграмм.Отправка", УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки()); + Ответ = Неопределено; + КонецПопытки; + Иначе + // Запрос GET. Параметры в строке URL запроса + Если ПараметрыЗапроса.Количество() > 0 Тогда + Ресурс = Ресурс + "?"; + Для Каждого КлючИЗначение Из ПараметрыЗапроса Цикл + Ресурс = Ресурс + "&" + КлючИЗначение.Ключ + "=" + КлючИЗначение.Значение; + КонецЦикла; + КонецЕсли; + + ЗапросHTTP = Новый HTTPЗапрос(Ресурс); + ЗапросHTTP.Заголовки.Вставить("Content-type", "keep-alive"); + Попытка + Ответ = СоединениеHTTP.Получить(ЗапросHTTP); + Исключение + Ответ = Неопределено; + КонецПопытки; + КонецЕсли; + + ОтветУспешен = Ответ <> Неопределено И (Ответ.КодСостояния = 200 ИЛИ Ответ.КодСостояния = 300); + + Если НЕ ЕстьПрокси Тогда + Прервать; // Ответ получен успешный или нет + КонецЕсли; + + Если ОтветУспешен Тогда + ОтветСтрокаJSON = Ответ.ПолучитьТелоКакСтроку(); + // прокси может уже не работать, или внесен в гос реестр + Если СтрНайти(НРег(ОтветСтрокаJSON), "") = 0 Тогда + // Прокси успешно отработал + НастройкиПрокси = НастройкиБота.Прокси[НастройкиБота.ТекущийПрокси]; + РегистрыСведений.узПроксиСерверы.ИзменитьОценкуРаботоспособностиПроксиСервера(НастройкиПрокси.Адрес, НастройкиПрокси.Порт, 1); + Прервать; + КонецЕсли; + КонецЕсли; + + // Прокси не отработал + НастройкиПрокси = НастройкиБота.Прокси[НастройкиБота.ТекущийПрокси]; + РегистрыСведений.узПроксиСерверы.ИзменитьОценкуРаботоспособностиПроксиСервера(НастройкиПрокси.Адрес, НастройкиПрокси.Порт, -1); + + // Переход к следующему прокси + Если НастройкиБота.ТекущийПрокси + 1 = НастройкиБота.Прокси.Количество() Тогда + // Закончились рабочие прокси + НастройкиБота.ТекущийПрокси = 0; + ОтветУспешен = Ложь; + Ответ = Неопределено; + Прервать; + КонецЕсли; + НастройкиБота.ТекущийПрокси = НастройкиБота.ТекущийПрокси + 1; + КонецЦикла; + + Возврат ОтветУспешен; + +КонецФункции + +#КонецОбласти + +// #240 Пиганов Г.В. 2020-09-08 +// Создает новое HTTPСоединение для бота телеграмм с учетом выбранного прокси +// +// Параметры: +// НастройкиБота - Структура - структура настроек бота +// * ТекущийПрокси - Строка,Неопределено - если Неопределено, то прокси не используется, +// иначе индекс прокси в массиве НастройкиБота.Прокси +// * Прокси - Массив структур - Необязательный. Массив настроек доступных прокси +// ** Адрес - Строка - Адрес прокси +// ** Порт - Число - Порт прокси +// ** Логин - Строка - Логи прокси +// ** Пароль - Строка - Пароль прокси +// +// Возвращаемое значение: +// HTTPСоединение - созданное соединение +// +Функция НовоеСоединениеHTTP(НастройкиБота) + + Если НастройкиБота.ТекущийПрокси = Неопределено Тогда + ИнтернетПрокси = Неопределено; + Иначе + НастройкиПрокси = НастройкиБота.Прокси[НастройкиБота.ТекущийПрокси]; + ИнтернетПрокси = Новый ИнтернетПрокси(Ложь); + ИнтернетПрокси.Установить("https", НастройкиПрокси.Адрес, НастройкиПрокси.Порт, НастройкиПрокси.Логин, НастройкиПрокси.Пароль, Ложь); + КонецЕсли; + Соединение = Новый HTTPСоединение("api.telegram.org", 443,,, ИнтернетПрокси, 30, Новый ЗащищенноеСоединениеOpenSSL()); + + Возврат Соединение; + +КонецФункции + +// #240 Пиганов Г.В. 2020-09-08 +// Используется в регламентном задании для получения и обработки сообщений +// +Процедура РегламентноеПолучениеИОбработкаСообщений() Экспорт + + НастройкиБота = НастройкиБота(); + + Сообщения = ПолучитьНовыеСообщения(); + Для Каждого Сообщение Из Сообщения Цикл + узТелеграмБотКоманды.ОбработатьКомандыСообщения(НастройкиБота, Сообщение); + КонецЦикла; + +КонецПроцедуры + +// #240 Пиганов Г.В. 2020-09-08 +// Возвращает таблицу пользователей, у которых заполнен идентификатор пользователя телеграмм +// +// Возвращаемое значение: +// ТаблицаЗначений - Таблица пользователей +// * ПользовательИД - Строка - идентификатор пользователя телеграмм +// * Ссылка - СправочникСсылка.Пользователи - ссылка на пользователя +// +Функция ВсеПользователиТелеграмм() + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | Пользователи.узИДПользователяТелеграмм КАК ПользовательИД, + | МАКСИМУМ(Пользователи.Ссылка) КАК Ссылка + |ИЗ + | Справочник.Пользователи КАК Пользователи + |ГДЕ + | Пользователи.узИДПользователяТелеграмм <> 0 + | + |СГРУППИРОВАТЬ ПО + | Пользователи.узИДПользователяТелеграмм"; + Возврат Запрос.Выполнить().Выгрузить(); + +КонецФункции + +// #240 Пиганов Г.В. 2020-09-08 +// Возвращает выборку из запроса с пользователями с учетом отбора, для которых разрешена +// отправка сообщений в телеграмм и у которых заполнен идентификатор пользователя телеграмм +// +// Параметры: +// Пользователи - Массив, СправочникСсылка.Пользователь - массив или один пользователь +// +// Возвращаемое значение: +// ВыборкаИзРезультатаЗапроса - выборка пользователей +// * Пользователь - СправочникСсылка.Пользователь - Ссылка на пользователя +// * ПользовательИД - идентификатор пользователя телеграмм +// +Функция ВыборкаПользователейТелеграмДляОтправки(Пользователи) + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | Пользователи.Ссылка КАК Пользователь, + | Пользователи.узИДПользователяТелеграмм КАК ПользовательИД + |ИЗ + | Справочник.Пользователи КАК Пользователи + |ГДЕ + | Пользователи.Ссылка В(&Пользователи) + | И Пользователи.узИспользоватьРассылкуЧерезТелеграмм + | И Пользователи.узИДПользователяТелеграмм <> 0"; + Запрос.УстановитьПараметр("Пользователи", Пользователи); + + Возврат Запрос.Выполнить().Выбрать(); + +КонецФункции + +// #240 Пиганов Г.В. 2020-09-08 +// Преобразует строку JSON в соответствие типовым сериализатором 1С +// +// Параметры: +// СтрокаJSON - Строка - строка JSON для преобразования +// +// Возвращаемое значение: +// Соответствие - результат преобразования +// +Функция СоответствиеИзСтрокиJSON(СтрокаJSON) Экспорт + + ЧтениеJSON = Новый ЧтениеJSON; + ЧтениеJSON.УстановитьСтроку(СтрокаJSON); + ОтветСоответствие = ПрочитатьJSON(ЧтениеJSON, Истина); + ЧтениеJSON.Закрыть(); + + Возврат ОтветСоответствие; + +КонецФункции + +// #240 Пиганов Г.В. 2020-09-08 +// Преобразует соответствие в строку JSON типовым сериализатором 1С +// +// Параметры: +// СоответствиеДанных - Соответствие - данные для преобразования +// +// Возвращаемое значение: +// Строка - результат преобразования +// +Функция СтрокаJSONИзСоответствия(СоответствиеДанных) Экспорт + + ПараметрыЗаписиJSON = Новый ПараметрыЗаписиJSON; + ЗаписьJSON = Новый ЗаписьJSON; + ЗаписьJSON.УстановитьСтроку(ПараметрыЗаписиJSON); + ЗаписатьJSON(ЗаписьJSON, СоответствиеДанных); + Возврат ЗаписьJSON.Закрыть(); + +КонецФункции diff --git a/src/cf/CommonModules/узТелеграмБотКоманды.xml b/src/cf/CommonModules/узТелеграмБотКоманды.xml new file mode 100644 index 000000000..62365829b --- /dev/null +++ b/src/cf/CommonModules/узТелеграмБотКоманды.xml @@ -0,0 +1,23 @@ + + + + + узТелеграмБотКоманды + + + ru + уз телеграм бот правила + + + + false + false + true + false + false + false + false + DontUse + + + \ No newline at end of file diff --git a/src/cf/CommonModules/узТелеграмБотКоманды/Ext/Module.bsl b/src/cf/CommonModules/узТелеграмБотКоманды/Ext/Module.bsl new file mode 100644 index 000000000..f38dc85c3 --- /dev/null +++ b/src/cf/CommonModules/узТелеграмБотКоманды/Ext/Module.bsl @@ -0,0 +1,332 @@ + +// #240 Пиганов Г.В. 2020-09-08 +// Обрабатывает команды в переданном сообщении +// +// Параметры: +// Текст - Строка - Текст или заголовок сообшения. Может быть изменен при обработке +// Обработано - Булево - Признак обработки команды. Имеет смысл при обработке +// команд в расширении до стандартных комманд +// ДатаУниверсальная - Дата и время - дата сообщения (UTC+0:00) +// Дата - Дата и время - Дата сообщения в текущем часовом поясе сеанса +// Пользователь - СправочникСсылка.Пользователи - Ссылка на пользователя +// ПользовательИД - Строка- ИД пользователя телеграмм +// ПользовательИмя - Строка - имя пользователя телеграмм +// ПользовательНаименование - Строка - представление пользователя телеграмм +// Номер - Строка - номер текущего сообщения в чате телеграмм +// Файлы - Массив структур - массив файлов или фото в сообщении +// * ИД - Строка - идентификатор файла в телеграмм. Для получения файла через узТелеграммБот.ПолучитьФайл() +// * Имя - Строка - имя файла с расширением. Для фото не заполнено +// +// Возвращаемое значение: +// Булево - Истина, если команда обработана +// +Процедура ОбработатьКомандыСообщения(Сообщение) Экспорт + + НастройкиБота = Неопределено; // Для сохранения настроек при необходимости + + Если ПроверитьСправка(Сообщение) Тогда + Возврат; + КонецЕсли; + Если НЕ ЗначениеЗаполнено(Сообщение.Пользователь) Тогда + Возврат; // Неизвестный пользователь + КонецЕсли; + + Если ПроверитьНовоеДело(Сообщение) + ИЛИ ПроверитьНовыйВопрос(Сообщение) Тогда + Возврат; + КонецЕсли; + + // Команды связанные с указанной задачей в начале сообщения + ЗадачаСсылка = Неопределено; + Если НачинаетсяСНомераЗадачи(Сообщение, ЗадачаСсылка) Тогда + Если ПроверитьНовыйФайл(Сообщение, ЗадачаСсылка, НастройкиБота) + ИЛИ ПроверитьНовуюЗадачу(Сообщение, ЗадачаСсылка) + ИЛИ ПроверитьНовыйВопрос(Сообщение, ЗадачаСсылка) + ИЛИ ПроверитьНовыйКомментарий(Сообщение, ЗадачаСсылка) Тогда + Возврат; + КонецЕсли; + КонецЕсли; + + ПроверитьНовуюЗадачу(Сообщение); + +КонецПроцедуры + +// #247 Пиганов Г.В. 2020-09-10 +// Возвращает доступные команды. Может быть переопределена в расширении +// +Функция ДоступныеКоманды() + + ДоступныеКоманды = Новый Массив; + ДоступныеКоманды.Добавить("!ТекстОписания - новое дело"); + ДоступныеКоманды.Добавить("?ТекстОписания - новый вопрос"); + ДоступныеКоманды.Добавить("#ТекстОписания - новая задача"); + ДоступныеКоманды.Добавить("#НомерЗадачи ТекстКомментария - новый комментарий к задаче"); + ДоступныеКоманды.Добавить("#НомерЗадачи ?ТекстВопроса - новый вопрос к задаче"); + ДоступныеКоманды.Добавить("#НомерЗадачи #ТекстОписания - новая подзадача к задаче"); + ДоступныеКоманды.Добавить("#НомерЗадачи в заголовке файла/фото - новай файл к задаче"); + + Возврат ДоступныеКоманды; + +КонецФункции + +// #247 Пиганов Г.В. 2020-09-10 +Функция ПроверитьСправка(Сообщение) + + Если Сообщение.Обработано Тогда + Возврат Истина; + КонецЕсли; + + Если СокрП(Сообщение.Текст) <> "/help" Тогда + Возврат Ложь; + КонецЕсли; + + //Справка - "/help" + ТекстСообщения = "Доступные команды:"; + Для Каждого ОписаниеКоманды Из ДоступныеКоманды() Цикл + ТекстСообщения = ТекстСообщения + Символы.ПС + ОписаниеКоманды; + КонецЦикла; + узТелеграмБот.ОтправитьСообщение(ТекстСообщения, Сообщение.Пользователь); + + Сообщение.Обработано = Истина; + + Возврат Истина; + +КонецФункции + +// #240 Пиганов Г.В. 2020-09-08 +Функция ПроверитьНовоеДело(Сообщение) + + Если Сообщение.Обработано Тогда + Возврат Истина; + КонецЕсли; + + //НовоеДело - "!ТекстОписания" + + Если СтрНачинаетсяС(Сообщение.Текст, "!") Тогда + Сообщение.Текст = СокрЛ(Сред(Сообщение.Текст, 2)); + Иначе + Возврат Ложь; + КонецЕсли; + + ТекущиеДелаОбъект = Справочники.узТекущиеДела.СоздатьЭлемент(); + ТекущиеДелаОбъект.Автор = Сообщение.Пользователь; + ТекущиеДелаОбъект.ТекстСодержания = СокрЛ(Сообщение.Текст); + ТекущиеДелаОбъект.Записать(); + + Возврат Истина; + +Конецфункции + +// #240 Пиганов Г.В. 2020-09-08 +Функция ПроверитьНовыйВопрос(Сообщение, ЗадачаСсылка = Неопределено) + + Если Сообщение.Обработано Тогда + Возврат Истина; + КонецЕсли; + + //НовыйВопрос - "?ТекстВопроса" + //НовыйВопросКЗадаче - "#НомерЗадачи ?ТекстВопроса" + + Если СтрНачинаетсяС(Сообщение.Текст, "?") Тогда + Сообщение.Текст = СокрЛ(Сред(Сообщение.Текст, 2)); + Иначе + Возврат Ложь; + КонецЕсли; + + // Новый вопрос + ВопросОбъект = Справочники.узВопросыОтветы.СоздатьЭлемент(); + ВопросОбъект.Задача = ЗадачаСсылка; + ВопросОбъект.Автор = Сообщение.Пользователь; + ВопросОбъект.Вопрос = Сообщение.Текст; + ВопросОбъект.ДатаСоздания = Сообщение.Дата; + ВопросОбъект.Наименование = Сообщение.Текст; + ВопросОбъект.Записать(); + + Возврат Истина; + +КонецФункции + +// #240 Пиганов Г.В. 2020-09-08 +Функция ПроверитьНовыйФайл(Сообщение, ЗадачаСсылка, НастройкиБота = Неопределено) + + Если Сообщение.Обработано Тогда + Возврат Истина; + КонецЕсли; + + Если Сообщение.Файлы.Количество() = 0 Тогда + Возврат Ложь; + КонецЕсли; + + Если НастройкиБота = Неопределено Тогда + НастройкиБота = узТелеграмБот.НастройкиБота(); + КонецЕсли; + + Для Каждого ДанныеФайла Из Сообщение.Файлы Цикл + АдресФайла = узТелеграмБот.ПолучитьФайл(ДанныеФайла.ИД, НастройкиБота); + Если АдресФайла <> Неопределено Тогда + + Если ПустаяСтрока(ДанныеФайла.Имя) Тогда + // Картинка добавленная как фото не имеет имени + ИмяБезРасширения = СтрЗаменить(Новый УникальныйИдентификатор(), "-", ""); + Картинка = Новый Картинка(ПолучитьИзВременногоХранилища(АдресФайла)); + КартинкаФормат = Картинка.Формат(); + Если КартинкаФормат = ФорматКартинки.PNG Тогда + РасширениеБезТочки = "png"; + ИначеЕсли КартинкаФормат = ФорматКартинки.GIF Тогда + РасширениеБезТочки = "gif"; + ИначеЕсли КартинкаФормат = ФорматКартинки.JPEG Тогда + РасширениеБезТочки = "jpeg"; + ИначеЕсли КартинкаФормат = ФорматКартинки.SVG Тогда + РасширениеБезТочки = "svg"; + ИначеЕсли КартинкаФормат = ФорматКартинки.TIFF Тогда + РасширениеБезТочки = "tiff"; + Иначе + РасширениеБезТочки = ""; + КонецЕсли; + Иначе + // Файл добавленный как документ + ПозТочки = СтрНайти(ДанныеФайла.Имя, ".", НаправлениеПоиска.СКонца); + Если ПозТочки = 0 Тогда + ИмяБезРасширения = Лев(ДанныеФайла.Имя, ПозТочки - 1); + РасширениеБезТочки = Сред(ДанныеФайла.Имя, ПозТочки + 1); + Иначе + ИмяБезРасширения = ДанныеФайла.Имя; + РасширениеБезТочки = ""; + КонецЕсли; + КонецЕсли; + + ПараметрыФайла = Новый Структура; + ПараметрыФайла.Вставить("Автор", Сообщение.Пользователь); + ПараметрыФайла.Вставить("ВладелецФайлов", ЗадачаСсылка); + ПараметрыФайла.Вставить("ВремяИзмененияУниверсальное", Сообщение.ДатаУниверсальная); + ПараметрыФайла.Вставить("ИмяБезРасширения", ИмяБезРасширения); + ПараметрыФайла.Вставить("РасширениеБезТочки", РасширениеБезТочки); + РаботаСФайлами.ДобавитьФайл(ПараметрыФайла, АдресФайла); + КонецЕсли; + КонецЦикла; + + Сообщение.Обработано = Истина; + + Возврат Истина; + +КонецФункции + +// #240 Пиганов Г.В. 2020-09-08 +Функция ПроверитьНовуюЗадачу(Сообщение, ЗадачаСсылка = Неопределено) + + //НоваяЗадача - "#ТекстОписания" + //НоваяПодзадача - "#НомерЗадачи #ТекстОписания" + + Если Сообщение.Обработано Тогда + Возврат Истина; + КонецЕсли; + + Если СтрНачинаетсяС(Сообщение.Текст, "#") Тогда + Сообщение.Текст = СокрЛ(Сред(Сообщение.Текст, 2)); + //ИначеЕсли СтрНачинаетсяС(Сообщение.Текст, "/#") Тогда + // ТекстСообщения = Сред(Сообщение.Текст, 3); + Иначе + Возврат Ложь; + КонецЕсли; + + ЗадачаОбъект = Справочники.узЗадачи.СоздатьЭлемент(); + ЗадачаОбъект.Автор = Сообщение.Пользователь; + ЗадачаОбъект.ДатаСоздания = Сообщение.Дата; + ЗадачаОбъект.ТекстСодержания = Сообщение.Текст; + ЗадачаОбъект.Наименование = Сообщение.Текст; + ЗадачаОбъект.ОформлениеТекста = Перечисления.узОформлениеТекста.Текст; + ЗадачаОбъект.Статус = Справочники.узКонстанты.ПолучитьЗначениеКонстанты("СтатусЗадачиПоУмолчанию", Тип("СправочникСсылка.узСтатусыЗадачи"), , Ложь); + ЗадачаОбъект.Родитель = ЗадачаСсылка; + ЗадачаОбъект.Записать(); + + Сообщение.Обработано = Истина; + + Возврат Истина; + +КонецФункции + +// #240 Пиганов Г.В. 2020-09-08 +Функция ПроверитьНовыйКомментарий(Сообщение, ЗадачаСсылка) + + Если Сообщение.Обработано Тогда + Возврат Истина; + КонецЕсли; + + Если ПустаяСтрока(Сообщение.Текст) Тогда + // Пустой комментарий - был указан только номер задачи + Возврат Ложь; + КонецЕсли; + + //НовыйКомментарий - #НомерЗадачи ТекстКомментария" + + ЗадачаОбъект = ЗадачаСсылка.ПолучитьОбъект(); + + // Ключ строки нового комментария + НовыйКлючСтроки = 1; + Если ЗадачаОбъект.Комментарии.Количество() = 0 Тогда + НовыйКлючСтроки = 1; + Иначе + ТЗ = ЗадачаОбъект.Комментарии.Выгрузить(); + ТЗ.Сортировать("КлючСтроки УБЫВ"); + НовыйКлючСтроки = ТЗ[0].КлючСтроки + 1; + Конецесли; + + // Новый комментарий + СтрокаКомментария = ЗадачаОбъект.Комментарии.Добавить(); + СтрокаКомментария.КлючСтроки = НовыйКлючСтроки; + СтрокаКомментария.ДатаКомментария = Сообщение.Дата; + СтрокаКомментария.Автор = Сообщение.Пользователь; + СтрокаКомментария.Комментарий = Сообщение.Текст; + ЗадачаОбъект.Записать(); + + Сообщение.Обработано = Истина; + + Возврат Истина; + +КонецФункции + +// #240 Пиганов Г.В. 2020-09-08 +Функция НачинаетсяСНомераЗадачи(Сообщение, ЗадачаСсылка) + + ТекстСообщения = Сообщение.Текст; + + НомерЗадачи = ""; + Если Лев(ТекстСообщения, 1) = "#" Тогда + Для ПозЧисла = 2 По СтрДлина(ТекстСообщения) Цикл + КодСимволаЧисла = КодСимвола(ТекстСообщения, ПозЧисла); + Если КодСимволаЧисла < 48 ИЛИ КодСимволаЧисла > 57 Тогда // "0" - "9" + Если НЕ ПустаяСтрока(Символ(КодСимволаЧисла)) ИЛИ НомерЗадачи = "" Тогда + // Если после номера найден не пробельный символ или пробельный при + // пустом номере задачи, то сообщение начинается не с номера задачи + НомерЗадачи = ""; + ИначеЕсли ПозЧисла > 1 Тогда + // Удаление из текста сообщения номера задачи + Сообщение.Текст = СокрЛ(Сред(ТекстСообщения, ПозЧисла)); + КонецЕсли; + Прервать; + КонецЕсли; + НомерЗадачи = НомерЗадачи + Символ(КодСимволаЧисла); + КонецЦикла; + КонецЕсли; + Если НомерЗадачи = "" Тогда + Возврат Ложь; + КонецЕсли; + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | узЗадачи.Ссылка КАК Ссылка + |ИЗ + | Справочник.узЗадачи КАК узЗадачи + |ГДЕ + | узЗадачи.Код = &НомерЗадачи"; + Запрос.УстановитьПараметр("НомерЗадачи", Число(НомерЗадачи)); + + Выборка = Запрос.Выполнить().Выбрать(); + Если Выборка.Следующий() Тогда + ЗадачаСсылка = Выборка.Ссылка; + КонецЕсли; + + Возврат Истина; + +КонецФункции diff --git a/src/cf/CommonModules/узТелеграммСервер/Ext/Module.bsl b/src/cf/CommonModules/узТелеграммСервер/Ext/Module.bsl deleted file mode 100644 index 675902fce..000000000 --- a/src/cf/CommonModules/узТелеграммСервер/Ext/Module.bsl +++ /dev/null @@ -1,186 +0,0 @@ - -Функция ПолучитьМассивПолучателей(МассивПользователейКому) Экспорт - - МассивПолучателейТелеграмм = Новый Массив(); - - Для Каждого пПользователь из МассивПользователейКому Цикл - - Если НЕ пПользователь.узИспользоватьРассылкуЧерезТелеграмм Тогда - Продолжить; - Конецесли; - - Если НЕ ЗначениеЗаполнено(пПользователь.узИДПользователяТелеграмм) Тогда - Продолжить; - Конецесли; - - НастройкаТелеграмм = Новый Структура(); - НастройкаТелеграмм.Вставить("ИД",пПользователь.узИДПользователяТелеграмм); - НастройкаТелеграмм.Вставить("узИДПользователяТелеграмм",пПользователь.узИДПользователяТелеграмм); - НастройкаТелеграмм.Вставить("Пользователь",пПользователь); - - МассивПолучателейТелеграмм.Добавить(НастройкаТелеграмм); - - КонецЦикла; - - Возврат МассивПолучателейТелеграмм; - -КонецФункции - -Процедура ВыполнитьРассылку(ДопПараметры) Экспорт - - ТокенБота = Константы.узТелеграмм_ТокенБота.Получить(); - Если Не ЗначениеЗаполнено(ТокенБота) Тогда - Возврат; - КонецЕсли; - - Если НЕ ДопПараметры.Свойство("МассивПользователейКому") Тогда - Если ДопПараметры.Свойство("ПользовательКому") Тогда - МассивПользователейКому = Новый Массив(); - МассивПользователейКому.Добавить(ДопПараметры.ПользовательКому); - ДопПараметры.Вставить("МассивПользователейКому",МассивПользователейКому); - Конецесли; - Конецесли; - - МассивПользователейДляОтправки = ПолучитьМассивПолучателей(ДопПараметры.МассивПользователейКому); - - Если МассивПользователейДляОтправки.Количество() = 0 Тогда - Возврат; - КонецЕсли; - - - // +++ Григорьев 12.12.2018 - //ТекстПисьма = СтрЗаменить(ДопПараметры.ТекстПисьма, "#", ""); - ТекстПисьма = ЗаменитьЗарезервированныеСимволы(ДопПараметры.ТекстПисьма); - // --- Григорьев 12.12.2018 - - ВТДопПараметры = Новый Структура(); - Для каждого ЭлДопПараметры из ДопПараметры Цикл - ВТДопПараметры.Вставить(ЭлДопПараметры.Ключ, ЭлДопПараметры.Значение); - КонецЦикла; - - ВТДопПараметры.Вставить("МассивПользователейДляОтправки",МассивПользователейДляОтправки); - ВТДопПараметры.Вставить("ТекстПисьма",ТекстПисьма); - ВТДопПараметры.Вставить("ТокенБота",ТокенБота); - - ИспользоватьПроксиДляОтправки = Справочники.узКонстанты.ПолучитьЗначениеКонстанты( - "ТелеграммИспользоватьПроксиДляОтправки",Тип("Булево"),Ложь,Истина,Истина); - - Если ИспользоватьПроксиДляОтправки Тогда - ВыполнитьРассылку_ЧерезПрокси(ВТДопПараметры); - Иначе - ВыполнитьРассылку_БезПрокси(ВТДопПараметры); - Конецесли; - -КонецПроцедуры - -Процедура ВыполнитьРассылку_ЧерезПрокси(ДопПараметры) - - МассивПользователейДляОтправки = ДопПараметры.МассивПользователейДляОтправки; - ТекстПисьма = ДопПараметры.ТекстПисьма; - ТемаПисьма = ДопПараметры.ТемаПисьма; - - пОбработка = Обработки.узРаботаСТелеграм.Создать(); - пОбработка.ОтправитьСообщениеTelegram(ТекстПисьма, МассивПользователейДляОтправки); - -КонецПроцедуры - -Процедура ВыполнитьРассылку_БезПрокси(ДопПараметры) - - МассивПользователейДляОтправки = ДопПараметры.МассивПользователейДляОтправки; - ТекстПисьма = ДопПараметры.ТекстПисьма; - ТемаПисьма = ДопПараметры.ТемаПисьма; - ТокенБота = ДопПараметры.ТокенБота; - - Для Каждого элемПолучатель Из МассивПользователейДляОтправки Цикл - - Ресурс = "bot" + ТокенБота + "/sendMessage?chat_id=" + Формат(элемПолучатель.ИД, "ЧГ=") + "&text=" + ТекстПисьма+"&parse_mode=Markdown&disable_web_page_preview=true"; - //Ресурс = "bot" + ТокенБота + "/sendMessage?chat_id=" + Формат(элемПолучатель.ИД, "ЧГ=") + "&text=" + ТекстПисьма+"&disable_web_page_preview=true"; - Соединение = Новый HTTPСоединение("api.telegram.org", 443,,,,30,Новый ЗащищенноеСоединениеOpenSSL()); - ЗапросHTTP = Новый HTTPЗапрос(Ресурс); - Ответ = Соединение.Получить(ЗапросHTTP); - - Если Не Ответ.КодСостояния = 200 Тогда - ЗаписьЖурналаРегистрации("Телеграмм.Отправка", УровеньЖурналаРегистрации.Ошибка,, - , "Не смогли отправить пользователю <"+элемПолучатель.ИД+":"+элемПолучатель.Пользователь+">"); - КонецЕсли; - - КонецЦикла; - -КонецПроцедуры // +++ Григорьев 12.12.2018 - -//////////////////////////////////////////////////////////////////////////////// -// -// Функция ЗаменитьЗарезервированныеСимволы -// -// Описание: -// Выполняет замену основных зарезервированных символов для протокола URL -// -// Параметры: -// ОбрабатываемаяСтрока - <Тип.Строка> - исходная строка для обработки -// -// Возвращаемое значение: -// Результат - <Тип.Строка> - обработанная строка -// -Функция ЗаменитьЗарезервированныеСимволы(ОбрабатываемаяСтрока = Неопределено) Экспорт - Если ОбрабатываемаяСтрока = Неопределено или НЕ ЗначениеЗаполнено(ОбрабатываемаяСтрока) Тогда - Возврат ОбрабатываемаяСтрока; - КонецЕсли; - - пТелеграммИспользоватьЗаменуСимволовВДругуюКодировку = Справочники.узКонстанты.ПолучитьЗначениеКонстанты( - "ТелеграммИспользоватьЗаменуСимволовВДругуюКодировку",Тип("Булево"),,Истина,Истина); - - Если пТелеграммИспользоватьЗаменуСимволовВДругуюКодировку Тогда - ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(37),"%25"); // "%" - ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(33),"%21"); // "!" - ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(34),"%22"); // """ (кавычка) - ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(35),"%23"); // "#" - ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(36),"%24"); // "$" - ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(38),"%26"); // "&" - ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(39),"%27"); // "'" - ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(42),"%2A"); // "*" - ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(44),"%2C"); // "," - ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(58),"%3A"); // ":" - ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(59),"%3B"); // ";" - ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(60),"%3C"); // "<" - ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(61),"%3D"); // "=" - ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(62),"%3E"); // ">" - ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(63),"%3F"); // "?" - ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(91),"%5B"); // "[" - ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(93),"%5D"); // "]" - ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(94),"%5E"); // "^" - ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(96),"%60"); // "`" - ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(123),"%7B"); // "{" - ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(124),"%7C"); // "|" - ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(125),"%7D"); // "}" - ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(32),"%20"); // " " (пробел) - Иначе - ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%25",Символ(37) ); // "%" - ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%21",Символ(33) ); // "!" - ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%22",Символ(34) ); // """ (кавычка) - ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%23",Символ(35) ); // "#" - ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%24",Символ(36) ); // "$" - ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%26",Символ(38) ); // "&" - ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%27",Символ(39) ); // "'" - ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%2A",Символ(42) ); // "*" - ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%2C",Символ(44) ); // "," - ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%3A",Символ(58) ); // ":" - ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%3B",Символ(59) ); // ";" - ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%3C",Символ(60) ); // "<" - ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%3D",Символ(61) ); // "=" - ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%3E",Символ(62) ); // ">" - ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%3F",Символ(63) ); // "?" - ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%5B",Символ(91) ); // "[" - ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%5D",Символ(93) ); // "]" - ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%5E",Символ(94) ); // "^" - ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%60",Символ(96) ); // "`" - ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%7B",Символ(123)); // "{" - ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%7C",Символ(124)); // "|" - ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%7D",Символ(125)); // "}" - ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%20",Символ(32) ); // " " (пробел) - Конецесли; - - Возврат ОбрабатываемаяСтрока; -КонецФункции //ЗаменитьЗарезервированныеСимволы // --- Григорьев 12.12.2018 - - - diff --git a/src/cf/Configuration.xml b/src/cf/Configuration.xml index fbdde5efe..782063788 100644 --- a/src/cf/Configuration.xml +++ b/src/cf/Configuration.xml @@ -1005,8 +1005,9 @@ узОбновлениеИнформационнойБазы узОбщийМодульКлиент узОбщийМодульСервер - узТелеграммСервер узРаботаСБуферомОбменаКлиент + узТелеграмБот + узТелеграмБотКоманды ОбновлениеИнформационнойБазы ApplicationExtensionsManifest_1_0_0_1 EnterpriseData_1_2_3 @@ -1138,6 +1139,7 @@ узСозданиеТекущихДелПоРегламенту узФормированиеФайлаЛистаЗадач УстановкаПериодаРассчитанныхИтогов + узПолучениеИОбработкаСообщенийТелеграммБота ХранилищеВариантовОтчетов АктуальнаяДатаОбновленияПовторноИспользуемыхЗначенийМРО ВариантыВерсионированияОбъектов diff --git a/src/cf/DataProcessors/узРаботаСТелеграм/Ext/ObjectModule.bsl b/src/cf/DataProcessors/узРаботаСТелеграм/Ext/ObjectModule.bsl index 1ef0a942e..8db909bbf 100644 --- a/src/cf/DataProcessors/узРаботаСТелеграм/Ext/ObjectModule.bsl +++ b/src/cf/DataProcessors/узРаботаСТелеграм/Ext/ObjectModule.bsl @@ -1,401 +1,402 @@  -Функция ПолучитьНастройкиДляРаботыСТелеграм() - - пНастройкиДляРаботыСТелеграм = Новый Структура; - - //ТокенТелеграмБота = Справочники.узКонстанты.ПолучитьЗначениеКонстанты("ТокенТелеграмБота", - // Тип("Строка"),,Ложь); - //Если Не ЗначениеЗаполнено(ТокенТелеграмБота) Тогда - // Возврат; - //КонецЕсли; - - пВсеНастройкиПолучены = Истина; - пТокенТелеграмБота = Константы.узТелеграмм_ТокенБота.Получить(); - Если Не ЗначениеЗаполнено(пТокенТелеграмБота) Тогда - пВсеНастройкиПолучены = Ложь; - КонецЕсли; +// #240 Пиганов Г.В. 2020-09-08 +//Функция ПолучитьНастройкиДляРаботыСТелеграм() +// +// пНастройкиДляРаботыСТелеграм = Новый Структура; +// +// //ТокенТелеграмБота = Справочники.узКонстанты.ПолучитьЗначениеКонстанты("ТокенТелеграмБота", +// // Тип("Строка"),,Ложь); +// //Если Не ЗначениеЗаполнено(ТокенТелеграмБота) Тогда +// // Возврат; +// //КонецЕсли; +// +// пВсеНастройкиПолучены = Истина; +// пТокенТелеграмБота = Константы.узТелеграмм_ТокенБота.Получить(); +// Если Не ЗначениеЗаполнено(пТокенТелеграмБота) Тогда +// пВсеНастройкиПолучены = Ложь; +// КонецЕсли; - - пМассивНастроекПроксиСерверов = РегистрыСведений.узПроксиСерверы.ПолучитьМассивНастроекПроксиСерверов(); - пМассивНастроекПроксиСерверовКоличество = пМассивНастроекПроксиСерверов.Количество(); - // + #232 Ruflex @RomanUpworksTeam - //Если пМассивНастроекПроксиСерверовКоличество = 0 Тогда - // пВсеНастройкиПолучены = Ложь; - //КонецЕсли; - // - #232 Ruflex @RomanUpworksTeam - - пНастройкиДляРаботыСТелеграм.Вставить("ТокенТелеграмБота", пТокенТелеграмБота); - пНастройкиДляРаботыСТелеграм.Вставить("МассивНастроекПроксиСерверов", пМассивНастроекПроксиСерверов); - пНастройкиДляРаботыСТелеграм.Вставить("НомерТекущейНастройкиПрокси", 0); - пНастройкиДляРаботыСТелеграм.Вставить("ВсеНастройкиПолучены", пВсеНастройкиПолучены); - Если пВсеНастройкиПолучены = Ложь Тогда - ЗаписьЖурналаРегистрации("Телеграмм.Настройки", УровеньЖурналаРегистрации.Ошибка,, - , "Не смогли получить настройки телеграм"); +// +// пМассивНастроекПроксиСерверов = РегистрыСведений.узПроксиСерверы.ПолучитьМассивНастроекПроксиСерверов(); +// пМассивНастроекПроксиСерверовКоличество = пМассивНастроекПроксиСерверов.Количество(); +// // + #232 Ruflex @RomanUpworksTeam +// //Если пМассивНастроекПроксиСерверовКоличество = 0 Тогда +// // пВсеНастройкиПолучены = Ложь; +// //КонецЕсли; +// // - #232 Ruflex @RomanUpworksTeam +// +// пНастройкиДляРаботыСТелеграм.Вставить("ТокенТелеграмБота", пТокенТелеграмБота); +// пНастройкиДляРаботыСТелеграм.Вставить("МассивНастроекПроксиСерверов", пМассивНастроекПроксиСерверов); +// пНастройкиДляРаботыСТелеграм.Вставить("НомерТекущейНастройкиПрокси", 0); +// пНастройкиДляРаботыСТелеграм.Вставить("ВсеНастройкиПолучены", пВсеНастройкиПолучены); +// Если пВсеНастройкиПолучены = Ложь Тогда +// ЗаписьЖурналаРегистрации("Телеграмм.Настройки", УровеньЖурналаРегистрации.Ошибка,, +// , "Не смогли получить настройки телеграм"); - КонецЕсли; - - Возврат пНастройкиДляРаботыСТелеграм; - -КонецФункции +// КонецЕсли; +// +// Возврат пНастройкиДляРаботыСТелеграм; +// +//КонецФункции -Процедура ПрочитатьСообщенияTelegram() Экспорт - - НастройкиДляРаботыСТелеграм = ПолучитьНастройкиДляРаботыСТелеграм(); - Если НастройкиДляРаботыСТелеграм.ВсеНастройкиПолучены = Ложь Тогда - Возврат; - КонецЕсли; - - Если ЗначениеЗаполнено(MaxMessangeID) Тогда - ИДПоследнегоПринятогоСообщения = MaxMessangeID; - Иначе - ИДПоследнегоПринятогоСообщения = Справочники.узКонстанты.ПолучитьЗначениеКонстанты("ТелеграмMaxMessangeID", Тип("Строка"),,Ложь); - КонецЕсли; - - - Ресурс = "bot" + НастройкиДляРаботыСТелеграм.ТокенТелеграмБота + "/getUpdates" + ?(ЗначениеЗаполнено(ИДПоследнегоПринятогоСообщения), "?offset=" + ИДПоследнегоПринятогоСообщения, ""); - ЗапросHTTP = Новый HTTPЗапрос(Ресурс); - ЗапросHTTP.Заголовки.Вставить("Content-type", "keep-alive"); - - Ответ = Неопределено; - ВыполнитьЗапросHTTP_Telegram(Ответ, - ЗапросHTTP, - НастройкиДляРаботыСТелеграм.МассивНастроекПроксиСерверов, - НастройкиДляРаботыСТелеграм.НомерТекущейНастройкиПрокси, - Истина); - - Если Ответ = Неопределено - Или Ответ.КодСостояния < 200 - Или Ответ.КодСостояния >= 300 Тогда +//Процедура ПрочитатьСообщенияTelegram() Экспорт +// +// НастройкиДляРаботыСТелеграм = ПолучитьНастройкиДляРаботыСТелеграм(); +// Если НастройкиДляРаботыСТелеграм.ВсеНастройкиПолучены = Ложь Тогда +// Возврат; +// КонецЕсли; +// +// Если ЗначениеЗаполнено(MaxMessangeID) Тогда +// ИДПоследнегоПринятогоСообщения = MaxMessangeID; +// Иначе +// ИДПоследнегоПринятогоСообщения = Справочники.узКонстанты.ПолучитьЗначениеКонстанты("ТелеграмMaxMessangeID", Тип("Строка"),,Ложь); +// КонецЕсли; +// +// +// Ресурс = "bot" + НастройкиДляРаботыСТелеграм.ТокенТелеграмБота + "/getUpdates" + ?(ЗначениеЗаполнено(ИДПоследнегоПринятогоСообщения), "?offset=" + ИДПоследнегоПринятогоСообщения, ""); +// ЗапросHTTP = Новый HTTPЗапрос(Ресурс); +// ЗапросHTTP.Заголовки.Вставить("Content-type", "keep-alive"); +// +// Ответ = Неопределено; +// ВыполнитьЗапросHTTP_Telegram(Ответ, +// ЗапросHTTP, +// НастройкиДляРаботыСТелеграм.МассивНастроекПроксиСерверов, +// НастройкиДляРаботыСТелеграм.НомерТекущейНастройкиПрокси, +// Истина); +// +// Если Ответ = Неопределено +// Или Ответ.КодСостояния < 200 +// Или Ответ.КодСостояния >= 300 Тогда - ЗаписьЖурналаРегистрации("Телеграм.ПолучениеСообщений", УровеньЖурналаРегистрации.Ошибка,, - , "Не смогли получить сообщения телеграм"); - Возврат; - КонецЕсли; +// ЗаписьЖурналаРегистрации("Телеграм.ПолучениеСообщений", УровеньЖурналаРегистрации.Ошибка,, +// , "Не смогли получить сообщения телеграм"); +// Возврат; +// КонецЕсли; - - ОтветСтрокаJSON = Ответ.ПолучитьТелоКакСтроку(); - HTTPОтвет = ОтветСтрокаJSON; - пЧтениеJSON = Новый ЧтениеJSON; - пЧтениеJSON.УстановитьСтроку(ОтветСтрокаJSON); - ОтветСоответсвие = ПрочитатьJSON(пЧтениеJSON, Истина);//(пЧтениеJSON, Ложь, , , "ФункцияВосстановленияJSON", ЭтотОбъект); - пЧтениеJSON.Закрыть(); - - Если ОтветСоответсвие["ok"] <> Истина Тогда - Возврат; - КонецЕсли; - - МассивResult = ОтветСоответсвие["result"]; - ИДПоследнегоПринятогоСообщения = Неопределено; +// +// ОтветСтрокаJSON = Ответ.ПолучитьТелоКакСтроку(); +// HTTPОтвет = ОтветСтрокаJSON; +// пЧтениеJSON = Новый ЧтениеJSON; +// пЧтениеJSON.УстановитьСтроку(ОтветСтрокаJSON); +// ОтветСоответсвие = ПрочитатьJSON(пЧтениеJSON, Истина);//(пЧтениеJSON, Ложь, , , "ФункцияВосстановленияJSON", ЭтотОбъект); +// пЧтениеJSON.Закрыть(); +// +// Если ОтветСоответсвие["ok"] <> Истина Тогда +// Возврат; +// КонецЕсли; +// +// МассивResult = ОтветСоответсвие["result"]; +// ИДПоследнегоПринятогоСообщения = Неопределено; - ТЗПользователиТелеграмм = ПолучитьТЗПользователиТелеграмм(); - - Для Каждого СоответсвиеMessange Из МассивResult Цикл - - ИДПоследнегоПринятогоСообщения = Формат(СоответсвиеMessange["update_id"] + 1, "ЧГ="); - СоответсвиеMessange_message = СоответсвиеMessange.Получить("message"); - Если СоответсвиеMessange_message = Неопределено Тогда - Продолжить; - КонецЕсли; - ДатаСообщения = '19700101' + СоответсвиеMessange_message["date"] +7*60*60; - СоответсвиеFrom = СоответсвиеMessange_message["from"]; - пLastName = СоответсвиеFrom["last_name"]; - пFirstName = СоответсвиеFrom["first_name"]; - пСhatИД = Формат(СоответсвиеMessange_message["chat"]["id"], "ЧГ="); - Если СоответсвиеMessange_message.Получить("text") <> Неопределено Тогда - MessageText = СоответсвиеMessange_message.Получить("text"); +// ТЗПользователиТелеграмм = ПолучитьТЗПользователиТелеграмм(); +// +// Для Каждого СоответсвиеMessange Из МассивResult Цикл +// +// ИДПоследнегоПринятогоСообщения = Формат(СоответсвиеMessange["update_id"] + 1, "ЧГ="); +// СоответсвиеMessange_message = СоответсвиеMessange.Получить("message"); +// Если СоответсвиеMessange_message = Неопределено Тогда +// Продолжить; +// КонецЕсли; +// ДатаСообщения = '19700101' + СоответсвиеMessange_message["date"] +7*60*60; +// СоответсвиеFrom = СоответсвиеMessange_message["from"]; +// пLastName = СоответсвиеFrom["last_name"]; +// пFirstName = СоответсвиеFrom["first_name"]; +// пСhatИД = Формат(СоответсвиеMessange_message["chat"]["id"], "ЧГ="); +// Если СоответсвиеMessange_message.Получить("text") <> Неопределено Тогда +// MessageText = СоответсвиеMessange_message.Получить("text"); - // + Иванов А.Б. 2020-07-11 - // Если Найти(MessageText, "/addwork") <> 0 Тогда - // Запрос = Новый Запрос; - // Запрос.Текст = - // "ВЫБРАТЬ ПЕРВЫЕ 1 - // | Пользователи.Ссылка КАК Пользователь - // |ИЗ - // | Справочник.Пользователи КАК Пользователи - // |ГДЕ - // | Пользователи.узИДПользователяТелеграмм = &узИДПользователяТелеграмм"; - // - // Запрос.УстановитьПараметр("узИДПользователяТелеграмм", Число(пСhatИД)); - // - // РезультатЗапроса = Запрос.Выполнить(); - // Если РезультатЗапроса.Пустой() Тогда - // Продолжить; - // КонецЕсли; - // - // Выборка = РезультатЗапроса.Выбрать(); - // Пока Выборка.Следующий() Цикл - // ТекущиеДелаОбъект = Справочники.узТекущиеДела.СоздатьЭлемент(); - // ТекущиеДелаОбъект.Автор = Выборка.Пользователь; - // ТекущиеДелаОбъект.ТекстСодержания = СтрЗаменить(MessageText, "/addwork", ""); - // ТекущиеДелаОбъект.Записать(); - // КонецЦикла; - // - // КонецЕсли; - - Если Найти(MessageText, "/addwork") = 0 Тогда - Продолжить; - КонецЕсли; - - пузИДПользователяТелеграмм = Число(пСhatИД); - - ПараметрыОтбора=Новый Структура(); - ПараметрыОтбора.Вставить("узИДПользователяТелеграмм",пузИДПользователяТелеграмм); - НайденныеСтроки = ТЗПользователиТелеграмм.НайтиСтроки(ПараметрыОтбора); - ВсегоНайденныеСтроки = НайденныеСтроки.Количество(); - ТекстОшибки = ""; - Если ВсегоНайденныеСтроки = 1 тогда - СтрокаТЗПользователиТелеграмм = НайденныеСтроки[0]; - ИначеЕсли ВсегоНайденныеСтроки > 1 Тогда - ТекстОшибки = "Ошибка! Найдено более 1 строки"; - Иначе - ТекстОшибки = "Ошибка! Не найдена строка"; - Конецесли; - - Если ЗначениеЗаполнено(ТекстОшибки) Тогда - ТекстОшибки = ТекстОшибки - +" в ""ТЗПользователиТелеграмм"" для "; - Для каждого ЭлементОтбора из ПараметрыОтбора цикл - ТекстОшибки = ТекстОшибки - +" "+ ЭлементОтбора.Ключ + " = ["+ЭлементОтбора.Значение+"]"; - Конеццикла; - ВызватьИсключение ТекстОшибки; - Конецесли; - - ТекущиеДелаОбъект = Справочники.узТекущиеДела.СоздатьЭлемент(); - ТекущиеДелаОбъект.Автор = СтрокаТЗПользователиТелеграмм.Пользователь; - ТекущиеДелаОбъект.ТекстСодержания = СтрЗаменить(MessageText, "/addwork", ""); - ТекущиеДелаОбъект.Записать(); - // - Иванов А.Б. 2020-07-11 - - - ИначеЕсли СоответсвиеMessange_message.Получить("photo") <> Неопределено Тогда - - КонецЕсли; - - КонецЦикла; - - - Если ЗначениеЗаполнено(ИДПоследнегоПринятогоСообщения) Тогда - Справочники.узКонстанты.УстановитьЗначениеКонстанты("ТелеграмMaxMessangeID", ИДПоследнегоПринятогоСообщения); - MaxMessangeID = ИДПоследнегоПринятогоСообщения; - КонецЕсли; - -КонецПроцедуры +// // + Иванов А.Б. 2020-07-11 +// // Если Найти(MessageText, "/addwork") <> 0 Тогда +// // Запрос = Новый Запрос; +// // Запрос.Текст = +// // "ВЫБРАТЬ ПЕРВЫЕ 1 +// // | Пользователи.Ссылка КАК Пользователь +// // |ИЗ +// // | Справочник.Пользователи КАК Пользователи +// // |ГДЕ +// // | Пользователи.узИДПользователяТелеграмм = &узИДПользователяТелеграмм"; +// // +// // Запрос.УстановитьПараметр("узИДПользователяТелеграмм", Число(пСhatИД)); +// // +// // РезультатЗапроса = Запрос.Выполнить(); +// // Если РезультатЗапроса.Пустой() Тогда +// // Продолжить; +// // КонецЕсли; +// // +// // Выборка = РезультатЗапроса.Выбрать(); +// // Пока Выборка.Следующий() Цикл +// // ТекущиеДелаОбъект = Справочники.узТекущиеДела.СоздатьЭлемент(); +// // ТекущиеДелаОбъект.Автор = Выборка.Пользователь; +// // ТекущиеДелаОбъект.ТекстСодержания = СтрЗаменить(MessageText, "/addwork", ""); +// // ТекущиеДелаОбъект.Записать(); +// // КонецЦикла; +// // +// // КонецЕсли; +// +// Если Найти(MessageText, "/addwork") = 0 Тогда +// Продолжить; +// КонецЕсли; +// +// пузИДПользователяТелеграмм = Число(пСhatИД); +// +// ПараметрыОтбора=Новый Структура(); +// ПараметрыОтбора.Вставить("узИДПользователяТелеграмм",пузИДПользователяТелеграмм); +// НайденныеСтроки = ТЗПользователиТелеграмм.НайтиСтроки(ПараметрыОтбора); +// ВсегоНайденныеСтроки = НайденныеСтроки.Количество(); +// ТекстОшибки = ""; +// Если ВсегоНайденныеСтроки = 1 тогда +// СтрокаТЗПользователиТелеграмм = НайденныеСтроки[0]; +// ИначеЕсли ВсегоНайденныеСтроки > 1 Тогда +// ТекстОшибки = "Ошибка! Найдено более 1 строки"; +// Иначе +// ТекстОшибки = "Ошибка! Не найдена строка"; +// Конецесли; +// +// Если ЗначениеЗаполнено(ТекстОшибки) Тогда +// ТекстОшибки = ТекстОшибки +// +" в ""ТЗПользователиТелеграмм"" для "; +// Для каждого ЭлементОтбора из ПараметрыОтбора цикл +// ТекстОшибки = ТекстОшибки +// +" "+ ЭлементОтбора.Ключ + " = ["+ЭлементОтбора.Значение+"]"; +// Конеццикла; +// ВызватьИсключение ТекстОшибки; +// Конецесли; +// +// ТекущиеДелаОбъект = Справочники.узТекущиеДела.СоздатьЭлемент(); +// ТекущиеДелаОбъект.Автор = СтрокаТЗПользователиТелеграмм.Пользователь; +// ТекущиеДелаОбъект.ТекстСодержания = СтрЗаменить(MessageText, "/addwork", ""); +// ТекущиеДелаОбъект.Записать(); +// // - Иванов А.Б. 2020-07-11 +// +// +// ИначеЕсли СоответсвиеMessange_message.Получить("photo") <> Неопределено Тогда +// +// КонецЕсли; +// +// КонецЦикла; +// +// +// Если ЗначениеЗаполнено(ИДПоследнегоПринятогоСообщения) Тогда +// Справочники.узКонстанты.УстановитьЗначениеКонстанты("ТелеграмMaxMessangeID", ИДПоследнегоПринятогоСообщения); +// MaxMessangeID = ИДПоследнегоПринятогоСообщения; +// КонецЕсли; +// +//КонецПроцедуры -Функция ПолучитьТЗПользователиТелеграмм() - - Запрос = Новый Запрос; - Запрос.Текст = "ВЫБРАТЬ - | МАКСИМУМ(Пользователи.Ссылка) КАК Пользователь, - | Пользователи.узИДПользователяТелеграмм КАК узИДПользователяТелеграмм - |ИЗ - | Справочник.Пользователи КАК Пользователи - |ГДЕ - | Пользователи.узИДПользователяТелеграмм <> 0 - | - |СГРУППИРОВАТЬ ПО - | Пользователи.узИДПользователяТелеграмм"; - - ТЗПользователиТелеграмм = Запрос.Выполнить().Выгрузить(); - - Возврат ТЗПользователиТелеграмм; - -КонецФункции +//Функция ПолучитьТЗПользователиТелеграмм() +// +// Запрос = Новый Запрос; +// Запрос.Текст = "ВЫБРАТЬ +// | МАКСИМУМ(Пользователи.Ссылка) КАК Пользователь, +// | Пользователи.узИДПользователяТелеграмм КАК узИДПользователяТелеграмм +// |ИЗ +// | Справочник.Пользователи КАК Пользователи +// |ГДЕ +// | Пользователи.узИДПользователяТелеграмм <> 0 +// | +// |СГРУППИРОВАТЬ ПО +// | Пользователи.узИДПользователяТелеграмм"; +// +// ТЗПользователиТелеграмм = Запрос.Выполнить().Выгрузить(); +// +// Возврат ТЗПользователиТелеграмм; +// +//КонецФункции -Процедура ОтправитьСообщениеTelegram(ТекстСообщения, МассивПользователейДляОтправки, УведомлятьОРезультате = Ложь) Экспорт - - Если МассивПользователейДляОтправки.Количество() = 0 Тогда - // ++ 79Vlad 20.06.2019 #174 \\ - Если УведомлятьОРезультате Тогда - Сообщение = Новый СообщениеПользователю; - Сообщение.Текст = "Сообщение не отправлено, т.к. не указан получатель."; - Сообщение.Сообщить(); - КонецЕсли; - // -- 79Vlad 20.06.2019 #174 - Возврат; - КонецЕсли; - - НастройкиДляРаботыСТелеграм = ПолучитьНастройкиДляРаботыСТелеграм(); - Если НастройкиДляРаботыСТелеграм.ВсеНастройкиПолучены = Ложь Тогда - // ++ 79Vlad 20.06.2019 #174 \\ - Если УведомлятьОРезультате Тогда - Сообщение = Новый СообщениеПользователю; - Сообщение.Текст = "Сообщение не отправлено, т.к. не смогли получить настройки телеграм."; - Сообщение.Сообщить(); - КонецЕсли; - // -- 79Vlad 20.06.2019 #174 - Возврат; - КонецЕсли; +//Процедура ОтправитьСообщениеTelegram(ТекстСообщения, МассивПользователейДляОтправки, УведомлятьОРезультате = Ложь) Экспорт +// +// Если МассивПользователейДляОтправки.Количество() = 0 Тогда +// // ++ 79Vlad 20.06.2019 #174 \\ +// Если УведомлятьОРезультате Тогда +// Сообщение = Новый СообщениеПользователю; +// Сообщение.Текст = "Сообщение не отправлено, т.к. не указан получатель."; +// Сообщение.Сообщить(); +// КонецЕсли; +// // -- 79Vlad 20.06.2019 #174 +// Возврат; +// КонецЕсли; +// +// НастройкиДляРаботыСТелеграм = ПолучитьНастройкиДляРаботыСТелеграм(); +// Если НастройкиДляРаботыСТелеграм.ВсеНастройкиПолучены = Ложь Тогда +// // ++ 79Vlad 20.06.2019 #174 \\ +// Если УведомлятьОРезультате Тогда +// Сообщение = Новый СообщениеПользователю; +// Сообщение.Текст = "Сообщение не отправлено, т.к. не смогли получить настройки телеграм."; +// Сообщение.Сообщить(); +// КонецЕсли; +// // -- 79Vlad 20.06.2019 #174 +// Возврат; +// КонецЕсли; - Для Каждого Пользователь Из МассивПользователейДляОтправки Цикл - - ИДПользователяТелеграм = Пользователь.узИДПользователяТелеграмм; - - Если Не ЗначениеЗаполнено(ИДПользователяТелеграм) Тогда - Продолжить; - КонецЕсли; - - //ТекстСообщения = СтрЗаменить(ТекстСообщения, "#", ""); - СообщениеОтправлено = Ложь; +// Для Каждого Пользователь Из МассивПользователейДляОтправки Цикл +// +// ИДПользователяТелеграм = Пользователь.узИДПользователяТелеграмм; +// +// Если Не ЗначениеЗаполнено(ИДПользователяТелеграм) Тогда +// Продолжить; +// КонецЕсли; +// +// //ТекстСообщения = СтрЗаменить(ТекстСообщения, "#", ""); +// СообщениеОтправлено = Ложь; - // Данные = - // "{ - //|""chat_id"":"""+Формат(Выборка.ИДПользователяТелеграмм, "ЧГ=")+""", - //|""text"":""Текст"", - //|""reply_markup"": { - //| ""inline_keyboard"": [ - //| [{ - //| ""text"": ""ОбъектСогласования"", - //| ""url"":""http://192.168.13.130/BPS/ru_RU/#e1cib/data/Справочник.бпсПредметыСогласований?ref=838318dbf213445c11e8e41681645d42"" - //| }] - //|] - //|} - //|} "; +// // Данные = +// // "{ +// //|""chat_id"":"""+Формат(Выборка.ИДПользователяТелеграмм, "ЧГ=")+""", +// //|""text"":""Текст"", +// //|""reply_markup"": { +// //| ""inline_keyboard"": [ +// //| [{ +// //| ""text"": ""ОбъектСогласования"", +// //| ""url"":""http://192.168.13.130/BPS/ru_RU/#e1cib/data/Справочник.бпсПредметыСогласований?ref=838318dbf213445c11e8e41681645d42"" +// //| }] +// //|] +// //|} +// //|} "; - Структура = Новый Соответствие; - Структура.Вставить("chat_id",Формат(ИДПользователяТелеграм, "ЧГ=")); - Структура.Вставить("text", ТекстСообщения); - - // ++ 79Vlad 20.06.2019 #174 \\ - Структура.Вставить("parse_mode","Markdown"); - Структура.Вставить("disable_web_page_preview","true"); - // -- 79Vlad 20.06.2019 #174 - - Массив_reply_markup = Новый Массив; - - //Пример создания конпки в телеграм - //Если ЗначениеЗаполнено(Выборка.ОбъектБД) - // И ЗначениеЗаполнено(АдресПубликации) Тогда - // - // Структура_inline_keyboard = Новый Структура; - // Структура_inline_keyboard.Вставить("text", Строка(Выборка.ОбъектБД)); - // Структура_inline_keyboard.Вставить("url", АдресПубликации + "#" + ПолучитьНавигационнуюСсылку(Выборка.ОбъектБД)); - // - // Массив_reply_markup.Добавить(Структура_inline_keyboard); - //КонецЕсли; - //Массив_inline_keyboard = Новый Массив; - //Массив_inline_keyboard.Добавить(Массив_reply_markup); - // - //Структура_reply_markup = Новый Структура; - //Структура_reply_markup.Вставить("inline_keyboard",Массив_inline_keyboard); - // - //Структура.Вставить("reply_markup", Структура_reply_markup); - - ПараметрыЗаписиJSON = Новый ПараметрыЗаписиJSON; - ЗаписьJSON = Новый ЗаписьJSON; - ЗаписьJSON.УстановитьСтроку(ПараметрыЗаписиJSON); - ЗаписатьJSON(ЗаписьJSON, Структура); - Данные = ЗаписьJSON.Закрыть(); - - Ресурс = "bot" + НастройкиДляРаботыСТелеграм.ТокенТелеграмБота + "/sendMessage"; - ЗапросHTTP = Новый HTTPЗапрос(Ресурс); - ЗапросHTTP.Заголовки.Вставить("Content-type", "application/json"); - ЗапросHTTP.УстановитьТелоИзСтроки(Данные); +// Структура = Новый Соответствие; +// Структура.Вставить("chat_id",Формат(ИДПользователяТелеграм, "ЧГ=")); +// Структура.Вставить("text", ТекстСообщения); +// +// // ++ 79Vlad 20.06.2019 #174 \\ +// Структура.Вставить("parse_mode","Markdown"); +// Структура.Вставить("disable_web_page_preview","true"); +// // -- 79Vlad 20.06.2019 #174 +// +// Массив_reply_markup = Новый Массив; +// +// //Пример создания конпки в телеграм +// //Если ЗначениеЗаполнено(Выборка.ОбъектБД) +// // И ЗначениеЗаполнено(АдресПубликации) Тогда +// // +// // Структура_inline_keyboard = Новый Структура; +// // Структура_inline_keyboard.Вставить("text", Строка(Выборка.ОбъектБД)); +// // Структура_inline_keyboard.Вставить("url", АдресПубликации + "#" + ПолучитьНавигационнуюСсылку(Выборка.ОбъектБД)); +// // +// // Массив_reply_markup.Добавить(Структура_inline_keyboard); +// //КонецЕсли; +// //Массив_inline_keyboard = Новый Массив; +// //Массив_inline_keyboard.Добавить(Массив_reply_markup); +// // +// //Структура_reply_markup = Новый Структура; +// //Структура_reply_markup.Вставить("inline_keyboard",Массив_inline_keyboard); +// // +// //Структура.Вставить("reply_markup", Структура_reply_markup); +// +// ПараметрыЗаписиJSON = Новый ПараметрыЗаписиJSON; +// ЗаписьJSON = Новый ЗаписьJSON; +// ЗаписьJSON.УстановитьСтроку(ПараметрыЗаписиJSON); +// ЗаписатьJSON(ЗаписьJSON, Структура); +// Данные = ЗаписьJSON.Закрыть(); +// +// Ресурс = "bot" + НастройкиДляРаботыСТелеграм.ТокенТелеграмБота + "/sendMessage"; +// ЗапросHTTP = Новый HTTPЗапрос(Ресурс); +// ЗапросHTTP.Заголовки.Вставить("Content-type", "application/json"); +// ЗапросHTTP.УстановитьТелоИзСтроки(Данные); - Ответ = Неопределено; - ВыполнитьЗапросHTTP_Telegram(Ответ, - ЗапросHTTP, - НастройкиДляРаботыСТелеграм.МассивНастроекПроксиСерверов, - НастройкиДляРаботыСТелеграм.НомерТекущейНастройкиПрокси); - Если Ответ = Неопределено - Или Ответ.КодСостояния < 200 - Или Ответ.КодСостояния >= 300 Тогда - - ЗаписьЖурналаРегистрации("Телеграм.ОтправкаСообщений", УровеньЖурналаРегистрации.Ошибка,, - , "Не смогли отправить сообщение телеграм пользователю [" + Пользователь.узИДПользователяТелеграмм+"]"); - Иначе - СообщениеОтправлено = Истина; - КонецЕсли; - - // ++ 79Vlad 20.06.2019 #174 \\ - Если УведомлятьОРезультате Тогда - ТекстУведомления = "Сообщение удачно отправлено" ; - Если НЕ СообщениеОтправлено Тогда - ТекстУведомления = "Не смогли отправить сообщение телеграм пользователю [" + Пользователь.узИДПользователяТелеграмм+"]. Подробнее смотрите в журнале регистрации." - КонецЕсли; - Сообщение = Новый СообщениеПользователю; - Сообщение.Текст = ТекстУведомления; - Сообщение.Сообщить(); - КонецЕсли; - // -- 79Vlad 20.06.2019 #174 - - КонецЦикла; +// Ответ = Неопределено; +// ВыполнитьЗапросHTTP_Telegram(Ответ, +// ЗапросHTTP, +// НастройкиДляРаботыСТелеграм.МассивНастроекПроксиСерверов, +// НастройкиДляРаботыСТелеграм.НомерТекущейНастройкиПрокси); +// Если Ответ = Неопределено +// Или Ответ.КодСостояния < 200 +// Или Ответ.КодСостояния >= 300 Тогда +// +// ЗаписьЖурналаРегистрации("Телеграм.ОтправкаСообщений", УровеньЖурналаРегистрации.Ошибка,, +// , "Не смогли отправить сообщение телеграм пользователю [" + Пользователь.узИДПользователяТелеграмм+"]"); +// Иначе +// СообщениеОтправлено = Истина; +// КонецЕсли; +// +// // ++ 79Vlad 20.06.2019 #174 \\ +// Если УведомлятьОРезультате Тогда +// ТекстУведомления = "Сообщение удачно отправлено" ; +// Если НЕ СообщениеОтправлено Тогда +// ТекстУведомления = "Не смогли отправить сообщение телеграм пользователю [" + Пользователь.узИДПользователяТелеграмм+"]. Подробнее смотрите в журнале регистрации." +// КонецЕсли; +// Сообщение = Новый СообщениеПользователю; +// Сообщение.Текст = ТекстУведомления; +// Сообщение.Сообщить(); +// КонецЕсли; +// // -- 79Vlad 20.06.2019 #174 +// +// КонецЦикла; -КонецПроцедуры +//КонецПроцедуры -Процедура ВыполнитьЗапросHTTP_Telegram(Ответ, ЗапросHTTP, МассивНастроекПроксиСерверов, НомерТекущейНастройкиПрокси, ВОтветОжидаемJSON = Ложь) - - Ответ = Неопределено; - - // + #232 Ruflex @RomanUpworksTeam - ///+Ruflex - ///-Ruflex - //Если (НомерТекущейНастройкиПрокси >= МассивНастроекПроксиСерверов.Количество()) ) Тогда - // Возврат; - //КонецЕсли; - - Если (МассивНастроекПроксиСерверов.Количество()>0) Тогда - - Если (НомерТекущейНастройкиПрокси >= МассивНастроекПроксиСерверов.Количество()) Тогда - Возврат; - КонецЕсли; - - НастройкиПрокси = МассивНастроекПроксиСерверов[НомерТекущейНастройкиПрокси]; - ИнтернетПрокси = Новый ИнтернетПрокси(Ложь); - ИнтернетПрокси.Установить("https",НастройкиПрокси.Адрес,НастройкиПрокси.Порт,НастройкиПрокси.Логин,НастройкиПрокси.Пароль,Ложь); - Соединение = Новый HTTPСоединение("api.telegram.org", 443,,,ИнтернетПрокси,30,Новый ЗащищенноеСоединениеOpenSSL()); - - Иначе - - Соединение = Новый HTTPСоединение("api.telegram.org", 443,,,,30,Новый ЗащищенноеСоединениеOpenSSL()); - - КонецЕсли; - // + #232 Ruflex @RomanUpworksTeam +//Процедура ВыполнитьЗапросHTTP_Telegram(Ответ, ЗапросHTTP, МассивНастроекПроксиСерверов, НомерТекущейНастройкиПрокси, ВОтветОжидаемJSON = Ложь) +// +// Ответ = Неопределено; +// +// // + #232 Ruflex @RomanUpworksTeam +// ///+Ruflex +// ///-Ruflex +// //Если (НомерТекущейНастройкиПрокси >= МассивНастроекПроксиСерверов.Количество()) ) Тогда +// // Возврат; +// //КонецЕсли; +// +// Если (МассивНастроекПроксиСерверов.Количество()>0) Тогда +// +// Если (НомерТекущейНастройкиПрокси >= МассивНастроекПроксиСерверов.Количество()) Тогда +// Возврат; +// КонецЕсли; +// +// НастройкиПрокси = МассивНастроекПроксиСерверов[НомерТекущейНастройкиПрокси]; +// ИнтернетПрокси = Новый ИнтернетПрокси(Ложь); +// ИнтернетПрокси.Установить("https",НастройкиПрокси.Адрес,НастройкиПрокси.Порт,НастройкиПрокси.Логин,НастройкиПрокси.Пароль,Ложь); +// Соединение = Новый HTTPСоединение("api.telegram.org", 443,,,ИнтернетПрокси,30,Новый ЗащищенноеСоединениеOpenSSL()); +// +// Иначе +// +// Соединение = Новый HTTPСоединение("api.telegram.org", 443,,,,30,Новый ЗащищенноеСоединениеOpenSSL()); +// +// КонецЕсли; +// // + #232 Ruflex @RomanUpworksTeam - Попытка - - Ответ = Соединение.ОтправитьДляОбработки(ЗапросHTTP); - Если Ответ.КодСостояния < 200 Или Ответ.КодСостояния >= 300 Тогда - НомерТекущейНастройкиПрокси = НомерТекущейНастройкиПрокси + 1; - РегистрыСведений.узПроксиСерверы.ИзменитьОценкуРаботоспособностиПроксиСервера(НастройкиПрокси.Адрес, НастройкиПрокси.Порт, -1); - Ответ = Неопределено; - ВыполнитьЗапросHTTP_Telegram(Ответ, ЗапросHTTP, МассивНастроекПроксиСерверов, НомерТекущейНастройкиПрокси, ВОтветОжидаемJSON); - Возврат; - КонецЕсли; - - ОтветСтрокаJSON = Ответ.ПолучитьТелоКакСтроку(); +// Попытка +// +// Ответ = Соединение.ОтправитьДляОбработки(ЗапросHTTP); +// Если Ответ.КодСостояния < 200 Или Ответ.КодСостояния >= 300 Тогда +// НомерТекущейНастройкиПрокси = НомерТекущейНастройкиПрокси + 1; +// РегистрыСведений.узПроксиСерверы.ИзменитьОценкуРаботоспособностиПроксиСервера(НастройкиПрокси.Адрес, НастройкиПрокси.Порт, -1); +// Ответ = Неопределено; +// ВыполнитьЗапросHTTP_Telegram(Ответ, ЗапросHTTP, МассивНастроекПроксиСерверов, НомерТекущейНастройкиПрокси, ВОтветОжидаемJSON); +// Возврат; +// КонецЕсли; +// +// ОтветСтрокаJSON = Ответ.ПолучитьТелоКакСтроку(); - Если ВОтветОжидаемJSON - И СтрНайти(НРег(ОтветСтрокаJSON), "") <> 0 Тогда //прокси может уже не работать, или внесен в гос реестр - - НомерТекущейНастройкиПрокси = НомерТекущейНастройкиПрокси + 1; - РегистрыСведений.узПроксиСерверы.ИзменитьОценкуРаботоспособностиПроксиСервера(НастройкиПрокси.Адрес, НастройкиПрокси.Порт, -1); - Ответ = Неопределено; - ВыполнитьЗапросHTTP_Telegram(Ответ, ЗапросHTTP, МассивНастроекПроксиСерверов, НомерТекущейНастройкиПрокси, ВОтветОжидаемJSON); - Возврат; - - Иначе +// Если ВОтветОжидаемJSON +// И СтрНайти(НРег(ОтветСтрокаJSON), "") <> 0 Тогда //прокси может уже не работать, или внесен в гос реестр +// +// НомерТекущейНастройкиПрокси = НомерТекущейНастройкиПрокси + 1; +// РегистрыСведений.узПроксиСерверы.ИзменитьОценкуРаботоспособностиПроксиСервера(НастройкиПрокси.Адрес, НастройкиПрокси.Порт, -1); +// Ответ = Неопределено; +// ВыполнитьЗапросHTTP_Telegram(Ответ, ЗапросHTTP, МассивНастроекПроксиСерверов, НомерТекущейНастройкиПрокси, ВОтветОжидаемJSON); +// Возврат; +// +// Иначе - РегистрыСведений.узПроксиСерверы.ИзменитьОценкуРаботоспособностиПроксиСервера(НастройкиПрокси.Адрес, НастройкиПрокси.Порт, 1); - Возврат; - - КонецЕсли; - - Исключение - - // + #232 Ruflex @RomanUpworksTeam - //НомерТекущейНастройкиПрокси = НомерТекущейНастройкиПрокси + 1; - //РегистрыСведений.узПроксиСерверы.ИзменитьОценкуРаботоспособностиПроксиСервера(НастройкиПрокси.Адрес, НастройкиПрокси.Порт, -1); - //ВыполнитьЗапросHTTP_Telegram(Ответ, ЗапросHTTP, МассивНастроекПроксиСерверов, НомерТекущейНастройкиПрокси, ВОтветОжидаемJSON); - - Если (МассивНастроекПроксиСерверов.Количество()>0) Тогда +// РегистрыСведений.узПроксиСерверы.ИзменитьОценкуРаботоспособностиПроксиСервера(НастройкиПрокси.Адрес, НастройкиПрокси.Порт, 1); +// Возврат; +// +// КонецЕсли; +// +// Исключение +// +// // + #232 Ruflex @RomanUpworksTeam +// //НомерТекущейНастройкиПрокси = НомерТекущейНастройкиПрокси + 1; +// //РегистрыСведений.узПроксиСерверы.ИзменитьОценкуРаботоспособностиПроксиСервера(НастройкиПрокси.Адрес, НастройкиПрокси.Порт, -1); +// //ВыполнитьЗапросHTTP_Telegram(Ответ, ЗапросHTTP, МассивНастроекПроксиСерверов, НомерТекущейНастройкиПрокси, ВОтветОжидаемJSON); +// +// Если (МассивНастроекПроксиСерверов.Количество()>0) Тогда - НомерТекущейНастройкиПрокси = НомерТекущейНастройкиПрокси + 1; - РегистрыСведений.узПроксиСерверы.ИзменитьОценкуРаботоспособностиПроксиСервера(НастройкиПрокси.Адрес, НастройкиПрокси.Порт, -1); - ВыполнитьЗапросHTTP_Telegram(Ответ, ЗапросHTTP, МассивНастроекПроксиСерверов, НомерТекущейНастройкиПрокси, ВОтветОжидаемJSON); - - Конецесли; - // - #232 Ruflex @RomanUpworksTeam - КонецПопытки - -КонецПроцедуры +// НомерТекущейНастройкиПрокси = НомерТекущейНастройкиПрокси + 1; +// РегистрыСведений.узПроксиСерверы.ИзменитьОценкуРаботоспособностиПроксиСервера(НастройкиПрокси.Адрес, НастройкиПрокси.Порт, -1); +// ВыполнитьЗапросHTTP_Telegram(Ответ, ЗапросHTTP, МассивНастроекПроксиСерверов, НомерТекущейНастройкиПрокси, ВОтветОжидаемJSON); +// +// Конецесли; +// // - #232 Ruflex @RomanUpworksTeam +// КонецПопытки +// +//КонецПроцедуры diff --git a/src/cf/DataProcessors/узРаботаСТелеграм/Forms/Форма/Ext/Form/Module.bsl b/src/cf/DataProcessors/узРаботаСТелеграм/Forms/Форма/Ext/Form/Module.bsl index e6ba422ee..babee66b8 100644 --- a/src/cf/DataProcessors/узРаботаСТелеграм/Forms/Форма/Ext/Form/Module.bsl +++ b/src/cf/DataProcessors/узРаботаСТелеграм/Forms/Форма/Ext/Form/Module.bsl @@ -2,18 +2,21 @@ &НаСервере Процедура ОтправитьСообщениеНаСервере() + //+ #240 Пиганов Г.В. 2020-09-08 //+ #174 Кравцов А.В. 2019-06-06 //МассивПользователейДляОтправки = Новый Массив; //МассивПользователейДляОтправки.Добавить(ЭтотОбъект.ПользовательДляОтправки); - МассивПользователейКому = Новый Массив; - МассивПользователейКому.Добавить(ЭтотОбъект.ПользовательДляОтправки); - МассивПользователейДляОтправки = узТелеграммСервер.ПолучитьМассивПолучателей(МассивПользователейКому); + //МассивПользователейКому = Новый Массив; + //МассивПользователейКому.Добавить(ЭтотОбъект.ПользовательДляОтправки); + //МассивПользователейДляОтправки = узТелеграммСервер.ПолучитьМассивПолучателей(МассивПользователейКому); //- #174 Кравцов А.В. 2019-06-06 - пОбъект = РеквизитФормыВЗначение("Объект"); + //пОбъект = РеквизитФормыВЗначение("Объект"); // ++ 79Vlad 20.06.2019 #174 \\ //пОбъект.ОтправитьСообщениеTelegram(ЭтотОбъект.ТескстСообщенияДляОтправки, МассивПользователейДляОтправки); - пОбъект.ОтправитьСообщениеTelegram(ЭтотОбъект.ТескстСообщенияДляОтправки, МассивПользователейДляОтправки,Истина); + //пОбъект.ОтправитьСообщениеTelegram(ЭтотОбъект.ТескстСообщенияДляОтправки, МассивПользователейДляОтправки,Истина); // -- 79Vlad 20.06.2019 #174 + узТелеграмБот.ОтправитьСообщение(ЭтотОбъект.ТескстСообщенияДляОтправки, ЭтотОбъект.ПользовательДляОтправки, Истина); + //- #240 Пиганов Г.В. 2020-09-08 КонецПроцедуры @@ -25,9 +28,17 @@ &НаСервере Процедура ПрочитатьСообщенияНаСервере() - пОбъект = РеквизитФормыВЗначение("Объект"); - пОбъект.ПрочитатьСообщенияTelegram(); - ЗначениеВРеквизитФормы(пОбъект, "Объект"); + //+ #240 Пиганов Г.В. 2020-09-08 + //пОбъект = РеквизитФормыВЗначение("Объект"); + //пОбъект.ПрочитатьСообщенияTelegram(); + //ЗначениеВРеквизитФормы(пОбъект, "Объект"); + Ответ = Неопределено; + НовыеСообщения = узТелеграмБот.ПолучитьНовыеСообщения(Объект.MaxMessangeID, Ответ); + Объект.HTTPОтвет = Ответ.ПолучитьТелоКакСтроку(); + Для Каждого Сообщение Из НовыеСообщения Цикл + узТелеграмБотКоманды.ОбработатьКомандыСообщения(Сообщение); + КонецЦикла; + //- #240 Пиганов Г.В. 2020-09-08 КонецПроцедуры diff --git a/src/cf/ScheduledJobs/узПолучениеИОбработкаСообщенийТелеграммБота.xml b/src/cf/ScheduledJobs/узПолучениеИОбработкаСообщенийТелеграммБота.xml new file mode 100644 index 000000000..f716672f8 --- /dev/null +++ b/src/cf/ScheduledJobs/узПолучениеИОбработкаСообщенийТелеграммБота.xml @@ -0,0 +1,22 @@ + + + + + узПолучениеИОбработкаСообщенийТелеграммБота + + + ru + Обработка сообщений телеграмм бота + + + + CommonModule.узТелеграмБот.РегламентноеПолучениеИОбработкаСообщений + + + false + true + 3 + 10 + + + \ No newline at end of file diff --git a/src/cf/ScheduledJobs/узПолучениеИОбработкаСообщенийТелеграммБота/Ext/Schedule.xml b/src/cf/ScheduledJobs/узПолучениеИОбработкаСообщенийТелеграммБота/Ext/Schedule.xml new file mode 100644 index 000000000..6d5bf2deb --- /dev/null +++ b/src/cf/ScheduledJobs/узПолучениеИОбработкаСообщенийТелеграммБота/Ext/Schedule.xml @@ -0,0 +1,7 @@ + + + + 1 2 3 4 5 6 7 + 1 2 3 4 5 6 7 8 9 10 11 12 + + \ No newline at end of file diff --git a/src/cf/Subsystems/узУправлениеЗадачами/Subsystems/узТелеграмм.xml b/src/cf/Subsystems/узУправлениеЗадачами/Subsystems/узТелеграмм.xml index af8545475..d49e34fa6 100644 --- a/src/cf/Subsystems/узУправлениеЗадачами/Subsystems/узТелеграмм.xml +++ b/src/cf/Subsystems/узУправлениеЗадачами/Subsystems/узТелеграмм.xml @@ -16,7 +16,7 @@ Constant.узТелеграмм_ТокенБота - CommonModule.узТелеграммСервер + 8f79d0f2-3bdc-43f6-ae0d-3393a1b1c89a