...

Telegram бот и модули Elma 365

Тема в разделе "Примеры сценариев", создана пользователем sabir, 12 май 2023.

Метки:
  1. sabir

    sabir Участник

    Полезные ссылки:
    1. https://t.me/MyTelegramIDworks_bot - Для того что бы получить ID пользователя в телеграмм нужно перейти по ссылке и воспользоваться ботом.
    2. https://t.me/BotFather - БатяБот.
    3. https://core.telegram.org/bots/api - Документация для Telegram ботов.
    4. https://t.me/elma365_BPM_expert_bot - Получившийся бот.
    Для начала создаем модуль и в вкладке настройки добавляем следующие свойства.

    upload_2023-5-12_2-16-2.png
    Нажав кнопку - "Изменить форму" сооружаем следующий интерфейс.

    upload_2023-5-12_2-18-36.png upload_2023-5-12_2-18-51.png
    upload_2023-5-12_2-19-20.png
    upload_2023-5-12_2-19-53.png

    upload_2023-5-12_2-20-43.png

    Добавляем сценарий, он необходим нам для того что-бы зарегистрировать Telegram Webhook на который мы будем получать команды от пользователя.

    HTML:
    declare const console:any;
    declare const window:any;
    async function webhook_registration(): Promise<void> {
    
        if(Context.data.token && Context.data.bot_address){
    
            ViewContext.data.bool = false;
    
            const TOKEN: string = Context.data.token;
    
            const ADDRESS: string = Context.data.bot_address;
    
            const res = await fetch( "https://api.telegram.org/bot"+TOKEN+"/setWebhook?url="+ADDRESS,{
                method:"GET"
            });
        
            if (res.ok) {
    
                window.alert("Вебхук зарегистрирован!");
    
            }else{
    
                window.alert("Что-то пошло не так =(")
    
            }
        }else{
    
            ViewContext.data.bool = true;
    
        }
    
    }
    Сохраняем получившуюся форму.

    upload_2023-5-12_2-26-11.png

    Переходим Управление-> Методы API и создаем там новый метод.

    upload_2023-5-12_2-27-29.png

    В сценариях добавляем следующий код ( Обратите внимание на название функции при вызове метода! У вас она может отличаться ).


    HTML:
    /**
    * Здесь определен интерфейс Params, который описывает параметры сообщения в телеграме.
    * Определен класс Telegram_bot_class для обработки входящих данных в боте в телеграме.
    * Определены приватные поля TOKEN, reqwest_data, message_text, user_id, callback_query_data, message_id.
    *
    * @param {string} TOKEN - Токен бота в телеграме, полученный при регистрации бота.
    * @param {any} reqwest_data - Данные запроса.
    * @param {string} message_text - Текст сообщения.
    * @param {string} user_id - ID пользователя в телеграме.
    * @param {string} callback_query_data - Данные callback-запроса, если он есть.
    * @param {string} message_id - ID сообщения в телеграме.
    *
    * @function constructor(jsonData: any) - Конструктор класса Telegram_bot_class.
    *   Он инициализирует поля объекта класса Telegram_bot_class на основе данных, полученных входящим запросом от телеграма.
    *
    * @function get_req(data: Params, method_api: string) - Эта функция отправляет POST запрос в API телеграма для редактирования или отправки сообщения.
    *
    * @function telegram_bot(req: FetchRequest) - Основная функция, которая вызывается при обработке запроса.
    *   Создает объект myInstance класса Telegram_bot_class и передает ему данные запроса.
    *   Возвращает объект типа HttpResponse со статусом 200.
    */
    
    
    interface Params {
      message_id?:string;
      text: string;
      reply_markup: {
        inline_keyboard: { text: string; callback_data: string }[][];
      };
    }
    
    class Telegram_bot_class {
    
      private readonly TOKEN:string = Namespace.params.data.token;
    
      private reqwest_data: any;
      private message_text: string;
      private user_id: string;
      private callback_query_data:string = "";
      private message_id: string;
    
    
      constructor(jsonData: any){
    
        // Разбираем входные данные JSON
        this.reqwest_data = JSON.parse(jsonData);
    
        try{
            // Если есть аргумент callback_query, получаем нужные значения !! Существует только при нажатии кнопок inline (тех что под сообщением)
            this.callback_query_data = this.reqwest_data.callback_query.data;
            this.user_id = this.reqwest_data.callback_query.message.chat.id;
            this.message_id = this.reqwest_data.callback_query.message.message_id;
    
        }catch{
            // Если аргумента callback_query нет, получаем значения из message !! Стандартные кнопки!
            this.message_text = this.reqwest_data.message.text;
            this.user_id = this.reqwest_data.message.chat.id;
    
        }
    
        // Ниже обрабатываем нажатие кнопок от пользователя.
    
        if(this.message_text == "/start"){
    
            const method = "sendMessage";
    
            const data: Params = {
                text: "Выберите причину обращения",
                reply_markup: {
                    inline_keyboard: [
                        [{ text: " У меня сломался приборчик!", callback_data: "broken" }],
                        [{ text: " Приборчик громко гудит! ", callback_data: "buzzing" }],
                        [{ text: " Лопасти приборчика движутся хаотично! ", callback_data: "chaotically" }]
                    ]
                }
            };
    
            this.get_req(data,method);
         
        }
    
        // Обратите внимание метод использующийся ниже редактирует сообщение - editMessageText.   
    
        if(this.callback_query_data == 'buzzing'){
    
            const method = "editMessageText";
    
            const data: Params = {
                message_id: this.message_id,
                text: " Подкрутите гудильный модуль!",
                reply_markup: {
                    inline_keyboard: [
                        [{ text: " Назад ", callback_data: "back" }]
                    ]
                }
            };
    
            this.get_req(data,method);       
    
        }
    
        if(this.callback_query_data == 'broken'){
    
            const method = "editMessageText";
    
            const data: Params = {
                message_id: this.message_id,
                text: " Приборчик нужно починить!",
                reply_markup: {
                    inline_keyboard: [
                        [{ text: " Назад ", callback_data: "back" }]
                    ]
                }
            };
    
            this.get_req(data,method);       
    
        }
    
        if(this.callback_query_data == 'chaotically'){
    
            const method = "editMessageText";
    
            const data: Params = {
                message_id: this.message_id,
                text: " Хаус затмевает свет императора!",
                reply_markup: {
                    inline_keyboard: [
                        [{ text: " Назад ", callback_data: "back" }]
                    ]
                }
            };
    
            this.get_req(data,method);       
    
        }
    
        if(this.callback_query_data == 'back'){
    
            const method = "editMessageText";
    
            const data: Params = {
                message_id: this.message_id,
                text: "Выберите причину обращения",
                reply_markup: {
                    inline_keyboard: [
                        [{ text: " У меня сломался приборчик!", callback_data: "broken" }],
                        [{ text: " Приборчик громко гудит! ", callback_data: "buzzing" }],
                        [{ text: " Лопасти приборчика движутся хаотично! ", callback_data: "chaotically" }]
                    ]
                }
            };
    
            this.get_req(data,method);
    
        }
    
      }
    
      private get_req(data: Params, method_api: string):void {
    
        fetch("https://api.telegram.org/bot"+this.TOKEN+"/"+method_api+"?chat_id="+this.user_id,{
            method:"POST",
            headers: {
                'Content-Type': 'application/json'
            },
            body:JSON.stringify(data)
        });
    
      }
    
    }
    
    async function telegram_bot(req: FetchRequest): Promise<HttpResponse | void> {
    
        const resp = new HttpResponse(200);
    
        const myInstance = new Telegram_bot_class(req["body"]!.toString());
    
        return resp;
    }
    

    Возвращаемся на стартовую страницу предварительно скопировав из вкладки "Методы API" адрес нашего метода.

    upload_2023-5-12_2-39-36.png

    Заполняем поля: TOKEN и Адрес (Вставляем адрес скопированный из методов API ), нажимаем кнопку Регистрация WH
    upload_2023-5-12_2-47-43.png

    Переходим в телеграмм бота и наслаждаемся =)



    Ссылка: https://t.me/elma365_BPM_expert_bot


    P.S
    Узнав id пользователя вы можете выстраивать разное поведение бота для разных пользователей.

    Простой пример сделать это


    HTML:
    if(this.message_text == "/start"){
    
            if(this.user_id != "5587346171"){
    
                const method = "sendMessage";
    
                const data: Params = {
                    text: "Выберите причину обращения",
                    reply_markup: {
                        inline_keyboard: [
                            [{ text: " У меня сломался приборчик!", callback_data: "broken" }],
                            [{ text: " Приборчик громко гудит! ", callback_data: "buzzing" }],
                            [{ text: " Лопасти приборчика движутся хаотично! ", callback_data: "chaotically" }]
                        ]
                    }
                };
    
                this.get_req(data,method);
    
            }else{
    
                const method = "sendMessage";
    
                const data: Params = {
                    text: "Выберите причину обращения",
                    reply_markup: {
                        inline_keyboard: [
                            [{ text: " У меня сломался приборчик!", callback_data: "broken" }],
                            [{ text: " Приборчик громко гудит! ", callback_data: "buzzing" }],
                            [{ text: " Лопасти приборчика движутся хаотично! ", callback_data: "chaotically" }],
                            [{ text: " + ", callback_data: "plus" }]
                        ]
                    }
                };
    
                this.get_req(data,method);
    
            }
    
        }
    Последнее редактирование: 3 мар 2024