mirror of
https://github.com/BlizD/Tasks.git
synced 2025-03-19 21:07:53 +02:00
Merge pull request #248 from GenVP/Task240
#240 Добавление текущего дела, вопроса, задачи через телеграмм
This commit is contained in:
commit
0c24192ab6
@ -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
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
|
@ -1,12 +1,12 @@
|
||||
<?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.10">
|
||||
<CommonModule uuid="8f79d0f2-3bdc-43f6-ae0d-3393a1b1c89a">
|
||||
<CommonModule uuid="a09a4d95-e432-43c6-b8ec-1e5fe87fb22b">
|
||||
<Properties>
|
||||
<Name>узТелеграммСервер</Name>
|
||||
<Name>узТелеграмБот</Name>
|
||||
<Synonym>
|
||||
<v8:item>
|
||||
<v8:lang>ru</v8:lang>
|
||||
<v8:content>Уз телеграмм сервер</v8:content>
|
||||
<v8:content>Уз телеграм бот</v8:content>
|
||||
</v8:item>
|
||||
</Synonym>
|
||||
<Comment/>
|
||||
@ -15,7 +15,7 @@
|
||||
<Server>true</Server>
|
||||
<ExternalConnection>false</ExternalConnection>
|
||||
<ClientOrdinaryApplication>false</ClientOrdinaryApplication>
|
||||
<ServerCall>true</ServerCall>
|
||||
<ServerCall>false</ServerCall>
|
||||
<Privileged>false</Privileged>
|
||||
<ReturnValuesReuse>DontUse</ReturnValuesReuse>
|
||||
</Properties>
|
640
src/cf/CommonModules/узТелеграмБот/Ext/Module.bsl
Normal file
640
src/cf/CommonModules/узТелеграмБот/Ext/Module.bsl
Normal file
@ -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), "<html>") = 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.Закрыть();
|
||||
|
||||
КонецФункции
|
23
src/cf/CommonModules/узТелеграмБотКоманды.xml
Normal file
23
src/cf/CommonModules/узТелеграмБотКоманды.xml
Normal 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.10">
|
||||
<CommonModule uuid="090c5973-fdd3-499f-a4b7-e6199117b0f9">
|
||||
<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>false</ExternalConnection>
|
||||
<ClientOrdinaryApplication>false</ClientOrdinaryApplication>
|
||||
<ServerCall>false</ServerCall>
|
||||
<Privileged>false</Privileged>
|
||||
<ReturnValuesReuse>DontUse</ReturnValuesReuse>
|
||||
</Properties>
|
||||
</CommonModule>
|
||||
</MetaDataObject>
|
332
src/cf/CommonModules/узТелеграмБотКоманды/Ext/Module.bsl
Normal file
332
src/cf/CommonModules/узТелеграмБотКоманды/Ext/Module.bsl
Normal file
@ -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 Тогда
|
||||
// Удаление из текста сообщения номера задачи
|
||||
Сообщение.Текст = СокрЛ(Сред(ТекстСообщения, ПозЧисла));
|
||||
КонецЕсли;
|
||||
Прервать;
|
||||
КонецЕсли;
|
||||
НомерЗадачи = НомерЗадачи + Символ(КодСимволаЧисла);
|
||||
КонецЦикла;
|
||||
КонецЕсли;
|
||||
Если НомерЗадачи = "" Тогда
|
||||
Возврат Ложь;
|
||||
КонецЕсли;
|
||||
|
||||
Запрос = Новый Запрос;
|
||||
Запрос.Текст =
|
||||
"ВЫБРАТЬ
|
||||
| узЗадачи.Ссылка КАК Ссылка
|
||||
|ИЗ
|
||||
| Справочник.узЗадачи КАК узЗадачи
|
||||
|ГДЕ
|
||||
| узЗадачи.Код = &НомерЗадачи";
|
||||
Запрос.УстановитьПараметр("НомерЗадачи", Число(НомерЗадачи));
|
||||
|
||||
Выборка = Запрос.Выполнить().Выбрать();
|
||||
Если Выборка.Следующий() Тогда
|
||||
ЗадачаСсылка = Выборка.Ссылка;
|
||||
КонецЕсли;
|
||||
|
||||
Возврат Истина;
|
||||
|
||||
КонецФункции
|
@ -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
|
||||
|
||||
|
||||
|
@ -1005,8 +1005,9 @@
|
||||
<CommonModule>узОбновлениеИнформационнойБазы</CommonModule>
|
||||
<CommonModule>узОбщийМодульКлиент</CommonModule>
|
||||
<CommonModule>узОбщийМодульСервер</CommonModule>
|
||||
<CommonModule>узТелеграммСервер</CommonModule>
|
||||
<CommonModule>узРаботаСБуферомОбменаКлиент</CommonModule>
|
||||
<CommonModule>узТелеграмБот</CommonModule>
|
||||
<CommonModule>узТелеграмБотКоманды</CommonModule>
|
||||
<ExchangePlan>ОбновлениеИнформационнойБазы</ExchangePlan>
|
||||
<XDTOPackage>ApplicationExtensionsManifest_1_0_0_1</XDTOPackage>
|
||||
<XDTOPackage>EnterpriseData_1_2_3</XDTOPackage>
|
||||
@ -1138,6 +1139,7 @@
|
||||
<ScheduledJob>узСозданиеТекущихДелПоРегламенту</ScheduledJob>
|
||||
<ScheduledJob>узФормированиеФайлаЛистаЗадач</ScheduledJob>
|
||||
<ScheduledJob>УстановкаПериодаРассчитанныхИтогов</ScheduledJob>
|
||||
<ScheduledJob>узПолучениеИОбработкаСообщенийТелеграммБота</ScheduledJob>
|
||||
<SettingsStorage>ХранилищеВариантовОтчетов</SettingsStorage>
|
||||
<FunctionalOption>АктуальнаяДатаОбновленияПовторноИспользуемыхЗначенийМРО</FunctionalOption>
|
||||
<FunctionalOption>ВариантыВерсионированияОбъектов</FunctionalOption>
|
||||
|
@ -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), "<html>") <> 0 Тогда //прокси может уже не работать, или внесен в гос реестр
|
||||
|
||||
НомерТекущейНастройкиПрокси = НомерТекущейНастройкиПрокси + 1;
|
||||
РегистрыСведений.узПроксиСерверы.ИзменитьОценкуРаботоспособностиПроксиСервера(НастройкиПрокси.Адрес, НастройкиПрокси.Порт, -1);
|
||||
Ответ = Неопределено;
|
||||
ВыполнитьЗапросHTTP_Telegram(Ответ, ЗапросHTTP, МассивНастроекПроксиСерверов, НомерТекущейНастройкиПрокси, ВОтветОжидаемJSON);
|
||||
Возврат;
|
||||
|
||||
Иначе
|
||||
// Если ВОтветОжидаемJSON
|
||||
// И СтрНайти(НРег(ОтветСтрокаJSON), "<html>") <> 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
|
||||
// КонецПопытки
|
||||
//
|
||||
//КонецПроцедуры
|
||||
|
@ -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
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
|
@ -0,0 +1,22 @@
|
||||
<?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.10">
|
||||
<ScheduledJob uuid="a74b8747-cfb3-453f-95d3-5a670b55554d">
|
||||
<Properties>
|
||||
<Name>узПолучениеИОбработкаСообщенийТелеграммБота</Name>
|
||||
<Synonym>
|
||||
<v8:item>
|
||||
<v8:lang>ru</v8:lang>
|
||||
<v8:content>Обработка сообщений телеграмм бота</v8:content>
|
||||
</v8:item>
|
||||
</Synonym>
|
||||
<Comment/>
|
||||
<MethodName>CommonModule.узТелеграмБот.РегламентноеПолучениеИОбработкаСообщений</MethodName>
|
||||
<Description/>
|
||||
<Key/>
|
||||
<Use>false</Use>
|
||||
<Predefined>true</Predefined>
|
||||
<RestartCountOnFailure>3</RestartCountOnFailure>
|
||||
<RestartIntervalOnFailure>10</RestartIntervalOnFailure>
|
||||
</Properties>
|
||||
</ScheduledJob>
|
||||
</MetaDataObject>
|
@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<JobSchedule xmlns="http://v8.1c.ru/8.3/xcf/extrnprops" xmlns:ent="http://v8.1c.ru/8.1/data/enterprise" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.10">
|
||||
<Schedule BeginDate="0001-01-01" EndDate="0001-01-01" BeginTime="00:00:00" EndTime="00:00:00" CompletionTime="00:00:00" CompletionInterval="0" RepeatPeriodInDay="900" RepeatPause="0" WeekDayInMonth="0" DayInMonth="0" WeeksPeriod="1" DaysRepeatPeriod="1">
|
||||
<ent:WeekDays>1 2 3 4 5 6 7</ent:WeekDays>
|
||||
<ent:Months>1 2 3 4 5 6 7 8 9 10 11 12</ent:Months>
|
||||
</Schedule>
|
||||
</JobSchedule>
|
@ -16,7 +16,7 @@
|
||||
<Picture/>
|
||||
<Content>
|
||||
<xr:Item xsi:type="xr:MDObjectRef">Constant.узТелеграмм_ТокенБота</xr:Item>
|
||||
<xr:Item xsi:type="xr:MDObjectRef">CommonModule.узТелеграммСервер</xr:Item>
|
||||
<xr:Item xsi:type="xr:MDObjectRef">8f79d0f2-3bdc-43f6-ae0d-3393a1b1c89a</xr:Item>
|
||||
</Content>
|
||||
</Properties>
|
||||
<ChildObjects/>
|
||||
|
Loading…
x
Reference in New Issue
Block a user