Телеграмм-бот для системного администратора

Телеграмм-бот для системного администратора

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

Прежде чем продолжать у вас должен быть токен бота, чтобы зарегистрировать своего ботика и получить токен нужно найти пользователя @BotFather и написать ему. Нас интересует команда /newbot после чего потребуется наименование и имя бота, можете писать все что хотите главное в конце приставьте _bot. Когда имя будет подобрано вам BotFather вернет вам токен и ссылку на бота для быстрого добавления. На этом бота регистрация бота заканчивается.

Для быстрого добавления бота и чтобы было возможно быстро добавить его к себе лучше всего использовать специальную ссылку начинающуюся с символа @, взять его можно в инфо:

если такую ссылку комуто переслать то он может просто кликнуть по ней чтобы открыть чат с вашим ботом

Готовые шаблоны админботов

  • небольшой — всего около 300 строк
  • может исполнять команды описанные в функции logic
  • может получать и отправлять сообщения
  • может принимать файлы
  • есть проверка по паролю
  • ведет лог присланых команд
  • может открывать несколько сессий для одновременной работы (реализовано не полностью. Но взаимодействовать несколько человек одновременно могут
  • слишком простая авторизация. Пароль останется в чате на устройстве. Не может отличить устройства

Для запуска нужно получить токен бота у BotFather как описывается в начале статьи и прописать в переменную $token скрипта. Работать должно сразу.

Функционал добавлять в функцию logic

  • Небольшой — всего около 450 строк
  • Может исполнять команды описанные в функции logic
  • Может получать и отправлять сообщения
  • Может принимать файлы
  • Есть проверка по паролю, может дополнительно проверять chat_id
  • Ведет лог присланых команд
  • Может открывать несколько сессий для одновременной работы (реализовано не полностью. На последнем этапе прикручивалась консоль, если работать в ней то у других пользователей будет зависание и может быть кик по таймауту.
  • Может принимать файлы, складывает их в папочку
  • Может показывать файлы из папочки
  • Может удалять файлы из папки загрузки
  • Может запускать файл на исполнение (посредством start-process)
  • Показывает список серверов с которым производится работа (просто список имен в текстовом файле)
  • Пингует серверы из списка и показывает какие из них онлайн
  • Отключает компы из списка
  • Показывает пользователей залогинившихся на терминал, делает вызов внешнего скрипта (нужно установить на терминал PSTerminalServices)
  • Делает logoff пользователя на терминале. Входишь в режим консоли и потом пишешь имена пользователей (нужно установить на терминал PSTerminalServices)
  • Делает скриншот того компа на котором запущен (но не передает обратно)
  • Открывает ssh-сессию с устройством в сети и переходит в режим ввода команд (для примера кредиталы и адрес жестко зашиты в скрипт. Для работы требует установки на машину с которой будет вестись управление модуля работы с ssh poshSSH)
  • Обратная передача файлов (напишите кто знает как это сделать через powershell)
  • Неполноценная поддержка многопользовательской работы
  • Неполноценный режим консоли

Для запуска нужно получить токен бота у BotFather как описывается в начале статьи и прописать в конфигурационном файле config.csv. Работать должно сразу.

Функционал добавлять в функцию logic

В некоторых организациях по требованиям иб если пароль введен неверное определенное количество раз то лочится учетная запись на определенное время. Чтобы снять лок пользователь должен позвонить админу. Этот бот сделан так что ему можно написать имя учетной записи и он ее разблокирует, но не более 3х раз в сутки. При превышении лимита он перенаправит пользователя к системному администратору и отправит оповещение ему в чат.

Для запуска нужно получить токен бота у BotFather прописать токен в переменную $token. Выставить номер чата админа в $adminChatID. Прописать адрес доменной машины и кредиталы к ней:

Я встроил в примере функцию unlock прямо в скрипт, для постоянного использования лучше создать реакцию на событие в журнале и самому генерировать это событие. По событию будет запускаться скрипт unlock из места которое доступно только админам, так вы не забудете пароль от домена в скрипте. Это важно.

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

Для запуска нужно получить токен бота у BotFather прописать токен в переменную $token, прописать ваш чат в switch 235 строки. Работать должно сразу. Не забудьте добавить нужный вам чат в switch

Как работать с bot api

1. Принять сообщение

Нужно выполнить Invoke-WebRequest на адрес

— токен бота полученный от BotFather — для первого сообщения 0, для последующих номер последнего + 1. Если указывать последний номер то будете получать при каждом обращении последнее сообщение. — время которое телеграмм подождет ответа если его нет прежде чем вернуть обратно пустую структуру. Годится для создания задержки в боте. Я использовал в ботиках задержку в 1 секунду чтобы не ждать на отладке. на выходе получим структуру JSON которую парсим при помощи ConvertFrom-Json

Листинг кода №1

На выходе в объекте $obj будет сообщение и от кого оно пришло

2. Скачать файл

Если передается файл то в структуре JSON будут переданы дополнительные параметры. Чтобы получить файл нужно вытащить file_id из сообщения, затем обратится по адресу:

Запрос вернет структуру JSON содержащую путь для скачивания. Далее скачиваем файл по ссылке

Предположим что нам передали файл, тогда код для его скачивания будет выглядеть так:

3. Написать что-нибудь

Телеграмм-бот поддерживает 2 режима разметки текста markdown и html.

Внимание: в html-режиме тэг br не поддерживается

*bold text* — жирный текст _italic text_ — наклонный текст [text](http://www.example.com/) — ссылка `inline fixed-width code` — фиксированный

текстовый блок ```text pre-formatted fixed-width code block ```

Для переноса строк используйте последовательность %0A

Пример отправки сообщения

Если данный код даст ошибку например при отправке строки вот такого типа: