Связка 1С и Telegram. Отправка стикеров




В качестве факультатива сейчас изучаю возможности связки 1С и мессенджера Telegram. И возник вопрос, как помимо сообщений, посылать в ответ на действия пользователя произвольный стикер? Решению этой мини задачи и посвящена данная статья.

На Infostart`е множество статей по интеграции 1С и мессенджера Telegram. В них описано как отправить пользователю сообщения/кнопки/файлы, но нигде нет примера по отправке стикера.

Немного оживим задачу:

Пусть у нас существует бот, который оповещает пользователей о необходимости согласовать документ, т.е. в момент поступления документа на согласование пользователю приходит сообщение следующего вида: "Прошу согласовать документ заявка на расход 1 от 15.07.208 на сумму 100 руб." с двумя кнопками (клавиатура типа "inline_keyboard") "Согласовать" и "Не согласовать". По нажатию на кнопку "Согласовать" пользователю должно приходить сообщение "Спасибо, документ успешно согласован!" и посылаться произвольный стикер.

Вот как это должно выглядеть на практике:

Покопавшись в Telegram Api (https://core.telegram.org/bots/api), было обнаружено, что для отправки стикера существует метод "/sendSticker":

Получается, чтобы отправить стикер нужно знать chat_id и sticker, первый параметр это идентификатор чата нашего бота с конкретным пользователем, а второй это адрес стикера на сервере telegram. Чтобы получить эти параметры нужно один раз послать необходимые нам стикеры нашему боту.

Затем создать обработку и выполнить в ней следующий код по чтению этих сообщений:

&НаКлиенте
Процедура ПолучитьИдентификаторы(Команда)

Идентификаторы.Очистить();

Соединение  =  Новый HTTPСоединение("api.telegram.org",443,,,,,Новый ЗащищенноеСоединениеOpenSSL());

//Запрос обновлений сообщений
ТекстЗапросаHTTP = "bot" + ТокенБота + "/getUpdates";
Запрос = Новый HTTPЗапрос(ТекстЗапросаHTTP);

Ответ = Соединение.Получить(Запрос);
ТекстОтвета = Ответ.ПолучитьТелоКакСтроку();

//Чтение ответа
ЧтениеJSON = Новый ЧтениеJSON();
ЧтениеJSON.УстановитьСтроку(ТекстОтвета);

Результат = ПрочитатьJSON(ЧтениеJSON);

ЧтениеJSON.Закрыть();

МассивСообщений = Результат.result;

Для каждого СтруктураСообщения из МассивСообщений Цикл

Сообщение = СтруктураСообщения.message;

Если Сообщение.Свойство("sticker") Тогда

ИдентификаторЧата = Формат(Сообщение.chat.id, "ЧГ=");

//Строка ИД чата
НоваяСтрокаИдентификатора = Идентификаторы.Добавить();

НоваяСтрокаИдентификатора.ИмяПользователя = Сообщение.from.first_name + " " + Сообщение.from.last_name;
НоваяСтрокаИдентификатора.ИдентификаторЧата = ИдентификаторЧата;

Стикер = Сообщение.sticker;

НоваяСтрокаИдентификатора.Стикер = Стикер.emoji;
НоваяСтрокаИдентификатора.АдресСтикера = Стикер.file_id;

КонецЕсли;

КонецЦикла;

КонецПроцедуры

В ответ на http запрос telegram вернет нам JSON массив следующего формата (адрес стикера это его file_id):

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

&НаКлиенте
Процедура ОтправитьСтикерПользователю(АдресСтикера, ИдентификаторЧата)

Соединение = Новый HTTPСоединение("api.telegram.org",443,,,,,Новый ЗащищенноеСоединениеOpenSSL());

//Параметры запроса
ПараметрыЗапроса = "?chat_id=" + Формат(ИдентификаторЧата, "ЧГ=0") + "&sticker=" + АдресСтикера;
ТекстЗапросаHTTP = "bot" + ТокенБота + "/sendSticker" + ПараметрыЗапроса;

Запрос = Новый HTTPЗапрос(ТекстЗапросаHTTP);
Запрос.УстановитьТелоИзСтроки(ПараметрыЗапроса);

Ответ = Соединение.ОтправитьДляОбработки(Запрос);

КонецПроцедуры

Для удобства получения параметров chat_id и sticker была создана обработка по их получению и отправки стикеров:

Обработка находится во вложении к данной публикации, однако весь её код приведен выше.

Обработка тестировалась на конфигурации "Бухгалтерия предприятия, редакция 3.0 (3.0.63.20)", но она также будет работать на любой конфигурации на управляемых формах

4 Comments

  1. Aspirant

    HTTPСоединение(«api.telegram.org»

    «api.telegram.org» — этот адрес точно работает?

    Reply
  2. Skin123

    (1) Должен работать, если Ваш провайдер не заблокировал его по требованиям РКН

    Reply
  3. stako8

    Может кто сталкивался: отправляю клавиатуру «bot******/sendMessage?chat_id=******&text=Меню&reply_markup={«inline_keyboard»:[[{«text»:»1″,»callback_data»:»1″},{«text»:»2″,»callback_data»:»2″}]]}», она приходит пользователю, тот нажимает на не, но через «getUpdates» не приходит ответ что он нажал. Куда копать?

    Reply
  4. serg-lom89

    (3)в ответ когда будете дергать getUpdates там должно быть поле

    callback_data что такое и там будет индентификатор вашего callback_data (1 или 2)

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *