Перейти к содержанию

Comindware интеграция с Telegram-ботом

В этой статье разберём пример того, как настроить интеграцию Comindware Business Application Platform и Telegram-бота. Программу будем разрабатывать в Visual Studio на языке C# (Windows Forms Application).

Алгоритм взаимодействия будет такой:

  • Пользователь пишет боту сообщение.
  • Бот предлагает ему авторизоваться, указав email, через который пользователь зарегистрирован в продукте Comindware Business Application Platform.
  • Пользователь отправляет боту свой email.
  • Бот отправляет GET-запрос в продукт Comindware Business Application Platform для получения данных пользователей.
  • Бот получает JSON-ответ с данными пользователей и ищет среди них пользователя с указанным email адресом.
  • В случае нахождения пользователя происходят следующие действия:
    • Бот генерирует 4-х значный код и отправляет его в чат в телеграмме.
    • Этот же код он записывает через POST-запрос в атрибут в записи пользователя.
    • Через второй POST-запрос бот запускает процесс отправки email-сообщения пользователю с кодом.
    • Пользователь отправляет в телеграмм-чат код, полученный из email-сообщения.
  • Если код, записанный в продукте Comindware Business Application Platform и полученный последним сообщением совпадают — авторизация успешна.

 

Предварительная настройка со стороны 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

Переход в область 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 варианта:

  • сообщение содержит символ '@', следовательно в сообщении email-адрес (запуск процесса отправки 4-х значного кода);
  • длина сообщения — 4 символа (проверка отправленного кода на соответствие);
  • во всех остальных случаях ответом будет: «Укажите email-адрес для авторизации».

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-бота.

  • Вложения
  • Telegram_Bot.cs (10.98 KB) 288