Мастерская ОПИ: большой мануал по работе с Telegram

30.06.24

Интеграция - WEB-интеграция

Немного встряхнем существующий функционал Открытого пакета интеграций: посмотрим на работу с Telegram, для тех, кто хочет узнать об этом больше или даже только начинает знакомиться с возможностями библиотеки в работе с данными сервисом

Открытый пакет интеграций - это бесплатное и с открытым исходным кодом расширение, представляющее из себя набор общих модулей для работы с разнообразными онлайн-сервисами через API

Узнать больше:
Репозиторий на Github | Основная статья на Инфостарт | Документация


 

Telegram - один из самых популярных мессенджеров в мире. Не малую часть этой популярности ему принес несложный, но, вместе с тем, крайне гибкий и широкий в своих возможностях API. Едва ли найдется человек, который ни разу не взаимодействовал с каким-нибудь ботом: будь то чат-бот или бот с полезным функционалом для администрирования канала

 

Не обошли эту тему и в 1С сообществе: возможность отправлять документы и оповещения, вызывать функции через inline-клавиатуру - уже давно не просто "прикольные штуки" или "диковинные новинки". Сегодня же мы постараемся максимально полно и подробно рассмотреть методы и приемы реализации разнообразных Telegram-кейсов с опорой на Открытый пакет интеграций и его функции для работы с данным мессенджером. Заодно затронем некоторые моменты, которые буду справедливы и для всего пакета целиком

 

Чат-бот на раз-два-три

 

Первое, что приходит на ум, когда речь заходит про использование Telegram Bot API, это чат-бот - алгоритм, который может обрабатывать входящие сообщения от пользователей и, в зависимости от их содержания, выдавать необходимый ответ

 

 

Получить своего бота не сложно: достаточно пройти процедуру создания у @BotFather. Если вы не знакомы с данным процессом, то в документации ОПИ есть пошаговая инструкция. Не думаю, что есть необходимость дублировать её сюда в очередной раз

 

После ответа на все вопросы у BotFather, мы получаем токен и, в принципе, уже готовы реализовывать логику нашего бота

 

 

 

 


 

Прием новых сообщений

 

Важнейшей частью реализации любого бота является выбор способа получения новых сообщений. Варианта всего 2: Webhook и Polling.

Более предпочтительным является режим Webhook. Смысл его заключается в том, что мы указываем URL обработчика нашего бота, а Telegram, при каждом новом событии, отправляет на этот URL запрос с информацией о том, что же с нашим ботом произошло.

Как нетрудно догадаться, это подразумевает наличие Web-сервера и URL, доступного извне, а еще установленного SSL-сертификата, так как Telegram работает только по https. Если у вас все это есть, то для начала разработки остается выполнить всего лишь 2 простых шага:

 

 

  1. Создать http-сервис. Достаточно одного шаблона и одного метода, обрабатывающего запросы типа POST. Созданный сервис должен быть опубликован на веб сервере
     
  2. В ОПИ есть две команды для настройки Webhook - УстановитьWebhook и УдалитьWebhook. Названия говорят сами за себя. В данном случае нам необходим код следующего вида:
     
        Токен = "61294578...";
        URL   = "https://api.athenaeum.digital/u/hs/telegram";
        
        Ответ = OPI_Telegram.УстановитьWebhook(Токен, URL); 


    Токен здесь (и далее) это токен бота от BotFather, а URL - адрес нашего http-сервиса. В ответе должна прийти соответствие, в поле description которого будет фраза "Webhook was set"

C этого момента при любом событии, связанным с ботом, по данному адресу будет приходить POST-запрос

Вторым, менее предпочтительным, вариантом является режим Polling. Суть его в том, что при отсутствии веб-сервера или невозможности принимать с его помощью запросы от Telegram, мы сами можем периодически обращаться к API и получать информацию о новых событиях

Polling может быть длинным и коротким: при коротком Telegram возвращает ответ сразу, как обычный http-запрос, а при использовании длинного соединение существует некоторое время и ответ возвращается либо по его прошествии, либо сразу, при появлении нового события. Long (длинный) Polling является более оптимальным, так как количество запросов при нем гораздо меньше - рекомендуется использовать именно его

Реализация Polling - что длинного, что короткого, в ОПИ завязано на метод ПолучитьОбновления, который и запрашивает информацию о новых событиях с сервера Telegram. На входе он принимает 3 параметра: токен, таймаут и смещение, и если с токеном все понятно, то два других параметра нужно разобрать подробнее

  • Таймаут - параметр, который отвечает за количество времени жизни соединения в секундах. Он не обязательный и по умолчанию равен 0 - т.е. настроен на Short Polling. Таковым его можно оставить во время разработки и тестирования, но уже при настоящей работе рекомендуется все же установить в него некоторое значение - как принято, это что то в рамках от 20 секунд до минуты
  • Смещение - это ID сообщения, с которого должен начаться список новых событий. Дело в том, что по умолчанию, без использования смещения (offset) Telegram не отслеживает, какие обновления мы от него уже получали, а какие - нет. Использование же данного параметра позволяет получать только еще не полученные ранее данные, а как следствие не следить за отсутствием дублей при записи на своей стороне.

    Определить необходимое смещение для следующего вызова очень просто: нужно взять update_id у последнего полученного сообщения из предыдущего вызова и прибавить 1
     
    Смещение = 0;
    
    Пока Истина Цикл
    
        Ответ     = OPI_Telegram.ПолучитьОбновления(Токен, 30, Смещение);
        Результат = Ответ["result"];
        Смещение  = Результат[Результат.ВГраница()]["update_id"] + 1;
    
    КонецЦикла;

 

 

Дальнейшая организация получения обновлений зависит от преследуемых целей: в примере выше вызов ПолучитьОбновления завернут в бесконечный цикл, но если новые события должны отслеживаться все время и в фоновом режиме, то для этого придется использовать регламентные задания. Тут и раскрывается основной минус использования Polling против использования Webhook - напрягать железо, отправляя http-запросы каждые 30 секунд, большинство из которых будут холостыми, это не очень оптимально

В любом случае, вне зависимости от варианта получения обновлений, результатом будет являться json-объект с данными обновления (в случае Polling внутри будет массив событий). Разница будет лишь в том, что в случае использования ПолучитьОбновления этот объект будет уже сериализован в соответствие, а при работе через http-сервис получить данные из тела запроса необходимо самостоятельно. Это легко сделать, буквально в одну строчку, при помощи функции JSONВСтруктуру (не верьте названию - делает Соответствие) модуля инструментов ОПИ:

 

Функция getUpdatespost(Запрос)
    
    Результат = OPI_Инструменты.JsonВСтруктуру(Запрос.ПолучитьТелоКакДвоичныеДанные());
    Ответ     = Новый HTTPСервисОтвет(200);
    Возврат Ответ;
    
КонецФункции

 

Далее я буду опираться на эту функцию обработчика Http-сервиса, но никаких принципиальных отличий при использовании ПолучитьОбновление не будет: только реализация её периодического вызова и обход массива событий вместо одиночного события тут

 

Структура событий

 

Структуру из переменной Результат показывать не очень удобно - я покажу JSON:

 

{
 "message": {
  "text": "Это текст сообщения",
  "date": 1719395912,
  "chat": {
   "username": "JKIee",
   "type": "private",
   "last_name": "Titowets",
   "first_name": "Anton",
   "id": 461699897
  },
  "from": {
   "language_code": "ru",
   "username": "JKIee",
   "last_name": "Titowets",
   "first_name": "Anton",
   "is_bot": false,
   "id": 461699897
  },
  "message_id": 5472
 },
 "update_id": 291366729
}

 

Тут есть два основных поля: message и update_id. Update_id уже упоминался ранее - он необходим для определения отступа при работе в режиме Polling, а с Webhook не нужен вовсе. Объект же message обозначает, что событие является сообщением и, собственно, содержит в себе содержимое этого сообщения:

  • Поле text содержит (внезапно) текст сообщения
  • Поле date содержит дату отправки сообщения в Unix-time
  • Поле message_id содержит идентификатор сообщения
  • Объекты from и chat содержат информацию об источнике сообщения

From отличается от chat тем, что в объекте from хранится информация о пользователе, отправившем сообщение, а в chat - о самом диалоге, где это все происходит. В данном случае эти объекты совпадают, так как я пишу боту напрямую, но если бот подключен в группу, то в поле chat будет информация о ней:

 

{
 "message": {
  "text": "Это я написал в группу",
  "date": 1719474923,
  "chat": {
   "type": "supergroup",
   "is_forum": true,
   "title": "Тест",
   "id": -1001971186208
  },
  "from": {
   "language_code": "ru",
   "username": "JKIee",
   "last_name": "Titowets",
   "first_name": "Anton",
   "is_bot": false,
   "id": 461699897
  },
  "message_id": 3180
 },
 "update_id": 291366757
}

 

События бывают разные и набор полей у них может отличаться. Полную спецификацию можно посмотреть тут, но, в целом, отслеживать все виды событий на практике нет необходимости: проще всего обрабатывать необходимые поля через Если...ИначеЕсли, а если таковых полей нет, то в Иначе отправлять пользователю ответ о некорректном вводе, либо же не обрабатывать подобный ввод вовсе

 

 

Особенно актуально игнорирование некорректных сообщений для тех ботов, которые будут добавляться в группы: бот-администратор отслеживает все происходящие события, разумеется включая сообщения пользователей между собой, а также вступления и выходы пользователей из администрируемой группы

Добавить бота в группу, к слову, очень легко. Нужно зайти в настройки группы, после чего нажать изм. в правом верхнем углу и выбрать пункт Администраторы (для телефонов), или же просто нажать три точки и выбрать тот же пункт Администраторы (для ПК), после чего добавить туда бота, написав его имя в поиске. Аналогично это делается и для каналов

 

 


 

Отправляем ответ

 

Чтобы бот стал функциональным, он должен отвечать пользователям на запросы. Начнем с простого примера: ответим на вопрос пользователя "Который час?" актуальным серверным временем. Возвращаемся к функции обработки http-сервиса:

 


Функция getUpdatespost(Запрос)
    
    Токен     = "***";
    
    // Получаем данные события
    Результат = OPI_Инструменты.JsonВСтруктуру(Запрос.ПолучитьТелоКакДвоичныеДанные());  
    Ответ     = Новый HTTPСервисОтвет(200);
    
    Сообщение      = Результат["message"]; // Получаем сообщение из события
    ОтветОтправлен = Ложь;                 // Признак успешного создания ответа
    IDЧата         = "";                   // Переменная для ID чата, куда будет отправлен ответ
    
    Если ЗначениеЗаполнено(Сообщение) Тогда
        
        Текст  = Сообщение["text"];          // Получаем текст из сообщения
        IDЧата = Сообщение["chat"]["id"];    // Получаем ID чата
        
        Если ЗначениеЗаполнено(Текст) Тогда
            
            Если СокрЛП(Текст) = "Который час?" Тогда  // Если в сообщении есть текст (а не, например, только картинка)
                
                ТекстОтвета = "Текущее время: " + Формат(ТекущаяДатаСеанса(), "ДЛФ=T"); // Текст ответа
                OPI_Telegram.ОтправитьТекстовоеСообщение(Токен, IDЧата, ТекстОтвета);   // Отпрака
                ОтветОтправлен = Истина;
                
            КонецЕсли;
            
        КонецЕсли;
        
    КонецЕсли;
    
    // Если данные события не подходят под условия, но у нас есть ID чата
    Если Не ОтветОтправлен И ЗначениеЗаполнено(IDЧата) Тогда
        OPI_Telegram.ОтправитьТекстовоеСообщение(Токен, IDЧата, "Я не знаю, что на это ответить");   
    КонецЕсли;
    
    Возврат Ответ;
    
КонецФункции

 

 

 

Особенностью работы с Telegram является то, что реакцию на сообщение пользователя мы отправляем не с ответом, а новым http-запросом в функции ОтправитьТекстовоеСообщение. В ответе же мы возвращаем только код 200 - даем понять Telegram, что сообщение мы получили

 

 

 

Сама процедура ОтправитьТекстовоеСообщение принимает следующие параметры:

 

  • Токен - токен нашего бота
  • IDЧата - идентификатор чата, в который новое сообщение должно быть отправлено
  • Текст - содержимое сообщения
  • Клавиатура - JSON клавиатуры. Об этом мы поговорим далее, сам параметр необязательный
  • Разметка - один из вариантов разметки текста (HTML/Markdown/MarkdownV2). Иначе говоря, способ указания полужирного, подчеркнутого, зачеркнутого, курсивного и пр. вариантов написания в тексте сообщения. Необязательный, Markdown по умолчанию
  • IDВходящего - идентификатор другого сообщения, для оформления нового сообщения как ответ на него. Необязательный

Входящие данные мы обрабатываем как Соответствие, следовательно наличие необходимых полей можно определять по заполненности. Состав их, как уже было сказано ранее, может отличаться - выбрать необходимые для обработки данные проще всего отлавливая запросы на http-сервис в отладчике, отправляя боту сообщения (в режиме Polling еще проще - вызывая функцию ПолучитьОбновления)

В качестве содержимого сообщения, кстати, можно отправлять не только текстовою информацию, но вообще много всего разного - про файлы мы поговорим чуть позже, сейчас же рассмотрим клавиатуры.

