В этой статье разберём пример того, как настроить интеграцию Comindware Business Application Platform и Telegram-бота. Программу будем разрабатывать в Visual Studio на языке C# (Windows Forms Application).
Алгоритм взаимодействия будет такой:
Предварительная настройка со стороны Comindware Business Application Platform:
1. Создать шаблон пользователя (Системное имя — SotrudnikiComindware). В этом шаблоне уже есть системные атрибуты, такие как Имя, Почта и т.д.
2. Добавьте текстовый атрибут ChatID (ИД — op.19).
3. Добавьте текстовый атрибут Proverochnyykod (ИД — op.20).
4. Создайте шаблон процесса для отправки email (ИД — pa.3), в связанном ШЗ создайте два атрибута: Код (op.23) и Кому (op.24).
Настройка интеграции:
1. Для начала в новом проекте в Visual Studio подключите все необходимые библиотеки, добавьте элементы на графической форме и напишите простейший код, который будет дублировать сообщения, получаемые ботом.
/code//code//code//code//code//code//code//code//code//code//code//code//code//code//code//code//code//code//code//code//code//code//code//code//code//code//code//code//code//code//code//code//code/ using System; using System.Collections.Generic; using System.ComponentModel; using System.Windows.Forms; using RestSharp; using RestSharp.Authenticators; using System.Text.Json;
namespace Telegram { public partial class Form1 : Form { BackgroundWorker bw; public Form1() { InitializeComponent();
this.bw = new BackgroundWorker(); this.bw.DoWork += this.bw_DoWork; } // ****** // CONFIG public string domain = "", login = "", password = ""; // ******
async void bw_DoWork(object sender, DoWorkEventArgs e) { var worker = sender as BackgroundWorker; var key = e.Argument as String; try { var Bot = new Telegram.Bot.TelegramBotClient(key); await Bot.SetWebhookAsync("");
Bot.OnUpdate += async (object su, Telegram.Bot.Args.UpdateEventArgs evu) => { if (evu.Update.CallbackQuery != null || evu.Update.InlineQuery != null) return; var update = evu.Update; var message = update.Message; if (message == null) return; if (message.Type == Telegram.Bot.Types.Enums.MessageType.Text) { // код в этом блоке будет выполняться при получении какого-либо сообщения ботом // в message.Text - содержится текст сообщения // в message.Chat.Id - постоянный идентификатор отправителя await Bot.SendTextMessageAsync(message.Chat.Id, "Вы написали мне: " + message.Text); } }; Bot.StartReceiving(); } catch (Telegram.Bot.Exceptions.ApiRequestException ex) { Console.WriteLine(ex.Message); } }
private void button1_Click(object sender, EventArgs e) { var text = textBox1.Text; // в этой переменной токен бота domain = textBox2.Text; // путь к API платформы, например: https://uipath.35.comindware.net/api/public/ login = textBox3.Text; // логин пользователя в платформе password = textBox4.Text; // пароль в платформе if (this.bw.IsBusy != true) { this.bw.RunWorkerAsync(text); } } } } |
Создание бота
2. Для взаимодействия с Comindware Business Application Platform воспользуемся Solution API, допишите "Docs/SolutionApi/" в адресной строке браузера чтобы увидеть доступные действия:
Переход в область SolutionApi
3. Добавьте в код проекта две функции, одна из них будет делать GET-запрос для получения данных из шаблоно «SotrudnikiComindware». Результатом будет JSON-ответ следующего содержания:
[ { "id": "account.2", "chatID": "81891384", "_creationDate": "2021-03-03T15:38:14Z", "_creator": "account.1", "mbox": "Alexey.Novozhilov@comindware.com", "username": "user_alex", "active": true, "fullName": "Алексей" }, { "id": "account.1", "chatID": "426340372", "_creationDate": "2021-01-28T13:24:21Z", "_creator": "cmw.account.systemAccount", "mbox": "Ilya.Trofimov@comindware.com", "language": "ru", "username": "admin", "active": true, "fullName": "admin", "manager": "account.1" } ] |
Вторая функция будет извлекать из этого ответа нужный атрибут.
/code//code//code//code//code//code//code//code//code//code//code//code//code//code//code//code//code//code//code//code//code//code//code//code//code//code//code//code//code//code//code//code//code/ private string GetJSON () { var client = new RestClient(domain); client.Authenticator = new HttpBasicAuthenticator(login, password); var request = new RestSharp.RestRequest("solution/SotrudnikiComindware", Method.GET); var response = client.Execute(request); return response.Content; }
private string GetValueFromJSON (string data, string attribute_name, string chat_id) { var doc = JsonDocument.Parse(data); JsonElement root = doc.RootElement; var users = root.EnumerateArray(); while (users.MoveNext()) { var user = users.Current; var props = user.EnumerateObject(); string value_ = "", chat_id_ = ""; while (props.MoveNext()) { var prop = props.Current; if (prop.Name.ToLower() == attribute_name.ToLower()) { value_ = prop.Value.ToString(); } if (prop.Name.ToLower() == "chatid") { chat_id_ = prop.Value.ToString(); } } if (chat_id_ == chat_id) { return value_; } } return ""; }
|
4. Теперь используйте эти функции для обработки входящих сообщений от пользователя.
/code//code//code//code//code//code//code//code//code//code//code//code//code//code//code//code//code//code//code//code//code//code//code//code//code//code//code//code//code//code//code//code//code/ async void bw_DoWork(object sender, DoWorkEventArgs e) { var worker = sender as BackgroundWorker; var key = e.Argument as String; try { var Bot = new Telegram.Bot.TelegramBotClient(key); await Bot.SetWebhookAsync("");
Bot.OnUpdate += async (object su, Telegram.Bot.Args.UpdateEventArgs evu) => { if (evu.Update.CallbackQuery != null || evu.Update.InlineQuery != null) return; var update = evu.Update; var message = update.Message; if (message == null) return; if (message.Type == Telegram.Bot.Types.Enums.MessageType.Text) { string data = GetJSON(); if (GetValueFromJSON(data, "ChatID", message.Chat.Id.ToString()) == "") { await Bot.SendTextMessageAsync(message.Chat.Id, "Необходимо авторизоваться"); // здесь будет процесс авторизации } else { string name = GetValueFromJSON(data, "fullName", message.Chat.Id.ToString()); await Bot.SendTextMessageAsync(message.Chat.Id, "Добрый день, " + name + "! Вы успешно авторизованы"); } } }; Bot.StartReceiving(); } catch (Telegram.Bot.Exceptions.ApiRequestException ex) { Console.WriteLine(ex.Message); } } |
5. Теперь бот при получении какого-либо сообщения будет проверять, есть ли в системе Comindware Business Application Platform пользователь с таким же ChatID, от которого пришло сообщение.
6. Реализуйте процесс авторизации следующим образом: если пользователь по ChatID не найден, то будем рассматривать 3 варианта:
7. В уже существующее условие добавьте вышеописанные действия:
/code//code//code//code//code//code//code//code//code//code//code//code//code//code//code//code//code//code//code//code//code//code//code//code//code//code//code//code//code//code//code//code//code/ if (GetValueFromJSON(data, "ChatID", message.Chat.Id.ToString()) == "") { if (message.Text.Contains("@")) { var doc = JsonDocument.Parse(data); JsonElement root = doc.RootElement; var users = root.EnumerateArray(); while (users.MoveNext()) { var user = users.Current; var props = user.EnumerateObject(); string account_id = "", current_email = ""; while (props.MoveNext()) { var prop = props.Current; if (prop.Name.ToLower() == "mbox") { current_email = prop.Value.ToString(); } if (prop.Name.ToLower() == "id") { account_id = prop.Value.ToString(); } } if (current_email.ToLower() == message.Text.ToLower()) { var symbols = "0123456789"; string code = ""; var random = new Random(); for (int i = 0; i < 4; i++) { code += symbols[random.Next(symbols.Length)].ToString(); }
// найденному пользователю в платформе проставим ChatID с пометкой _NA (т.е. не авторизован) // и сгенерированный 4-х значный код var data_ = new Dictionary<string, object> { {"ChatID", message.Chat.Id.ToString() + "_NA"}, {"Proverochnyykod", code} }; var client = new RestClient(domain); client.Authenticator = new HttpBasicAuthenticator(login, password); var request = new RestSharp.RestRequest("solution/SotrudnikiComindware/" + account_id, Method.POST); // POST-запрос к найденному пользователю для обновления данных request.AddHeader("content-type", "application/json"); request.AddParameter("application/json", JsonSerializer.Serialize(data_), ParameterType.RequestBody); client.Execute(request);
// запустим процесс отправки сгенерированного кода на email var data_for_proccess = new Dictionary<string, object> { {"op.23", code}, // Код {"op.24", current_email} // Кому }; request = new RestSharp.RestRequest("system/Process/ProcessObjectService/Create1", Method.POST); request.AddHeader("content-type", "application/json"); data_ = new Dictionary<string, object> { {"processAppId", "pa.3"}, // process_id {"objectName", null}, {"syncActivityQuantity", 2}, {"objectData", data_for_proccess} }; request.AddParameter("application/json", JsonSerializer.Serialize(data_), ParameterType.RequestBody); client.Execute(request);
await Bot.SendTextMessageAsync(message.Chat.Id, "На указанную почту отправлено письмо с 4-х значным кодом, введите его ниже для авторизации"); } } }
else if (message.Text.Length == 4) { string value = GetValueFromJSON(data, "Proverochnyykod", message.Chat.Id.ToString() + "_NA"); if (message.Text == value) { // у ChatID убираем пометку "_NA" и очищаем поле "Проверочный код" var data_ = new Dictionary<string, object> { {"ChatID", message.Chat.Id.ToString()}, {"Proverochnyykod", null} }; var client = new RestClient(domain); client.Authenticator = new HttpBasicAuthenticator(login, password); value = GetValueFromJSON(data, "id", message.Chat.Id.ToString() + "_NA"); var request = new RestSharp.RestRequest("solution/SotrudnikiComindware/" + value, Method.POST); request.AddHeader("content-type", "application/json"); request.AddParameter("application/json", JsonSerializer.Serialize(data_), ParameterType.RequestBody); client.Execute(request); await Bot.SendTextMessageAsync(message.Chat.Id, "Вы успешно авторизованы"); } }
else { await Bot.SendTextMessageAsync(message.Chat.Id, "Укажите email-адрес для авторизации"); } } |
8. Протестируйте работу Telegram-бота.
Номер Статьи: 2048
Размещено: Sat, Mar 5, 2022
Последнее обновление: Fri, Apr 1, 2022
Online URL: https://kb.comindware.ru/article/comindware-integraciya-s-telegram-botom-2048.html