Предлагается очередной небольшой пример велосипеда для отправки логов из MS Sql Server с использованием бота Telegram. Телеграмм для меня оказался очень удобным средством получения отчета о размере свободного места на дисках, гораздо удобнее электронной почты.
На infostart уже есть большое количество решений для отправки сообщений в Telegram из 1С. Но, мне не хотелось использовать 1С для такой задачи. Требования были просты – отправка сообщения о размере свободного пространства на локальных дисках по расписанию. Были варианты написания программы на с или java, но было решено пойти по самому простому пути – с помощью задания MS SQL Server. Делать почти ничего не нужно – только нажимай на кнопки мыши. Единственно, что необходимо придумать, - текст команды. Решено было сделать это с использованием PowerShell.
Текст скрипта:
#################################################################
$token = "128582948x:AAFN3xYJAxdxxxl-xxF_xxM8xt8NZFK4x5x"
$chat_id = "123456789"
$text = ""
get-wmiobject win32_volume | ? { $_.DriveType -eq 3 -and $_.driveletter} | Sort-Object -Property Name |ForEach-Object {
$text = $text + $_.Name+" %:"+[math]::round($_.FreeSpace/$_.Capacity*100,2)+ " abs: "+[math]::round($_.FreeSpace/1Tb,2)+"`n"
}
$URI = "https://api.telegram.org/bot" + $token + "/sendMessage?chat_id=" + $chat_id + "&text=" + $text
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
Invoke-WebRequest -URI ($URI) –UseBasicParsing
###############################################################
Пояснения:
$token – ключ бота-отправителя Telegram, получаем при создании бота из @BotFather;
$chat_id - идентификатор получателя Telegram, адресат может узнать свой идентификатор из @chat_id_echo_bot;
$text = "" - результирующая строка для отправки;
get-wmiobject win32_volume – получаем информацию о логических устройствах ;
| ? { $_.DriveType -eq 3 -and $_.driveletter} - отбираем только жесткие диски, игнорируем USB и CDROMы;
| Sort-Object -Property Name - сортируем ;
|ForEach-Object { - обходим массив дисков и информацию о каждом присоединяем к строке для отправки, где:
$_.Name – имя логического диска
[math]::round($_.FreeSpace/$_.Capacity*100,2) – процент свободного места на диске ; [math]::round($_.FreeSpace/1Tb,2) - размер свободного места на диске в Тб;
"`n" - перенос строки
Получаем примерно следующее сообщение:
«C:\% 78.38 abs 2.37
D:\% 49.60 abs 4.65
E:\% 21.54 abs12.33»
Далее отправляем сообщение:
Формируем запрос:
$URI = "https://api.telegram.org/bot" + $token + "/sendMessage?chat_id=" + $chat_id + "&text=" + $text
Устанавливаем протокол:
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
Отправка запроса:
Invoke-WebRequest -URI ($URI) –UseBasicParsing