Клавиатура - это кнопки под сообщением или на нижней панели диалога, нажатие на которые вызывают события. В ОПИ для их создания существует функция СформироватьКлавиатуруПоМассивуКнопок - она позволяет создать несложную клавиатуру из массива строк, обозначающих надписи на кнопках, которая подойдет для большинства задач, связанных с организацией выбора. Её мы и будем рассматривать, однако стоит оговориться, что это лишь один из множества возможных примеров - сам механизм клавиатур способен на большее (в зависимости от ваших целей)

Переработаем нашу функцию: добавим получение времени по разным городам, с выбором из списка доступных вариантов

 


Функция getUpdatespost(Запрос)
    
    Ответ     = Новый HTTPСервисОтвет(200);
    Токен     = "***";
    
    // Получаем данные события
    Результат = OPI_Инструменты.JsonВСтруктуру(Запрос.ПолучитьТелоКакДвоичныеДанные());  
    Сообщение = Результат["message"]; // Получаем сообщение из события
    
    // Если сообщение не заполнено - пытаемся найти событие нажатия кнопки; Получаем текст
    Если Не ЗначениеЗаполнено(Сообщение) Тогда 
        
        Нажатие   = Результат["callback_query"];
        Сообщение = Нажатие["message"];
        Текст     = Нажатие["data"];   
        
    Иначе
        Текст = Сообщение["text"];
    КонецЕсли;
    
    ОтветОтправлен = Ложь;                 // Признак успешного создания ответа
    IDЧата         = "";                   // Переменная для ID чата, куда будет отправлен ответ
    
    Если ЗначениеЗаполнено(Текст) Тогда
        
        IDЧата = Сообщение["chat"]["id"];    // Получаем ID чата
        СформироватьОтвет(Текст, IDЧата, Токен);
                
    КонецЕсли;
    
    Возврат Ответ;
    
КонецФункции   

Процедура СформироватьОтвет(Знач Текст, Знач IDЧата, Знач Токен) 
    
    ТекстОтвета = "";
                          
    Если ЗначениеЗаполнено(Текст) И ЗначениеЗаполнено(IDЧата) Тогда
        
        Текст      = СокрЛП(Текст);
        Шаблон     = "Текущее время в городе %1: %2";                 // Шаблон ответа
        Время      = УниверсальноеВремя(ТекущаяДатаСеанса());
        
        // Соответствие времени по городам  ---------------------------
        СоответствиеВремени = Новый Соответствие;
        СоответствиеВремени.Вставить("Минск"      , МестноеВремя(Время, "Europe/Minsk"));
        СоответствиеВремени.Вставить("Владивосток", МестноеВремя(Время, "Asia/Vladivostok"));    
        СоответствиеВремени.Вставить("Калининград", МестноеВремя(Время, "Europe/Kaliningrad")); 
        
        ВремяДляОтвета = СоответствиеВремени.Получить(Текст);
        ВремяДляОтвета = Формат(ВремяДляОтвета, "ДЛФ=T");
        
        // Формируем клавиатуру ---------------------------------------
        
        МассивКлавиатуры = Новый Массив;
        
        Для Каждого Город Из СоответствиеВремени Цикл
            МассивКлавиатуры.Добавить(Город.Ключ);
        КонецЦикла;
        
        Клавиатура = OPI_Telegram.СформироватьКлавиатуруПоМассивуКнопок(МассивКлавиатуры, Истина);
        
        // Условия ----------------------------------------------------
        
        // Минск по умолчанию
        Если Текст = "Который час?" Тогда  
            
            ВремяДляОтвета = СоответствиеВремени["Минск"];
            ВремяДляОтвета = Формат(ВремяДляОтвета, "ДЛФ=T");
            
            ТекстОтвета    = СтрШаблон(Шаблон, "Минск", ВремяДляОтвета);   
            
        // Если указан город и он есть в списке
        ИначеЕсли ЗначениеЗаполнено(ВремяДляОтвета) Тогда
            
            ТекстОтвета = СтрШаблон(Шаблон, Текст, ВремяДляОтвета);
            
        Иначе
            
            ТекстОтвета = "Я не знаю, что на это ответить";
            
        КонецЕсли;
        
    КонецЕсли;
    
    Если ЗначениеЗаполнено(ТекстОтвета) Тогда
        OPI_Telegram.ОтправитьТекстовоеСообщение(Токен, IDЧата, ТекстОтвета, Клавиатура);   // Отпрака
    КонецЕсли;
    
КонецПроцедуры

 

