1. Создание бота Telegram
Первое, что нужно сделать - это создать бот для которого будем разрабатывать функционал. В телеграмм для этого есть отдельный бот @BotFather. Добавляете его в свои контакты и в чате пишете команду "/ start". Он выведет список всех доступных команд с описаниями. Для создания бота есть команда:
1
|
/newbot - create a new bot
|
Далее общаемся с ботом и пошагово заполняем данные. Сначала вводим уникальное имя боту. Если имя свободно получим сообщение и уникальный токен который нам нужен для работы через АПИ.
Добавляем бот в контакт и можем с ним работать.
2. Подключение к серверу telegram через api.
Есть вариант самостоятельного подключения к API сервера телеграмму для получения новых сообщений. Это не очень удобно, потому что постоянно надо посылать запрос, чтобы получить новые сообщения если они есть.
Более интересный вариант - это развернуть собственный веб-сервер и тогда телеграмм будет сам отправлять нам новые сообщения. Веб-сервер обязательно должен работать в защищенном режиме с валидными сертификатами.
Для отправки сообщений, нам надо в телеграмм передать УРЛ на который он будет это делать. Для начала создадим обработку сообщений. Создаем новый HTTP сервис в 1С и модуль обработки POST запросов. В процедуре обработки запросов в которой пишем наш код обработки:
1
2
3
4
5
6
7
8
9
|
Функция МетодыОбработкаМетодовExchange(Запрос)
//Отримаємо який метод приходить до нас
ИмяМетода= Запрос.ПараметрыURL["ИмяМетода"];
//Якщо це повідомлення з телеграму то будемо обробляти
Если ИмяМетода = "TelegramUpdateMessage" Тогда
//............
КонецЕсли;
КонецФункции
|
Теперь мы имеем адрес обработки новых сообщений с телеграма и можем его передать на сервер.
1
|
url="https://server/baza1c/hs/ExchangeData/TelegramUpdateMessage";
|
где server - это доменное имя Вашего сервера, baza1c - имя базы указанное при публикации. И код передачи:
1
2
3
4
5
|
Ресурс = "bot" + Токен + "/setWebhook?" + Урл;
Соединение = Новый HTTPСоединение("api.telegram.org",443,,,,,Новый ЗащищенноеСоединениеOpenSSL());
Запрос = Новый HTTPЗапрос(Ресурс);
Ответ = Соединение.Получить(Запрос);
ДвоичныеДанныеОтвета = Ответ.ПолучитьТелоКакСтроку();
|
где Токен - это Ваш токен полученный при регистрации Вашего боту.
Если все сделано правильно, при написании новых сообщений через бот Они будут сразу отправляться на веб-сервер.
3. Получение новых сообщений с telegram в 1С.
Формат получения новых сообщений простой и понятный. Пишем обработку получения этих сообщений.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
Если ИмяМетода = "TelegramUpdateMessage" Тогда
//Получаем данные сообщения
ТелоЗапроса = Запрос.ПолучитьТелоКакСтроку();
//Читаем сообщения из JSON
ЧтениеJSON = Новый ЧтениеJSON();
ЧтениеJSON.УстановитьСтроку(ТелоЗапроса);
Результат = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
//формируем структуру ответа
СтруктураВыгрузки = Новый Структура;
СтруктураВыгрузки.Вставить("chat_id",Результат.message.chat.id);
//Формируем файл ответа JSON
НастройкиСериализации = Новый НастройкиСериализацииJSON;
НастройкиСериализации.ВариантЗаписиДаты = ВариантЗаписиДатыJSON.УниверсальнаяДата;
НастройкиСериализации.ФорматСериализацииДаты = ФорматДатыJSON.ISO;
НастройкиСериализации.СериализовыватьМассивыКакОбъекты = Ложь;
ПараметрыJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Авто, " ", Истина);
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.ПроверятьСтруктуру = Истина;
ЗаписьJSON.УстановитьСтроку(ПараметрыJSON);
ЗаписатьJSON(ЗаписьJSON, СтруктураВыгрузки, НастройкиСериализации);
СтрокаJSON = ЗаписьJSON.Закрыть();
//Создаем объект для ответа
Ответ = Новый HTTPСервисОтвет(200);
Ответ.УстановитьТелоИзСтроки(СтрокаJSON);
КонецЕсли;
Возврат Ответ;
|
4. Отправка сообщений из 1С в telegram
Сообщение получили, теперь отправляем в чат сообщения для клиента. Для отправки сообщения нам нужно знать токен, который получили при создании боту, ИД чата с клиентом, которое мы получили вместе с сообщением от него и текст сообщения, который мы ему хотим отправить. Все дальше отправляем сообщения в чат клиента.
1
2
3
4
|
Ресурс = "bot" + Токен + "/sendMessage?chat_id=" + Формат(ИДЧата,"ЧГ=") + "&text= " + ТекстСообщения;
Соединение = Новый HTTPСоединение("api.telegram.org",443,,,,,Новый ЗащищенноеСоединениеOpenSSL());
Запрос = Новый HTTPЗапрос(Ресурс);
Ответ = Соединение.Получить(Запрос);
|
5. Вставка в сообщение кнопок и получение результата их нажатия.
С текстом разобрались, для удобства надо вывести кнопки и обработать их нажатие клиентом.
Для того, чтобы отправить кнопки в чат надо сообщению добавить еще параметр "reply_markup" и описание кнопок в формате json. Например, делаем выбор из нескольких вариантов. Готовим массив этих значений и формируем из них json.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
МассивВариантов = Новый Массив;
МассивВариантов.Добавить("Варіант1");
МассивВариантов.Добавить("Варіант1");
МассивСтрок = Новый Массив;
МассивКнопок = Новый Массив;
Для каждого Вар Из МассивВариантов Цикл
МассивКнопок.Добавить(Новый Структура("text, callback_data", Вар, Вар));
КонецЦикла;
МассивСтрок.Добавить(МассивКнопок);
СтруктураОтвета = Новый Структура;
СтруктураОтвета.Вставить("inline_keyboard", МассивСтрок);
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку(Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Нет,,,ЭкранированиеСимволовJSON.СимволыВнеASCII));
ЗаписатьJSON(ЗаписьJSON, СтруктураОтвета);
ВыборКнопок = ЗаписьJSON.Закрыть();
|
Добавляем к сообщению:
1
|
Ресурс = Ресурс + "&reply_markup=" + ВыборКнопок;
|
Когда в чате пользователь нажмет кнопку мы получим то значение которое передали в параметре "callback_data".
В нашей функции, которую мы получаем новые сообщения, среди параметров признак нажатой кнопки:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
ЧтениеJSON= Новый ЧтениеJSON();
ЧтениеJSON.УстановитьСтроку(Запрос.ПолучитьТелоКакСтроку());
Результат= ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
callback_query= "";
Результат.Свойство("callback_query",callback_query);
//Нажата кнопка в чате
Если ЗначениеЗаполнено(callback_query) Тогда
ИдЧата = Результат.callback_query.message.chat.id;
//Получаем значение нажатой кнопки и дальше можем обрабатывать
ЗначениеНажатойКнопки = Результат.callback_query.data;
КонецЕсли;
|
6. Вставка ссылок в сообщения:
Бывают ситуации, когда нужно, чтобы на нажатой кнопку отрывался, например, сайт компании.
Такие кнопки отличаются от обычных кнопок только одним параметром. Для вывода обычных кнопок мы передавали так:
1
|
МассивКнопок.Добавить(Новый Структура("text, callback_data", Вар, Вар));
|
А для кнопок со ссылками второй параметр меняем на ссылку на сайт.
1
|
МассивКнопок.Добавить(Новый Структура("text, url", Вар, "http://site.com"));
|
Возможностей в API Telegram значительно больше, но для понимания механизма этого достаточно.