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

Телеграм-бот для системних адміністраторів. Це ні в якому разі не готовий проект, в ньому є над чим попрацювати. Це напівфабрикат і набір прийомів який кожен адмін може підпилювати під свої різні завдання.


У статті містяться приклади декількох ботів і приклади роботи з апі телеграм з powershell.

Тут міститься інформація як зарегать бота і отримати токенПерш ніж продовжувати у вас повинен бути токен бота, щоб зареєструвати свого ботика і отримати токен потрібно знайти користувача @BotFather і написати йому. Нас цікавить команда /newbot після чого буде потрібно найменування та ім'я бота, можете писати все що хочете головне в кінці приставте _bot. Коли ім'я буде підібрано вам BotFather поверне вам токен і посилання на бота для швидкого додавання. На цьому бота реєстрація бота закінчується.

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




якщо таке посилання комусь переслати то він може просто клацнути по ній щоб відкрити чат з вашим ботом

Готові шаблони админботов
Простий ботПлюси:

  • невеликий — всього близько 300 рядків
  • може виконувати команди описані в функції logic

  • може отримувати і відправляти повідомлення
  • може приймати файли
  • є перевірка по паролю
  • веде лог присланых команд
  • може відкривати декілька сесій для одночасної роботи (реалізовано не повністю. Але взаємодіяти кілька людей одночасно можуть
Мінуси:

  • занадто проста авторизація. Пароль залишиться в чаті на пристрої. Не може відрізнити пристрою
скачати простого бота можна звідси, в архіві міститься: 1. хелп з прикладами розмітки тексту; 2. ісходник

Для запуску потрібно отримати токен бота у BotFather як це описано на початку статті і прописати в змінну $token скрипта. Працювати має відразу.



Функціонал додавати в функцію logic

Складний ботПлюс:

  • Невеликий — всього близько 450 рядків
  • Може виконувати команди описані в функції logic

  • Може отримувати і відправляти повідомлення
  • Може приймати файли
  • Є перевірка по паролю, може додатково перевіряти chat_id
  • Веде лог присланых команд
  • Може відкривати декілька сесій для одночасної роботи (реалізовано не повністю. На останньому етапі прикручивалась консоль, якщо працювати в ній то у інших користувачів буде зависання і може бути кік по таймауту.
Функціонал який був реалізований для прикладу:

  • Може приймати файли, складає їх в папочку
  • Може показувати файли з папки
  • Може видаляти файли з папки завантаження
  • Може запускати файл на виконання (за допомогою start-process)
  • Показує список серверів з якими проводиться робота (просто список імен в текстовому файлі)
  • Пінг сервери зі списку і показує, які з них онлайн
  • Вимикає компи зі списку
  • Показує користувачів залогинившихся на термінал, робить виклик зовнішнього скрипта (потрібно встановити на термінал PSTerminalServices)
  • Робить logoff на терміналі користувача. Входиш в режим консолі і потім пишеш імена користувачів (потрібно встановити на термінал PSTerminalServices)
  • Робить скріншот того компа на якому працює (але не передає назад)
  • Відкриває ssh-сесію з пристроєм в мережі і переходить в режим уведення команд (для прикладу кредиталы та адресу жорстко зашиті в скрипт. Для роботи вимагає установки на машину з якої буде здійснюватися управління модуля роботи з ssh poshSSH)
З того, що не було реалізовано, але хотілося б:

  • Зворотна передача файлів (напишіть хто знає як це зробити через powershell)
  • Неповноцінна підтримка багатокористувацької роботи
  • Неповноцінний режим консолі
Скачати бота можна звідси, в архіві міститься:
1. хелп з прикладами розмітки тексту;
2. конфігураційний файл config.csv;
3. сам бот — abormot.ps1;
4. набір допоміжний файлів;
5. список компів для роботи в текстовому файлі ping-list.txt

Для запуску потрібно отримати токен бота у BotFather як це описано на початку статті і прописати в конфігураційному файлі config.csv. Працювати має відразу.



Функціонал додавати в функцію logic

Бот самообслуговування, робить Unlock учеток в доменіУ деяких організаціях за вимогами іб якщо пароль введений невірний певну кількість разів, то лочится обліковий запис на певний час. Щоб зняти лок користувач повинен подзвонити адміну. Цей бот зроблений так що йому можна написати ім'я облікового запису і він розблоковує її, але не більше 3 разів на добу. При перевищенні ліміту він перенаправляє користувача до системного адміністратора і відправить оповіщення йому в чат.

Скачати бота можна звідси.

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



Я вмонтував у прикладі функцію unlock прямо в скрипт, для постійного використання краще створити реакцію на подію у журналі і самому генерувати це подія. За події буде запускатися скрипт unlock з місця яке доступне тільки адмінам, так ви не забудете пароль від домену в скрипті. Це важливо.

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

Скачати бота можна звідси.

Для запуску потрібно отримати токен бота у BotFather прописати токен в змінну $token. Працювати має відразу. Не забудьте додати потрібний вам чат в switch

Як працювати з bot api
1. Прийняти повідомлення
Потрібно виконати Invoke-WebRequest адреса

https://api.telegram.org/bot{Токен}/getUpdates?offset={порядковий ID повідомлення}&timeout={час очікування перед поверненням в секундах}

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

Лістинг коду №1
$ChatTimeout = 1
$UpdateId = 0
$token = "bot token"

$URL = "https://api.telegram.org/bot$token/getUpdates?offset=$UpdateId&timeout=$ChatTimeout"

$Request = Invoke-WebRequest -Uri $URL -Method Get
$content = ConvertFrom-Json $Request.content

# якщо на виході 2 і більше результатів візьмемо тільки останній
$str = $content.result | select -First 1
$str = ($str).message

$props = [ordered]@{ 
ok = $content.ok
UpdateId = ($str).update_id
Message_ID = $str.message_id
first_name = ($str.from).first_name
last_name = ($str.from).last_name
chat_id = ($str.chat).id
text = $str.text
}
$obj = New-Object -TypeName PSObject -Property $props
$obj

На виході в об'єкті $obj буде повідомлення і від кого воно прийшло

2. Завантажити файл
Якщо передається файл в структурі JSON будуть передані додаткові параметри. Щоб отримати файл потрібно витягнути file_id з повідомлення, потім звернеться за адресою:

https://api.telegram.org/bot{token}/getFile?file_id={file_id з повідомлення}

Запит поверне структуру JSON містить шлях для скачування. Далі завантажуємо файл по посиланню

https://api.telegram.org/file/bot{token}/{file_path}

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


$ChatTimeout = 1
$UpdateId = 0
$token = "bot token"
$Path = "c:\"

##### Отримуємо повідомлення як зазвичай
$URL = "https://api.telegram.org/bot$token/getUpdates?offset=$UpdateId&timeout=$ChatTimeout"

$Request = Invoke-WebRequest -Uri $URL -Method Get
$content = ConvertFrom-Json $Request.content

# якщо на виході 2 і більше результатів візьмемо тільки останній
$str = $content.result | select -First 1
$str = ($str).message

##### Якщо повідомлення передається файл то будуть додаткові поля
# так, наприклад, ми можемо дізнатися, що нам передали картинку
if ( $($str.document).mime_type -eq "image/jpeg" ) { $isJPG = $true }

##### Якщо є file_name то значить там щось лежить
# документ на скачування є?
if ( $($str.document).file_name -ne $null ) {
### різні дані наприклад для логування
$DocFileName = ($str.document).file_name
$DocFileID = ($str.document).file_id
$DocFileSize = ($str.document).file_size

# отримуємо силка на файл виконуючи команду бота /getFile
$URL = "https://api.telegram.org/bot$token/getFile?file_id=$DocFileID"
$RequestFile = Invoke-WebRequest -Uri $URL

### у $RequestFile якщо все вірно міститься посилання на скачування
foreach ( $in JSON $((ConvertFrom-Json $RequestFile.Content).result) ) {
$FilePath = $json.file_path
$URL = "https://api.telegram.org/file/bot$token/$FilePath"
$FilePath = Split-Path -Leaf $FilePath
$Пропустити, результати = "$Path\$FilePath"

# качаємо без перевірки
Invoke-WebRequest -Uri $URL -OutFile $пропустити, результати
}
}

3. Написати що-небудь
Телеграм-бот підтримує 2 режиму розмітки тексту markdown та html.

Увага: у html-режимі тег br не підтримується

Приклади markdown розмітки*bold text* — жирний текст
_italic text_ — похилий текст
[text](http://www.example.com/) — посилання
`inline fixed-width code` — фіксований

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

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

Приклад відправки повідомлення


$token = "ваш токен"
$сhatid = "ID чату в який потрібно послати повідомлення"
$text = "привіт habr"

$payload = @{ "parse_mode" = "Markdown"; "disable_web_page_preview" = "True" }

$URL = "https://api.telegram.org/bot$token/sendMessage?chat_id=$сhatid&text=$text"

$request = Invoke-WebRequest -Uri $URL -Method Post `
-ContentType "application/json; charset=utf-8" `
-Body (ConvertTo-Json -Compress -InputObject $payload)

Якщо даний код дасть помилку наприклад при відправці рядка ось такого типу:


"$FDownload : file name is ""$($JSON.file_path)""; size $($json.file_size) kb"

Можна використовувати метод відправки складніше:


$token = "ваш токен"
$chat_id = "ID chata"
$text = "повідомлення"
$markdown = $true

$preview_mode = "True" 
if ($markdown) { $markdown_mode = "Markdown" } else {$markdown_mode = ""}

$payload = @{ "chat_id" = $chat_id;
"text" = $text
"parse_mode" = $markdown_mode;
"disable_web_page_preview" = $preview_mode;
}

$URL = "https://api.telegram.org/bot$token/sendMessaget"

$request = Invoke-WebRequest -Uri $URL `
-Method Post -ContentType "application/json; charset=utf-8" `
-Body (ConvertTo-Json -Compress -InputObject $payload)

Якщо хто знає, як закачати файл назад — скиньте, я доповню.
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.