Этот код довольно сильно отличается от предыдущего, но ничего сложного в нем тоже нет: в начале мы все также получаем информацию о сообщении из поля message, но, если ее нет, то еще дополнительно обращаемся к callback_query - полю, отвечающему за информацию о нажатии на кнопку под сообщением. Аналогично message, callback_query имеет внутри текст, только не в свойстве text, а в свойстве data. Объект message там, кстати, тоже есть - он содержит информацию о сообщении, к которому нажатая кнопка принадлежит

Формирование и отправку сообщения я вынес отдельно в процедуру СформироватьОтвет. Большая её часть - непосредственно формирование текста и определение времени. Это нас мало интересует. Новой же функцией для работы с Telegram тут является только СформироватьКлавиатуруПоМассивуКнопок

СформироватьКлавиатуруПоМассивуКнопок может принимать 3 параметра

  • Массив кнопок - массив строк, обозначающий одновременно и надписи на кнопках, и возвращающее значение при их нажатии
  • Под сообщением - указатель на то, что клавиатура должна быть прикреплена к сообщению. В противном случае клавиатура будет панелью над полем ввода сообщения в интерфейсе мессенджера
  • Одна под одной - указатель на то, что кнопки должны идти в столбик, а не в строку, друг за другом. Истина по умолчанию

 

 

Функция возвращает JSON, который достаточно просто передать в параметр Клавиатура функции отправки сообщения, что и сделано в конце нашей процедуры

 

В итоге, при первом вопросе от пользователя, мы возвращаем ответ с прикрепленными кнопками. При нажатии на любую из этих кнопок, отправляется новое сообщение, в зависимости от того, какая кнопка была нажата - в данном случае, это Калининград

 

 

Для того, чтобы клавиатура была не прикрепленной к конкретному сообщению, а всплывала под полем ввода сообщения на нижней панели, достаточно убрать (либо выставить в Ложь) второй параметр (ПодСообщением) у функции СформироватьКлавиатуруПоМассивуКнопок

 

 

В данном случае нажатие на кнопку не создает свой особый вид события, а просто отправляет текстовое сообщение от лица пользователя

 

Работа с файлами

 

При работе с Telegram Bot API оперировать мы можем не только текстом, но и файлами. Для отправки файлов в ОПИ есть несколько функций, каждая из которых отвечает за свой тип файла:

  • ОтправитьКартинку
  • ОтправитьВидео
  • ОтправитьАудио
  • ОтправитьДокумент
  • ОтправитьГифку
  • ОтправитьМедиагруппу

Они работают примерно одинаково: принимают на вход набор параметров, схожий с ОтправитьТекстовоеСообщение, но плюс данные файла для отправки.

 

Данные файла как в этом, так и в других методах Открытого пакета интеграций, можно указывать в одном их 3-х вариантов: как путь к файлу, как двоичные данные и как URL. Все они будут приведены к нужному типу автоматически

Отличается только отправить медиагруппу: там в параметр файла передается не сам файл, но соответствие, где ключ - Файл, а значение - ТипМедиа

Подробная информация и примеры по каждому методу есть в документации, мы же разберем один: ОтправитьКартинку, который будем использовать для отправки изображения вместе с информацией о времени в нашей функции

Менять, к слову, нужно не многое: необходимо добавить соответствие картинок по городам и заменить отправку текста на отправку картинки, где текст уже будет выступать ее описанием

 

Процедура СформироватьОтвет(Знач Текст, Знач IDЧата, Знач Токен) 
    
    ТекстОтвета = "";
                          
    Если ЗначениеЗаполнено(Текст) И ЗначениеЗаполнено(IDЧата) Тогда
        
        Текст      = СокрЛП(Текст);
        Шаблон     = "Текущее время в городе %1: %2";                 // Шаблон ответа
        Время      = УниверсальноеВремя(ТекущаяДатаСеанса());
        
        // Соответствие времени по городам  ---------------------------
        СоответствиеВремени = Новый Соответствие;
        СоответствиеВремени.Вставить("Минск"      , МестноеВремя(Время, "Europe/Minsk"));
        СоответствиеВремени.Вставить("Владивосток", МестноеВремя(Время, "Asia/Vladivostok"));    
        СоответствиеВремени.Вставить("Калининград", МестноеВремя(Время, "Europe/Kaliningrad")); 
        
        СоответствиеКартинок = Новый Соответствие;
        СоответствиеКартинок.Вставить("Минск"      , "C:/Минск.jpg");
        СоответствиеКартинок.Вставить("Владивосток", "C:/Владивосток.jpg");
        СоответствиеКартинок.Вставить("Калининград", "C:/Калининград.jpg");
                                                                         
        ВремяДляОтвета = СоответствиеВремени.Получить(Текст);
        ВремяДляОтвета = Формат(ВремяДляОтвета, "ДЛФ=T");
        
        КартинкаДляОтвета = СоответствиеКартинок.Получить(Текст);
        
        // Формируем клавиатуру ---------------------------------------
        
        МассивКлавиатуры = Новый Массив;
        
        Для Каждого Город Из СоответствиеВремени Цикл
            МассивКлавиатуры.Добавить(Город.Ключ);
        КонецЦикла;
        
        Клавиатура = OPI_Telegram.СформироватьКлавиатуруПоМассивуКнопок(МассивКлавиатуры, Истина);
        
        // Условия ----------------------------------------------------
        
        // Минск по умолчанию
        Если Текст = "Который час?" Тогда  
            
            ВремяДляОтвета    = СоответствиеВремени["Минск"];
            КартинкаДляОтвета = СоответствиеКартинок["Минск"];
            ВремяДляОтвета    = Формат(ВремяДляОтвета, "ДЛФ=T");
            
            ТекстОтвета    = СтрШаблон(Шаблон, "Минск", ВремяДляОтвета);   
            
        // Если указан город и он есть в списке
        ИначеЕсли ЗначениеЗаполнено(ВремяДляОтвета) Тогда
            
            ТекстОтвета = СтрШаблон(Шаблон, Текст, ВремяДляОтвета);
            
        Иначе
            
            ТекстОтвета = "Я не знаю, что на это ответить";
            
        КонецЕсли;
        
    КонецЕсли;
    
    Если ЗначениеЗаполнено(ТекстОтвета) Тогда
        OPI_Telegram.ОтправитьКартинку(Токен, IDЧата, ТекстОтвета, КартинкаДляОтвета, Клавиатура);   // Отпрака
    КонецЕсли;
    
КонецПроцедуры

 

Помимо отправки файлов разных видов пользователю, доступно также и получение файлов от него. Для этого используется функция СкачатьФайл, принимающая на вход ID файла и токен. Что есть ID файла? Проще всего понять, отправив боту файл и отловив событие в отладчике:

 

 

{
 "message": {
  "document": {
   "file_size": 12017,
   "file_unique_id": "AgADuU0AAvRLCUg",
   "file_id": "BQACAgIAAxkBAAIVomaAS5dTZ5d1sT2wAf6Jf3a7d_j4AAK5TQAC9EsJSC5SWbwzOB5YNQQ",
   "mime_type": "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
   "file_name": "Документ важности чрезвычайной.docx"
  },
  "date": 1719683991,
  "chat": {
   "username": "JKIee",
   "type": "private",
   "last_name": "Titowets",
   "first_name": "Anton",
   "id": 461699897
  },
  "from": {
   "language_code": "ru",
   "username": "JKIee",
   "last_name": "Titowets",
   "first_name": "Anton",
   "is_bot": false,
   "id": 461699897
  },
  "message_id": 5538
 },
 "update_id": 291366798
}

 

В объекте message мы больше не видим поля text, но видим вложенный объект document (также может быть photo, video, audio и т.д. в зависимости от отправленного файла). В нем есть поля размера, имени, MIME-типа и, как раз нужный нам, ID файла. Осталось лишь передать его в функцию для скачивания - очистим наш предыдущий обработчик времени по городам (чтобы не было путаницы), а затем напишем туда новый код:

 

Функция getUpdatespost(Запрос)
    
    Ответ     = Новый HTTPСервисОтвет(200);
    Токен     = "***";
    
    // Получаем данные события
    Результат = OPI_Инструменты.JsonВСтруктуру(Запрос.ПолучитьТелоКакДвоичныеДанные());  
    Сообщение = Результат["message"]; // Получаем сообщение из события
    
    Если ЗначениеЗаполнено(Сообщение) Тогда
        
        Документ = Сообщение["document"];
        Чат      = Сообщение["chat"];
        
        Если ЗначениеЗаполнено(Документ) Тогда
            
            IDЧата   = Чат["id"];
            IDФайла  = Документ["file_id"];
            
            Двоичные = OPI_Telegram.СкачатьФайл(Токен, IDФайла);
            
            ТекстОтвета = "Размер вашего файла: " + Строка(Двоичные.Размер());
            
            OPI_Telegram.ОтправитьТекстовоеСообщение(Токен, IDчата, ТекстОтвета);
            
        КонецЕсли;
        
    КонецЕсли;
    
    Возврат Ответ;
    
КонецФункции 

 

 

Размер файла мы, конечно, можем достать и сразу из данных события, но это просто наглядный пример, что при вызове СкачатьФайл мы получаем двоичные данные

 

 

Бан, разбан и иные интересные способы взаимодействия с пользователями чата

 

Кроме методов для работы с данными, в ОПИ есть еще несколько административных функци:

  • Бан
  • Разбан
  • СоздатьСсылкуПриглашение
  • ЗакрепитьСообщение
  • ОткрепитьСообщение
  • ПолучитьЧислоУчастников
  • УдалитьСообщение

Их названия говорят сами за себя и нужны они в довольно специфических случаях: когда из 1С нужно управлять публичными чатами. Подробно на этом останавливаться не будем - после предыдущих разделов тут ничего сложного нет. Просто знайте: вдруг что - такие функции тут есть. Плюс они также подробно описаны в документации

 

 

 

Другие механизмы

 

Есть еще два интересных механизма, работа с которыми поддерживается в ОПИ: Режим форума и Telegram Mini Apps. Но про них я уже писал - посмотреть можно здесь:

 

Telegram в режиме форума: делаем чаты комфортными

Статья Программист Стажер Платформа 1С v8.3 Бесплатно (free) Нет файла WEB-интеграция Мессенджеры и боты

Сегодня мы посмотрим на механизм форума - возможность Телеграма разбивать один и тот же чат (группу) на набор тем. Разберем основные возможности и методы взаимодействия с данным функционалом из 1С посредством ОПИ.

 

Telegram Mini App: все возможности веб-приложения прямо у вашего бота

Статья Программист Платформа 1С v8.3 Бесплатно (free) Нет файла Мессенджеры и боты

Как сделать telegram бота сопоставимым по функционалу с полноценным веб-приложением? Просто запихнуть веб-приложение прямиком внутрь бота! Сегодня посмотрим на технологию Telegram Mini App и её использование с опорой на 1С


 

 

В заключение

 

Telegram - отличный выбор для организации оперативного обмена данными с пользователем, когда делать это нужно вне доступа последнего к 1С. API мессенджера достаточно гибкий и покрывает широкий перечень задач. А работать с ним из 1С вам всегда поможет функционал Октрытого пакета интеграций!

Также, по традиции, напомню про основные возможности пакета, для тех, кто с ним еще не знаком:
 

  • На данный момент функционал ОПИ не ограничивается работой с Telegram, но имеет методы еще для 11 сервисов, как, например, VK, Viber, Google Drive, Yandex Disk и многие другие. Полное список поддерживаемых API можно найти в основной статье о проекте
     
  • ОПИ - это не только расширение для 1С, но еще пакет для OneScript и приложение для командной строки. При этом, у всех трех реализаций общий набор методов, а значит вы можете использовать один и тот же функционал там, где вам это будет удобнее. Подробнее про версию для командной строки
     
  • При работе с пакетом вам всегда поможет подробная документация. Там есть как просто описание параметров и возвращаемых значений, так и примеры кода 1С с шаблонами команд вызова для CLI-приложения

 

Получить последнюю версию библиотеки можно бесплатно в релизах на Github. Если же она вам понравилась - обязательно поставьте звездочку! Это очень поможет в развитии проекта

 

 
 Не могу найти, где скачать

 

Спасибо за внимание!

 

 

 Мой GitHub:    https://gitub.com/Bayselonarrend 
 OpenYellow:    https://openyellow.notion.site
 Лицензия MIT:  https://mit-license.org

 

Telegram ОПИ Интеграция API мессенджер чат http web

См. также

Мессенджеры и боты Программист Пользователь Платформа 1С v8.3 Платные (руб)

Мощный модуль для интеграции 1С с чат-ботами: Telegram, Viber, WhatsApp, WhatsApp Business, Instagram, ICQ, Facebook, Vkontakte, Skype, Одноклассники, Яндекс.Алиса, Avito а так же виджеты чата для сайтов: Verbox, Jivochat. Это универсальное и эффективное решение с большими возможностями, простым интерфейсом, наличием визуального конструктора, базовыми сценариями поведения из коробки, позволяющий запустить чат-ботов в течении 1-го дня.

65000 руб.

08.10.2019    58897    33    0    

154

SALE! 25%

Мобильная разработка Мессенджеры и боты Платформа 1С v8.3 1С:Конвертация данных Платные (руб)

Теперь создать telegram-бота - элементарно. Достаточно просто нарисовать блок-схему телеграм-бота, и он сразу заработает. Это возможно при использовании Графического конструктора телеграм-ботов. Это единственный конструктор ботов для telegram, чье качество и функционал подтверждены фирмой 1С, есть сертификат 1С:Совместимо. Расширение в интерактивном режиме, с помощью блок-схем, позволяет с минимальными трудозатратами создать телеграм-ботов в любой конфигурации, работающей на платформе «1С:Предприятие 8.3».

