Что это такое?
Telegram набирает всё большую популярность. Недавно сервис предоставил платформу для создания ботов. Telemonitor - это прослойка между API Telegram и 1С/OneScript, позволяющая легко настроить функционал собственного бота. Кто-то задастся вопросом, а зачем вообще нужна какая-то дополнительная программа, ведь все можно организовать и в 1С. Конечно можно, но, на мой взгляд, это не всегда удобно. Во-первых, более или менее удобный функционал есть только в версии 8.3. Во-вторых, надо постоянно держать запущенным сеанс. Telemonitor, конечно, тоже имеет свои недостатки, но работать с ним, думаю будет удобнее.
Как это работает?
Telemonitor опрашивает бота с заданной периодичностью. При получении новой команды программа создает соединение с базой данных через ComConnector, и выполняет указанный для команды код, через вызов процедуры Выполнить(). Количество COM-соединений никак не ограничивается, поэтому одновременно можно отправлять боту несколько команд.
Как настроить своего бота?
Как зарегистрировать бота рассказывать, думаю, смысла нет. В интернете полно примеров, на Инфостарте, кстати, тоже есть очень полезная публикация. И так, открываем каталог Telemonitor и видим файл settings.ini. В нем необходимо задать token для бота, полученный при регистрации. При желании можно изменить интервал опроса бота и параметры соединения. Теперь рассмотрим папку databases, в ней будем описывать базы и команды.
Для каждой базы данных, в которой будем использовать бота создаем папку с произвольным названием латиницей. Для примера я использую базы FileAccounting82 и ServerTrade83. В каждой папке необходимо разместить файл database.ini, в котором указывается строка соединения с базой (сейчас в меня полетят тухлые помидоры, но да, пароль хранится в чистом виде) и используемая версия 1С. Кстати, 8.1 не поддерживается. Кодировка у ini файла должна быть Windows-1251.
Теперь настало время описать команды. В той же папке создаем файлы *.tcm. Каждый такой файл - это просто текст в кодировке UTF-8, содержащий описание команды и код, выполняемый в 1С. Первой строкой идет описание, далее - исполняемый код.
Если мы хотим увидеть какой-либо отклик от бота, тогда необходимо заполнить переменную Результат. В данном примере бот вернет описание пользователей, работающих в базе или скажет: "Нет активных пользователей". При создании своих команд помните, что весь код помещается в конструкцию Выполнить(), поэтому он имеет некоторые ограничения, думаю сами догадываетесь какие. Чтобы бот вернул файл, например, вы хотите получать какой-нибудь отчет или прайс, то в коде команды необходимо заполнить переменную Результат_Файл.
Что получилось в итоге?
После того, как мы создали каталоги для баз данных и файлы с командами, наш бот знает, какие команды у него есть, и что с ними делать.
Имя каждой команды складывается из имени базы данных и имени файла tcm. Запросим у бота список команд. И так, бот, /start !
Ух ты! Работает! Давай-ка, бот, нам список активных пользователей.
Эх, не было печали, а теперь вот каждое утро общаюсь с ботом и смотрю, все ли с базами в порядке :-)
Что дальше?
Программу, она кстати использует NET Framework 2.0, писал для собственных нужд, но, если кому пригодится, буду очень рад. Буду рад предложениям по улучшению и расширению функционала.
Последние изменения:
- 12.08.2015
- Добавил команду /screen для получения скриншота.
- Добавил возможность отправки файлов.
- 23.10.2015
- В команду теперь можно передавать параметры. В 1С все параметры будут доступны в реквизите "ПараметрыКоманды" через запятую
- В settings.ini добавил параметр [SafeMode1C] для запуска кода в небезопасном режиме.
- 17.03.2016
- Добавил ограничение доступа по имени пользователя Telegram (username). Ограничения можно задать как на бота целиком, так и на базу данных. Для этого в файлах settings.ini и database.ini есть секция [WhiteList] и параметр Users. Именя пользователей, которым разрешен доступ, следует указывать через запятую. В этой же секции файла settings.ini можно ограничить доступ пользователям к получению скриншотов. Имя параметра, отвечающего за данное ограничение - ScreenOwners
- 15.04.2016
- Добавил поддержку команд с запросом параметров. Для того, чтобы бот запросил параметр, необходимо в коде команды использовать переменную ДиалогСПараметрами. Ниже представлен пример команды с запросом трех параметров
-
МассивПараметров = Новый Массив(); Подстроки = СтрЗаменить(ПараметрыКоманды, ",", Символы.ПС); Для Сч = 1 По СтрЧислоСтрок(Подстроки) Цикл Параметр = СокрЛП(СтрПолучитьСтроку(Подстроки, Сч)); Если ЗначениеЗаполнено(Параметр) Тогда МассивПараметров.Добавить(Параметр); КонецЕсли; КонецЦикла; Если МассивПараметров.Количество() < 3 Тогда ДиалогСПараметрами = Истина; Заголовки = Новый Соответствие(); Заголовки[0] = "Введите первый параметр:"; Заголовки[1] = "Отлично! Теперь укажите второй:"; Заголовки[2] = "Почти готово! Третий параметр и заканчиваем:"; Результат = Заголовки[МассивПараметров.Количество()]; Иначе // Здесь выполнение какого-то кода... Результат = "Команда выполнена со следующими параметрами:" + Символы.ПС; Результат = Результат + "1) " + МассивПараметров[0] + Символы.ПС; Результат = Результат + "2) " + МассивПараметров[1] + Символы.ПС; Результат = Результат + "3) " + МассивПараметров[2]; КонецЕсли;
Ну и результат работы - Также, теперь в коде команды есть доступ к имени пользователя Telegram, и полному идентификатору команды. Для этого используются переменные username, first_name, last_name и command
- 22.11.2016
- Добавлена поддержка OneScript(1Script). Для тех, кто не в курсе, что это такое вот ссылка и вот. Скрипты необходимо размещать в папке scripts c расширением *.os. Примеры скриптов есть в архиве с программой. Команды для OneScript имеют некоторые особенности, но не сильно отличаются от таковых для 1С. Все пробелы в параметрах, переданных в команду заменяются на знак подчеркивания "_".
- 06.04.2018
- Команды для OScript можно делать в виде кнопок. Для этого файл команды должен быть с расширением *.os_b
- 18.04.2018
- Добавлена поддержка SOCKS5. В settings.ini секция [Proxy], параметр Type
P.S. Писал быстро, поэтому возможны какие-нибудь ошибки. Буду благодарен, если вы сообщите о таковых.