Пишем бота-помощника для Telegram на Powershell. He’ll be back.

Аве, путник!

Мы продолжаем эникействовать в компании ИмпЭксТрансСтройДевелопРитейлСнаб и мы вынуждены на некоторое время отвлечься от работ, связанных с 1с. Приближаются новогодние праздники, поэтому возможность удаленного управления процессами выходит на первый план. Особенно — возможность управления при минимуме ресурсов.

Для этих целей создадим бота, управлять которым можно с помощью мессенджера. Например, с помощью Telegram. Тогда нам будет достаточно смартфона и слабенького канала доступа в интернет. К счастью, использовать webhook для работы бота необязательно, так что мы вполне можем задействовать среду Microsoft Powershell при создании оболочки нашего робота.

Вкратце о том, что и как работает. Бот телеграмм это практически обычный аккаунт мессенджера, однозначно идентифицируемый токеном, который выдается при регистрации аккаунта, с возможностью программно управлять действиями от имени этого аккаунта. Создать бота достаточно просто. В окне телеграмм нужно найти персонажа по имени @BotFather и дать ему команду /newbot. Судя по аватарке BotFather — делать это надо с уважением.

Затем в этом же диалоге с создателем ботов даем нашему боту имя и логин, разрешаем ему участвовать в группах (Allow Groups — Turn On) и читать все сообщения в чате групп (Group Privacy — Turn On). К этому моменту мы имеем на руках все что нам нужно — бота и его токен. Токен выглядит примерно так:

Use this token to access the HTTP API: 435664910:FGE4Lo141vGU_dLwlkBozj-ntefTwgjDFfiM — это наш токен

Поскольку отдел у нас большой — создадим группу для управления ботом. Из того-же меню телеграмм создаем группу (Menu — New Group), приглашаем в группу нашего бота (Group Info — Add Members) и коллег по цеху.

Затем, как обычно — идем на сервер генерировать скрипт.

Что мы хотим от бота ? Чтобы он принимал от нас команды и выполнял соответствующие действия, уведомляя нас о результатах. Значит он должен уметь получать сообщения, отправлять сообщения, выполнять нужные действия. Получать и отправлять сообщения будем посредством API telegram, а нужные действия организуем сами.

Итак, для получения сообщений есть процедура getUpdates, для отправки — SendMessage.

GetUpdates передаем в качестве параметров Offset и Timeout. Offset ставим равным −1, чтобы получать только последнее сообщение, а Timeout равным 1,чтобы не ждать ответа.

Напишем функцию чтения последнего сообщения:

Функция вернет нам данные о последнем сообщении, которое доступно боту — будь то персональное сообщение, или сообщение в группе. В данные сообщения входит информация об отправителе, номере сообщения, чате откуда оно поступило, и текст сообщения.

Теперь организцем функцию отправки сообщения:

Обработаем возможные исключения при отправке сформированного сообщения с помощью try {} catch {}.

Теперь мы умеем принимать и отправлять сообщения, то есть реагировать на команды и возвращать результат. Добавим еще две функции, которые желательны с учетом возможных нюансов работы — смену кодировки строки и проверку, является ли пользователь администратором группы. Кодировка нужна из-за того, что мы можем использовать команды разных сред и запросто столкнемся например с CP866. А проверка на права администратора нужна для хоть какой-то безопасности.

Осталось организовать выполнение команд и завершение работы.

Создадим текстовый файл, добавим туда наши будущие команды (все что нам может понадобиться для наших целей — тут уже у каждого в работе своя специфика и соответственно свои необходимые команды и действия). Например так:

/about — информация о боте /stop — выключение бота /dir <path> — список файлов в каталоге <path> /getserv <server> — получить список служб сервера /ping <server> — пинг сервера <server> /reboot <server> — перезагрузка windows-сервера <server> /restart <server> <service> — рестарт службы <service> на сервере <server>

Мы будем выводить этот файл если от пользователя получена непонятная команда.

И пишем собственно тело бота

И вот так, в цикле, получаем сообщение, сравниваем с предыдущим, разбираем команду, выполняем команду, докладываем ответ.

Действия можно реализовывать абсолютно любые, хоть управление кофе-машиной по дороге на работу. Да и у API разных полезных методов много.

Бот понимает команды из чата группы или личные сообщения. В личном сообщении, правда, пользователь не будет считаться администратором группы, и это правильно.

Всё, бот готов к работе.

Источник