Здравствуйте, уважаемые читатели этой публикации. Просьба не судить строго. Это лишь мой личный опыт, тем не менее, опыт положительный и надеюсь он будет кому-нибудь полезен.
В интернете не так много статей на эту тему, а те, что есть, уже не актуальны, так как telegram больше не блокируют в России, или же эти инструкции усложнены, почем зря, например использованием не совсем user friendly apache и прочих openssl.
Для начала чего я хотел добиться - учитывая специфику моей работы, одна из моих задач была возможность делать служебные фотографии товара на складе при приемке и автоматически прикреплять их к карточкам номенклатуры. Один из вариантов который я использую это ТСД на андроиде с лицензией Cleverence (это отдельная тема для разговора). Но учитывая что ТСД стоят денег, да и лицензия на софт тоже, а так же специфичность моей конфигурации 1С, сторонние решения требуют доработки и изменений (Опять же отельная тема для разговора).
Короче говоря, вариантов использования можно придумать массу. Прикрепление фото - один из них.
И так, с целью определились. Какие нужны для этого средства?
- Серверная 1С (можно и на файловой, но я не думаю что тема актуальна, если не прав - то можете указать это в комментариях)
- Операционная система Windows 7 или выше
- Бот telegram (Создается бесплатно)
- Статичный (белый ip адрес) - с этим думаю проблем не должно возникнуть. Но если вдруг возникнут, есть некоторые платные решения. О них позднее.
Начнем, пожалуй с самого простого - создание бота. Для создания бота нужно в telegram обратиться к @BotFather.
Пишем ему /start и получаем список доступных команд.
Нас интересует команда /newbot — отправляем ему и нам будет предложено ввести имя нового бота. После ввода имени мы получим токен и ссылку для быстрого добавления бота в список контактов.
Схороним эти данные. Они важны.
Следующим нашим шагом станет установка IIS сервера на windows. Собственно это не совсем установка, но это мелочи.
Перейдем в Панель управления\Программы\Программы и компоненты (или жмем win+r и там вводим appwiz.cpl). В открывшемся окне слева "Включение и отключение компонентов windows". Находим пункт Службы IIS и включаем. Затем раскрываем дерево, и сморим раздел "Службы Интернета", опять же раскрываем и идем в "Компоненты разработки приложений". Там должны быть включены службы в названии которых есть ASP.
После того как всё будет установлено, нам нужно запустить "Диспетчер служб IIS". Быстро это можно сделать нажав win+r и выполнить команду "InetMgr".
Проверим что веб-сервер работает. Запустим браузер, и в адресной строке введем "localhost". Если всё хорошо - увидим заглушку Internet Information Service.
Очень важно!!! Если вы используете версию 32x версию 1С, то нужно разрешить серверу работу с 32x приложениями.
С одним большим делом разобрались. Теперь пришло время получить свой домен. Это быстро и бесплатно. Я использовал сайт my.freenom.com - там в целом ничего сложного.
Инструкция по регистрации домена на русском языке
Итак, у нас есть домен и рабочий веб сервер. Нужно проверить, что доменное имя работает. Но сначала нужно пробросить порты. Нужно сделать так, чтобы все запросы по адресу домена вели на 80 и 443 порт того компьютера локальной сети, на котором находится наш веб сервер и 1С. Для дополнительной безопасности можно использовать альтернативный внешний порт 88 или 8443 - telegram помимо стандартных 80 и 443 поддерживает ещё эти два. То есть запросы на ВАШ_ДОМЕН:ПОРТ (80 или 443 можно не указывать) должны вести на локальный IP вашего сервера внутри сети. В разных роутерах это делается по разному. Если у вас был опыт например настройки RDP через интернет - для вас ничего сложного это не составит. Для тех кто с этим не знаком - в сети множество инструкций под роутеры разных производителей.
Итак, после проброса портов попробуем перейти по адресу, что указали при регистрации домена. (Учтите, что это нужно делать из внешней сети. Самый простой это с помощью мобильного телефона через мобильный интернет). В случае если всё ок - вы увидите ту же самую заглушку, как и при переходе по адресу "localhost" на сервере 1С.
Настало время установить SSL сертификат на наш сервер. Вебхук telegram работает только с защищенным протоколом. Для автоматической установки нам понадобится специальная программа .
win-acme - ссылка на репозиторий.
На момент написания статьи последняя версия
win-acme.v2.1.14.996.x64.trimmed.zip - для 64x windows
win-acme.v2.1.14.996.x86.trimmed.zip - для 32x windows
Запускаем программу через wacs.exe (От имени администратора) и выбираем эти варианты
1) N: Create certificate (default settings)
2) 1: Default Web Site (1 binding)
3) A: Pick *all* bindings
4) Y
5) Y
(На момент написания статьи у меня уже был установлен сертификат, и возможно мой пример ответов не совсем релевантен. Скорее всего у нас спросят ещё пару вещей, на всё соглашаемся, там ничего сложного.)
После успешного завершения у нас будет свой веб сервер с SSL сертификатом, который будет доступен из внешней сети. Проверим это. Опять же через мобильный телефон через мобильную сеть перейдем по адресу HTTPS://ВАШ_ДОМЕН:ПОРТ (порт можно не указывать, если вы при пробросе портов вы не указали внешний порт). Если всё хорошо, то в адресной строке слева у вас будет "замок"
Подведем промежуточный итог.
Для работы вебхука telegram нам нужен был сервер, доступный по доменному имени, на котором есть SSL сертификат.
Что мы для этого сделали:
1) Установили IIS
2) Получили доменное имя
3) Пробросили порты на роутере
4) Установили SSL сертификат.
Что мы получили - при обращение по доменному имени из внешней сети мы попадаем на заглушку веб сервера. В Адресной строке при этом есть "замочек".
Теперь настало время настраивать 1С.
Для начала у нас должен быть установлен пакет расширений Web сервера 1С.
Создадим новый HTTP Сервис. В конфигураторе в разделе Общие находим пункт HTTP-Сервисы.
Создадим новый сервис. Обратите внимание на поле Корневой URL – это имя нашего сервиса к которому будет обращаться Вебхук. Используйте только латиницу.
Создаем новый шаблон URL для нашего сервиса. И даем имя функции с помощью которой Телеграм будет общаться с 1С.
Далее. Внутри нашей функции мы создадим пару методов. При работе с HTTP сервисами нам доступно несколько специальных методов.
Нам для установки вебхука нужно лишь 2 из них. Это POST и GET. После всех манипуляций у нас есть HTTP сервис с корневым URL «testService», у которого есть функция «TestFunction» у которой есть 2 метода: POST и GET
Теперь нам нужно назначить обработчики событий на созданные методы.
Создадим обработчик метода GET (этот метод нужен нам для тестирования)
Функция TestFunctionGET(Запрос)
Ответ = Новый HTTPСервисОтвет(200);
Ответ.Заголовки.Вставить("Content-Type","text/html; charset=utf-8");
Ответ.УстановитьТелоИзСтроки("Сервис работает");
Возврат Ответ;
КонецФункции
и метода POST (С этим методом как раз и будет работать вебхук)
Функция TestFunctionPOST(Запрос)
Ответ = Новый HTTPСервисОтвет(200);
Возврат Ответ;
КонецФункции
Пока этого хватит. Давайте опубликуем наш сервис. Для этого идем в раздел Администрирование->Публикация на веб-сервере.
Имя - по умолчанию имя нашей базы 1С, но можно изменить, если необходимо.
Веб-сервер – это как раз наш встроенный в Windows веб-сервер IIS
Каталог – каталог, в котором хранится информация о публикации. Можно оставить по умолчанию, но запомним это место. Оно нам пригодится.
Для работы нашего вебхука нам нужны включенные галочки – на Вкладке HTTP сервисы. Остальные можно отключить. Но на время можно оставить Публиковать тонкий и веб клиент, для теста работоспособности.
Жмем опубликовать. Если всё ок, то мы получим оповещение о том, что сервис опубликован, и вопрос о том, нужно ли перезапустить веб сервер – отвечаем, что нужно. Важно чтобы конфигуратор был запущен от имени Администратора, иначе могут возникнуть проблемы с сохранением настроек.
Вернемся к менеджеру IIS (win+r и выполнить команду "InetMgr")
В списке сайтов мы увидим наш веб сервис. Если там пусто – то обновите список.
В браузере переходим по адресу "localhost/ИМЯ_БАЗЫ*"
*ИМЯ_БАЗЫ - это что указали при публикации - в моем примере адрес выглядит так "localhost/DEMO"
Если все предыдущие шаги были выполнены, то на экране вы увидите предложение авторизоваться. Для этого мы как раз и оставили включенным пункт "Публиковать тонкий и веб клиент".
Теперь проверим как работает метод GET у нашей функции.
В браузере перейдите по адресу "localhost/DEMO/hs/testService/TestFunction/"
где
DEMO – имя нашей базы, указанное при публикации
hs - обязательный атрибут, говорящий о том, что мы обращаемся к HTTP сервису (Http Service)
testService - это Шаблон URL, который мы указали при создании HTTP сервиса
TestFunction – это имя созданной нами функции, у которой есть 2 метода: GET и POST
Если в ваших действиях не было ошибок, то вы увидите следующее
Это запрос авторизации, что для работы вебхука неприемлемо.
Для автоматической авторизации мы можем сделать следующее. Помните, я просил запомнить каталог публикации ? Идем туда, находим файл "default.vrd" и открываем в блокноте.
Обратим внимание на это место
Добавим сюда usr=ИМЯ;pwd=ПАРОЛЬ
Где
Имя – это имя пользователя 1С, под которым будет авторизоваться вебхук
Пароль – соответственно пароль пользователя, под которым будет авторизоваться вебхук.
Итоговый вариант выглядит так
Сохраняем файл и пробуем ещё раз перейти по указанному выше адресу. Если всё ок, то мы увидим ту надпись, которую указали при написании обработчика на метод GET.
Теперь мы должны проверить работоспособность нашей функции из внешней сети по HTTPS протоколу.
Для этого можно прямо с мобильного телефона через мобильный интернет обратиться по адресу
HTTPS://ИМЯ_ДОМЕНА/DEMO/hs/testService/TestFunction/
Где
ИМЯ_ДОМЕНА - это тот домен, который вы зарегистрировали на my.freenom.com
DEMO - Имя базы, которое вы указали при публикации сервиса в 1С.
hs - обязательный атрибут, говорящий о том что мы обращаемся к HTTP сервису (Http Service)
testService - это Шаблон URL, который мы указали при создании HTTP сервиса
TestFunction – это имя созданной нами функции у которой есть 2 метода: GET и POST
Результат должен быть аналогичным, как если бы обращались к функции по "localhost".
Подведем промежуточный итог.
У нас есть Домен с работающим SSL сертификатом. HTTP сервис в 1С, который доступен из внешнего интернета. Собственно осталось лишь установить вебхук. Это просто. Нужно лишь вбить в браузер следующую ссылку
https://api.telegram.org/bot<токен>/setWebhook?url=https://<ВАШ_ДОМЕН>/<ИМЯ_БАЗЫ>/hs/<ШАБЛОН_URL>/<ФУНКЦИЯ>
Где
<токен> - это тот токен, который мы получили в самом начале статьи.
<ИМЯ_БАЗЫ> - Имя базы, которое вы указали при публикации сервиса в 1С.
hs - обязательный атрибут, говорящий о том, что мы обращаемся к HTTP сервису (Http Service)
<ШАБЛОН_URL>- это Шаблон URL, который мы указали при создании HTTP сервиса
<ФУНКЦИЯ> – это имя созданной нами функции, у которой есть 2 метода: GET и POST
Если всё сделано верно, то мы получим сообщение
{"ok":true,"result":true,"description":"Webhook was set"}
Более подробную информацию мы можем получить вбив в адресную строку
https://api.telegram.org/bot<токен>/getWebhookInfo
{"ok":true,"result":{"url":"https://<ВАШ_ДОМЕН>/<ИМЯ_БАЗЫ>/hs/<ШАБЛОН_URL>/<ФУНКЦИЯ>","has_custom_certificate":false,"pending_update_count":0,"max_connections":40,"ip_address":"ВАШ_IP"}}
Если вебхук не сможет достучаться до вашей базы, то вы увидите информацию об ошибках. Это может быть как Bad request - означает, что вебхук не может достучаться до нашего сервера, а так же Not Authorized - это означает, что вы забыли указать логин и пароль в файле "default.vrd".
Ну и давайте попробуем сделать так, чтобы на любой запрос к боту нам приходил ответ.
Вернемся к обработчику на метод POST и приведем код к следующему виду:
Функция TestFunctionPOST(Запрос)
Ответ = Новый HTTPСервисОтвет(200);
Строка = Запрос.ПолучитьТелоКакСтроку(); // В запросе содержатся данные в формате JSON
ЧтениеJSON = Новый ЧтениеJSON();
ЧтениеJSON.УстановитьСтроку(Строка);
ОтветОбъект = ПрочитатьJSON(ЧтениеJSON);
message = ОтветОбъект.message;
chat_id = chat.id;
ТекстСообщения = "Слава роботам!";
teleОповеститьпользователя(chat_id,ТекстСообщения);
Возврат Ответ;
КонецФункции
И вот функция для отправки сообщения пользователю:
Процедура teleОповеститьпользователя (user_id,ТекстСообщения)
token = "" //сюда вставить ваш токен;
server = "api.telegram.org";
Ресурс = "bot" + token + "/sendMessage?chat_id=" + СтрЗаменить(Формат(user_id, "ЧДЦ=; ЧС=; ЧРГ=."), ".", "") + "&text=" + ТекстСообщения;
Соединение = Новый HTTPСоединение(server,443,,,,,Новый ЗащищенноеСоединениеOpenSSL());
Запрос = Новый HTTPЗапрос(Ресурс);
Ответ = Соединение.Получить(Запрос);
КонецПроцедуры
Учтите, что это прямо совсем черновой код и нужно предусматривать то, что в HTTP запросе могут возникнуть ошибки. Вообще HTTP сервисы можно отлаживать, как и обычный код 1С, с точками остановок и прочим, но у меня ни разу не вышло словить сеанс в отладчике. К тому же сложность написания кода в HTTP модуле ещё в том, что он не делает проверки на синтаксис при сохранении конфигурации. Для контроля Синтаксиса я использую метод GET - переходе в браузере по адресу нашей функции мы ранее видели надпись "Сервис работает", если есть синтаксические ошибки, то мы увидим надпись "Ошибка инициализации библиотеки модулей". Также я набросал простенькую функцию для логирования всего, что мне хочется, и вставляю ей в нужных местах, для понимания данных, которые я получаю или пытаюсь передать.
Процедура Логировать(ТекстСообщения);
ПутьКФайлу = "C:\teleLog.txt";
Файл = Новый Файл(ПутьКФайлу);
Если Файл.Существует() тогда
Чтение = Новый ЧтениеТекста(ПутьКФайлу);
Текст = Чтение.Прочитать();
Чтение.Закрыть();
Иначе
Текст = "";
КонецЕсли;
Запись = Новый ЗаписьТекста(ПутьКФайлу);
Запись.ЗаписатьСтроку(""+Текст+Символы.ПС+ТекущаяДата() + Символы.ПС + "--------------------------------------------"+Символы.ПС+ТекстСообщения);
Запись.Закрыть();
КонецПроцедуры
Помимо этого всегда можно скопировать код в обычный модуль и проверить на синтаксис уже там.
Собственно сохраняем конфигурацию и пробуем отправить боту сообщение.
Если мы молодцы и всё сделали правильно, то увидим следующее:
Собственно мы добились изначальной цели - работы вебхука telegram с 1С без сторонних сервисов и необходимости создания сертификата вручную и ковыряния с apache.
О работе с API telegram (Отправка сообщений, файлов, создание кнопок для быстрых ответов) можно писать отдельную статью.
В подготовке данного материала мне были полезны пара публикаций
Телеграм + 1С + Вебхуки + Апач + Самоподписанный сертификат
Почитайте, там есть немало полезного.
Ещё в начале статьи я сказал, что иметь белый IP адрес не обязательно и существуют некие решения.
Я лично тестировал и остался доволен сервисом ngrok.com. Если коротко - это прокси, на который вебхук будет посылать запросы, которые будут перенаправляться на наш компьютер. Очень удобно. Но платно - 5 долларов в месяц (Белый IP в большинстве случаев стоит дешевле), и нужно следить, чтобы их программа была запущена, и не глючила. В бесплатной версии сессии активны в течение часа (или около того), затем нужно будет изменять вебхук на новый, так как будет сгенерирован новый временный домен. Но для отладки подойдет, так как хорошо видно, какие запросы приходят к нам.
Буду рад любым комментариям с критикой и уточнениями, а так же если будут вопросы, постараюсь ответить на них, по мере своих знаний.