13200 9900 руб.

27.12.2021    35588    93    161    

189

Сайты и интернет-магазины Интеграция WEB-интеграция Платформа 1С v8.3 Конфигурации 1cv8 Управленческий учет Платные (руб)

Интеграция 1С и Битрикс 24. Разработка имеет двухстороннюю синхронизацию 1С и Bitrix24 задачами. Решение позволяет создавать пользователя в 1С из Битрикс24 и наоборот. Данная разработка технически подходит под все основные конфигурации линейки продуктов 1С:Предприятие 8.3 (платформа начиная с 8.3.23). При приобретении предоставляется 1 месяц бесплатных обновлений разработки. Доступна демо-версия продукта с подключением Вашего Битрикс24

5040 руб.

04.05.2021    18973    10    16    

17

Мессенджеры и боты Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Платные (руб)

Интеграция мессенджера WhatsApp и 1С: УНФ, УТ, КА, ERP - отправка и получение сообщений, картинок, файлов и видео прямо в 1С. Расширение работает с сервисом GreenApi.

15600 руб.

23.06.2023    6977    46    11    

24

Управление взаимоотношениями с клиентами (CRM) WEB-интеграция Анализ продаж Системный администратор Программист Пользователь Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Управленческий учет Платные (руб)

Подсистема интеграции Amo CRM с 1С: технические требования, порядок работы, возможности, доработки и обновления. Бесплатный период техподдержки - 1 месяц.

60000 руб.

07.05.2019    31837    62    40    

23

Сайты и интернет-магазины WEB-интеграция Системный администратор Программист Пользователь Платформа 1С v8.3 Конфигурации 1cv8 1С:Управление торговлей 11 Автомобили, автосервисы Россия Управленческий учет Платные (руб)

Интеграционный модуль обмена между конфигурацией Альфа Авто 5 и Альфа Авто 6 и порталом AUTOCRM. Данный модуль универсален. Позволяет работать с несколькими обменами AUTOCRM разных брендов в одной информационной базе в ручном и автоматическом режиме.

36000 руб.

03.08.2020    16712    15    19    

15
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. baracuda 2 30.06.24 21:12 Сейчас в теме
Очень жду пока в ОПИ появится WhatasApp,рузумеется не WhatsApp Business APi, а альтернитивное по типу GreenApi, Wazzup и т.д.
2. bayselonarrend 1829 30.06.24 21:14 Сейчас в теме
(1)
GreenApi


Так у GreenApi и так своя обработка для 1С есть на Github
3. baracuda 2 30.06.24 21:15 Сейчас в теме
(2) качество кода и функционал там сильно хуже того, как сделаны аналогичные решения в ОПИ.
bayselonarrend; +1 Ответить
4. quazare 3727 01.07.24 07:42 Сейчас в теме
Отличная статья! Не хватает примера для скачки!
5. bayselonarrend 1829 01.07.24 07:44 Сейчас в теме
(4) Спасибо. Для скачки чего?
6. serverstar 67 02.07.24 00:35 Сейчас в теме
7. DrAku1a 1730 02.07.24 10:54 Сейчас в теме
 Результат = OPI_Инструменты.JsonВСтруктуру(Запрос.ПолучитьТелоКакДвоичныеДанные());  
    ...
    Сообщение      = Результат["message"]; // Получаем сообщение из события

Судя по коду OPI_Инструменты.JsonВСтруктуру - возвращает соответствие...
8. bayselonarrend 1829 02.07.24 10:55 Сейчас в теме
(7) Да, и там об этом написано. Исторически так сложилось, а поменять нельзя - обратная совместимость
9. Мастер1С 781 14.07.24 20:28 Сейчас в теме
Если через http сервис то как обошли авторизацию?
10. bayselonarrend 1829 14.07.24 20:28 Сейчас в теме
11. Мастер1С 781 14.07.24 20:41 Сейчас в теме
(10) 1с, для подключения к http сервису
12. bayselonarrend 1829 14.07.24 20:46 Сейчас в теме
(11) Конкретно здесь был тестовый стенд без пользователей, но когда нужно где-то на рабочей, то создается вторая публикация на веб-сервере только для сервиса с прописыванием логина и пароля в VRD файле
13. Мастер1С 781 14.07.24 21:00 Сейчас в теме
(12) Не подходит вариант. У меня в ГРМ базы.
Оставьте свое сообщение