Telegram интеграция с active directory
По мотивам статьи Телеграмм-бот для системного администратора (статья не моя, я только прочитал) захотел поделиться опытом создания Telegram-бота на PowerShell для управления серверами приложений. Будет текст, код и немножко картинок. Конструктивная критика приветствуется ( главное чтобы не звучало «зачем на PowerShell? Надо было на perl» ).
Думаю что статья больше подойдет «новичкам» в PowerShell, но и опытные администраторы могут что-то полезное здесь увидеть.
Саму статью старался построить по частям – от простого к сложному. Возможно, встретится плагиат, будьте бдительны!
Итак, у нас есть необходимость осуществлять управление сервисами или приложениями на нескольких серверах (останавливать, запускать), перезагружать сервера, смотреть логи и еще какую-то информацию при необходимости. Всё это хочется делать (на самом деле нет), находясь в метро, в магазине или даже лёжа на диване, без VPN и ноутбуков. Из требований (которые были написаны, конечно, на коленке).
- Простота добавления/изменения задач в Telegram-бот
- Многозадачность или параллелизация
- «Понятный» интерфейс управления
- Хоть какая-то безопасность
Часть 1: простой телеграм-бот
Ищем папку-бота (не каталог) – BotFather (@BotFather) в Telegram
Пишем /newbot
Далее, нужно придумать имя боту (в моем случае я назвал Haaaabr специально для статьи) и username, который должен заканчиваться на «bot» (Haaaabr_bot)
После этого BotFather выдаст токен, который мы и будем использовать:
Дальше можно загрузить для бота картинку, поставить Description, создать список команд, но мне было лень.
Я буду писать код PS частями и периодически вставлять full-код для референса.
Для справки нам понадобятся описания вызовов API Telegram Bot API
Нам будет нужно 2 метода:
Там же, видим, что:
Теперь будем проверять, что отдает вызов $URL_get
Нот бэд. Напишем что-нибудь боту:
By default, updates starting with the earliest unconfirmed update are returned. An update is considered confirmed as soon as getUpdates is called with an offset higher than its update_id
И кидаем это все в цикл c таймаутом в 1 секунду:
Сразу запилим функцию
Шаг 3 – собираем все вместе
Дальнейшую логику можно строить на основе $return.text и, например, оператора switch:
Часть 2: нужны кнопки
В телеграм боте есть опция задания списка команд (открывается вот по этому значку )
Первоначально мы так и сделали – был набор команд, в качестве параметров передавали туда имена серверов или сервисов. Потом решили, что нужно двигаться дальше в сторону User Friendly интерфейсов и подключили функционал кнопок.
Используется вызвов sendMessage c параметром reply_markup
Из описания следует, что поле inline_keyboard– это массив из массива кнопок
Пробуем сделать тестовую отправку кнопок
Проверяем что содержит переменная $json
Видимо как-то не очень передавать объект HashTable («System.Collections.Hashtable System.Collections.Hashtable») для api телеграма. Немного гугла и итог – при конвертации в Json ставим глубину конвертации
Делаем функцию по отправке кнопок, на вход будем подавать массив кнопок
Собираем все воедино, немного поменяв блок switchТеперь на «привет» бот будет отправлять нам пару кнопок. Осталось понять, какую кнопку нажал пользователь. В текущей ps-функции getUpdates есть проверка на
При нажатии на кнопку никакой текст не возвращается, соответственно, нужно модифицировать функцию. Нажимаем на кнопку
И запускаем кусок кода для проверки содержимого $data
Никакой message больше не прилетает. Вместо него теперь callback_query. Правим функцию
Так как parse_mode выставлен в Markdown, а отправляемый текст
Часть 3: делаем конфиг
Настало время всё вынести в конфиг. Тут все просто – делаем xml:
Описываем задачи (tasks) и для каждой задачи указываем скрипт или команду.
Проверяем:
Теперь, если написать «привет» — бот вернет список кнопок, который соответствует задачам, описанным в xml-файлы. В callback_data будет команда или скрипт.
Если делать косметические изменения – то желательно, чтобы кнопок было 3-4 на строку, иначе они отображаются не полностью:
Будем делать по 3 кнопки в линию (максимально).
Схематично массив keyboard должен выглядеть так:
Таким образом:
Button[i] — массив (ассоциативный) вида
Line1 — это массивы (из кнопок), которые хранят в себе массивы кнопок (это важно)
Keyboard – массив из Line’ов.
Модифицируем функцию sendKeyboard
Часть 4: задачность и многозадачность
Настало время по кнопке делать дела.
Для многозадачности будем использовать механизм Job’ов. Проверяем такой кусок кода:
И через 5 секунд выполняем:
$output должен возвращать ipconfig с localhost
Добавляем это в основной скрипт, в блок callback_data
Проверяем, ловим error
Invoke-RestMethod:
говорит что длина 39
Долго думаем что не так, в результате пробуем такой кусок кода:
Теперь прикрутим «немного безопасности»
Добавляем в xml конфиг новую строку, назовем ее users и укажем там chat_id тех, кому можно общаться с ботом:
В скрипте будем получать массив users
Часть 5: в заключение
Проверяем функционал бота – добавим туда скриптов, которые будут делать что-то полезное
Для операций на удаленных серверах мы используем Invoke-Command с последующим Write-Output
В этом случае, учетная запись, из-под которой будет работать скрипт телеграм-бота должна иметь соответствующие привилегии на удаленной машине.
Также, я не затронул функционал логировая, но здесь, думаю, все просто, по желанию каждый сам может решить что он хочет логировать, а что нет.
И напоследок – удаленное управление из любой точки мира (почти из любой) это хорошо, но всегда есть риск, что что-то пойдет не так (управление ботом вдруг может получить кто-то нехороший). На этот случай мы просто добавили Exit из скрипта по определенному слову
Задача: поднять свой self-hosted мессенджер с преферансом и профурсетками доменной авторизацией и шифрованием.
Nulla: облачные решения вроде Slack или Teams не подходят. Причин три: небезопасно, дорого, нужен быстрый интернет и современное железо.
Unus: доменные логины — есть имена с кирилицей, поэтому jabber-варианты вроде Openfire сразу отпадают, потому что не умеют в UNICODE-логины.
Duo: в компании работают несколько доменов, надо их использовать одновременно. С прозрачной авторизацией, чтобы пользователи не вводили логины/пароли, а сразу развернуть MSI через GPO и в бой.
Tres: есть пользователи с Android-девайсами, они должны подключаться параллельно, с теми же доменными логинами. Через интернет, с шифрованием, максимально безопасно. И чтобы пуши работали.
Время на предварительный поиск такого месседжера не приводим, потому что это задача не из простых. Нужен реально живой проект, который пилится уже много лет. Мы же реально понимаем, что серьёзный корпоративный софт — это больше про поддержку, исправление недочётов и решение "боли" клиента, а не "клауд-бэйсд", "футуродевелопмент", "блокчейн-инновейшн" и вот это вот всё.
Для препарирования выбран MyChat — корпоративный мессенджер с давней историей, большим живым форумом поддержки на русском языке и, (внимание!) бесплатной версией на 20 конкурентных подключений. Без trial-периода. Его просто нет. Так бывает.
Время на запуск — 15 минут. Поехали.
1. Скачиваем и ставим дистрибутив сервера
00:00 Качаем дистрибутив с оф.сайта, нам нужен пока только сервер под Windows.
01:00 Запускаем инсталлятор, всё линейно и просто. Сервер ставим по умолчанию, подойдёт любая OS от Windows 7 и старше. Можно серверная, можно десктопная, x86/x64 — без разницы. Системные требования скромные, MyChat хорошо работает даже на допотопном по современным меркам железе.
Инсталлятор просит повышение привилегий UAC при старте, оно и понятно, зачем — установка идёт в Program Files. Дистрибутив с цифровой подписью, всё прилично.
В процессе установки программа просит email администратора и название компании, в которой она будет работать:
Email прописывается в профиль админа сервера, а название компании потом будет показываться в чате. Так что "Рога и копыта" не используем, а пишем что-то вменяемое :)
Автозапуск с Windows не делаем:
Забегая наперёд, скажу, что это нужно, чтобы запускать сервер службой. Ну а пока просто потренируемся с GUI-приложением.
03:00 Запускаем MyChat Server:
Разрешаем доступ. Таких запросов будет ещё два, для встроенного Web-сервера NodeJS и TURN-сервера для работы звонков.
03:10 Жмём кнопку "Администрирование" и заходим в админку:
Хочется пнуть разработчиков Openfire, ведь можно же сделать удобно и понятно, а не шариться судорожно по форумам в попытках узнать, а какой же дефолтовый логин и пароль у админа? :)
Система предупреждает нас, что надо будет поменять логин/пароль админа и впускает в консоль управления:
Админка шустрая, быстро работает и хорошо реагирует на команды управления.
Вся навигация делается через дерево слева, которое, как гармошка, открывается, когда выбрать корневой элемент. Возможностей и разных фич тут гора с тележкой, но всё грамотно разнесено по разделам + есть встроенная справка по F1. Открывается тут же, в браузере. В ней можно залипнуть на несколько часов :)
2. Импорт юзеров из домена
04:30 Заходим в импорт пользователей из домена:
Тут всё просто. Указываем хост контроллера домена и любого юзера с паролем, у которого есть право подключаться к домену. Это необязательно админ.
Подключение происходит через LDAP, втаскиваются пользователи, их фотографии, а также структура компании, если у вас всё толково разбросано по Organizational Units в дереве домена. Если нет — то можно только втянуть юзеров, подкрутив фильтр импорта, чтобы взять только тех, кого надо:
Нажимаем кнопку "Подключиться", а затем "Импортировать". Всё, учётки с доп. полями вроде email, должностями, email и телефонами импортированы.
3. Разворачиваем MSI пакет
06:00 Качаем MSI с сайта разработчиков и ставим его через GPO. Всё стандартно. Есть даже инструкция, как это делать, для тех, кто делает это первый раз или делал давно и уже подзабыл.
Есть, кстати, интересный нюанс, касаемо того, как лучше ставить клиентское приложение, MSI пакетом или по классике, обычным EXE-инсталлятором. Кто-то может возразить, мол, а зачем городить огород с обычным инсталлятором, нужно скрипты рисовать, чтобы автоматом развернуть приложение, а MSI — это решение "из коробки", одобренное самими майками Microsoft.
Всё так. Но если вы ставите MyChat Client EXE-инсталлятором, он по умолчанию предлагает ставить приложение в профиль Windows-пользователя. А MSI пакет ставится только в Program Files. По канону.
Из-за этого, когда будете ставить обновление, то для обновления через GPO пользователям надо сделать logoff/logon, чтобы политика применилась и обновление мессенджера накатилось. А если приложение установлено в C:\Users\%USERNAME%\AppData\Local\MyChat Client\ — обновление идёт прямо с вашего сервера MyChat, "на лету". Это реально очень удобно и быстро. Повышения привилегий UAС не требуется.
Какой вариант выбрать — решать вам. А вот справка в помощь, как автоматизировать установку приложения (ключи инсталлятора).
4. Включаем прозрачную авторизацию
08:00 Тут сразу "два в одном". Во-первых, клиентское приложение должно знать, что нужно использовать прозрачную авторизацию. Потому что в масштабах сервера разные типы авторизаций можно произвольно "миксовать". Что кому удобно.
А во-вторых, приложение должно знать, куда подключаться, это хост или IP сервера MyChat.
Чтобы настроить всё это, нужно накатить через те же групповые политики простой REG-файл такого вида:
REGEDIT4
[HKEY_CURRENT_USER\Software\MyChat Client]
"Domain" = "Domain_name"
"IP" = "IP_adress_MyChat_Server"
Этих двух полей достаточно. За подробностями и более тонкой настройкой стоит заглянуть в официальную справку (пункт 3).
5. Port mapping на роутере, чтобы подключить людей через интернет
12:00 Пункт необязательный, если у вас люди только в локальной сети или через VPN, то настройка проброса портов на роутере не понадобится.
Если же вы подключаете людей через интернет, то нужно настроить port mapping на роутере.
Список портов, которые нужно пробросить, указан в справке (зелёным цветом).
Для тех, кто слышит эти слова впервые, суть такая: есть внешний ("белый") IP адрес, доступный через интернет и выданный компании провайдером. Этот адрес присвоен роутеру, который раздаёт интернет в офисе.
На этот адрес будут подключаться люди через интернет.
Роутер настраивается так, что все обращения на свой адрес по указанным портам (TCP 2004, 443, 8888) он переадресовывает внутрь локальной сети на IP адрес, где работает MyChat Server (например, 192.168.10.100).
Если для вас это филькина грамота, лучше попросить специалиста настроить всё, это делается за пару минут. Штатная процедура, никакой магии.
После того, как всё настроили, можно чекнуть корректность через админку MyChat.
Теперь вы знаете всё :)
6. Доменный логин на Android-смартфоне
15:00 Здесь всё достаточно просто. Качаете приложение из маркета, запускаете, добавляете свой сервер, указываете логин юзера с доменом и пароль.
Никакой прозрачной авторизации, к сожалению. Но это, в принципе, логично. Это же смартфон, а не Windows-компьютер, авторизованный в домене.
В момент подключения к серверу Android-приложение передаёт по зашифрованному каналу логин и пароль доменного юзера на сервер MyChat, а тот уже через LDAP проверяет, можно ли делать логин. Если всё ок — вы попадаете в чат. После первого успешного логина вход делается автоматически.
7. Мультилогин и привязка к телефону
А вот WhatsApp сначала только на смартфоне, а уже потом на компьютере.
Но если у вас нет лишнего смартфона, или вы не хотите подключать свой номер телефона — то в большинство мессенджеров вам не попасть. Telegram, Viber, Line, Skype, WhatsApp — все требуют номер телефона.
С MyChat в этом плане сильно удобнее. Не хотите использовать номер телефона – никто не заставляет, входите по нику. Или по адресу электронной почты. Или доменным логином. Да хоть по UIN, как в лохматые 90-е в аське. В общем, вы поняли :)
Ограничений на количество одновременных "инкарнаций" на разных устройствах нет. Абы лицензий хватило.
Свяжите Active Chat и Телеграм за 5 минут.
Без программистов. Готовы начать прямо сейчас?
Создайте интеграцию Active Chat и Телеграм самостоятельно, без программистов
Другие готовые интеграции
Как интегрировать Active Chat и Телеграм
c помощью ApiX Drive
Теперь Вам не нужно привлекать программистов или интеграторов для автоматизации Active Chat и Телеграм.
С ApiX-Drive вы свяжете и автоматизируете работу этих систем за 5 минут, самостоятельно.
Укажите какие действия будут происходить между системами
Возможности автоматизации
Active Chat и Телеграм
Настройте один раз правила, по которым будут работать системы.
С заданным интервалом передавайте данные из Active Chat в Телеграм.
Популярные вопросы про интеграцию Active Chat и Телеграм
Как происходит интеграция Active Chat и Телеграм?
- Для начала нужно зарегистрироваться в ApiX-Drive
- Выбираете какие данные передавать из Active Chat в Телеграм
- Включаете автообновление
- Теперь данные будут автоматически передаваться из Active Chat в Телеграм
Сколько времени нужно на интеграцию?
В зависимости от системы, с которой вы будете делать интеграцию, время настройки может отличаться и составлять от 5-ти до 30-минут. В среднем настройка занимает 10-15 минут.
Сколько стоит интеграция Active Chat с Телеграм?
За саму интеграцию ничего платить не нужно и на всех тарифах доступен полностью весь функционал. Вы оплачиваете только количество данных, которые по факту передаются из одной вашей системы в другую через наш сервис. Если у вас количество данных в месяц небольшое, можете смело пользоваться бесплатным тарифом или перейти на платный, при необходимости. Подробнее о тарифах.
Сколько всего готовых интеграций доступно в Apix-Drive?
На данный момент у нас готово 312+ интеграций помимо Active Chat и Телеграм
Платформа ActiveChat включает в себя сервис для разработки чат-ботов с поддержкой AI и специализированную CRM для автоматизации работы службы поддержки. Ее чат-боты можно использовать в различных каналах общения с клиентами: в веб-чатах, мессенджерах, соцсетях и e-mail. Они имеют способность к самообучению, они могут понимать цели и даже эмоциональное состояние пользователей для более точного подбора реплик или вариантов действий. ActiveChat позволяет создавать чат-боты с AI без навыков программирования при помощи блочного конструктора. Есть возможность интеграции сервиса с разными CRM, а также Google Sheets и Calendars. Подробнее
Задача:
Создать телеграм бота и научится работать с ним в «1С:Предприятие 8», через long polling и webhooks, используя Telegram bot API.
В результате, будет сформирован токен доступа, который необходимо сохранить и держать в секрете, а созданного бота добавить себе в приложение «Телеграм».
2. Два способа работы с телеграм ботом.
При помощи «Telegram Bot API», есть два взаимоисключающих способа работы с телеграм ботом:
- Метод «getUpdates» – самостоятельно, выполняем запрос получения новых обновлений.
- Использование «Webhooks» – обновления приходят автоматически от сервера, на указанный URL-адрес.
Ответ приходит в виде JSON, не обработанные обновления хранятся на сервере до тех пор, пока бот их не получит, но они не будут храниться дольше 24 часов.
3. Подготовка конфигурации.
3.2 Создаем пустую (вспомогательную) конфигурацию и выполняем «Загрузить конфигурацию из файлов…», используя папку «src» (см. п. 3.1):
Коннектор: Загрузка конфигурации
Перенос общего модуля
4. Метод «getUpdates».
Из 1С, самостоятельно, периодически обращаемся к методу API «getUpdates», для получения 100 самых ранних неподтвержденных (не полученных ранее) обновлений, в виде JSON объекта «Update».
Для нашего примера, будет заполнен только параметр offset равным 0, для того чтобы получить все не обработанные обновления. Процедура обработки команды «Обновить» на клиенте:
Методы «ОбновитьНаСервере» и «ОбработатьОбновление»:
5. Использование «Webhooks»
Их нужно сохранить в шаблоне «C:\OpenServer\userdata\config\Apache_2.4-PHP_7.2-7.4_server.conf», для того чтобы при следующем запуске «Open Server» они не затерлись.
Для проверки воспользуемся приложением «Postman»:
В результате, внутренние локальные сервисы, станут доступны для внешнего взаимодействия:
Postman test ngrok
Для эксперимента, попробуем это сделать через «Postman»:
Для удаление webhook и переход на метод «getUpdates», достаточно вызвать метод «deleteWebhook»:
Читайте также: