Мессенджер Telegram можно использовать как средство мгновенного оповещения о различных событиях в инфраструктуре, результатах выполнения скриптов или заданий планировщика. В этой статье мы покажем, как отправить текстовое уведомление в канал или группу Telegram с помощью PowerShell через API бота.
Сначала нужно создать новый бот в Telegram с помощью @BotFather. Найдите этого бота в клиенте Telegram и отправьте ему команды:
/start
/newbot
Укажите название бота и имя пользователя. BotFather сгенерирует для вам HTTP токен, который нужно скопировать и сохранить.
Для оправки уведомления в чат Telegram или конкретному пользователю нужно получить его ID. В данном случае я будут отправлять уведомления себе, поэтому с помощью @my_id_bot я получу свой ID:
/start
Your user ID: 987654321
Для отправки сообщения в Telegram нужно указать токен бота и имя вашего пользователя (группы):
$tg_token="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
$tg_chat_id="987654321"
Для подключения к API Telegram нужно обязательно использовать протокол TLS 1.2. Убедитесь, что TLS 1.2 включен в вашей операционной системе Windows. PowerShell по умолчанию может использовать для подключения устаревшие протоколы SSL 3.0, TLS 1.0, или TLS 1.1. Чтобы использовать TLS 1.2 в текущей сессии, выполните команду:
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
Чтобы отправить сообщение в Telegram, выполните команду:
$message="Тестовое сообщение в Telegram из PowerShell"
$Response = Invoke-RestMethod -Uri "https://api.telegram.org/bot$($Telegramtoken)/sendMessage?chat_id=$($Telegramchatid)&text=$($Message)"
Вы должны получить сообщение от бота.
Чтобы сделать уведомления более наглядными и красочными, можно использовать символы emoji и HTML форматирование:
$message= $currend_data + "⚠️ Скрипт обновления <b>Update1C</b> завершен с ошибками"
$Response = Invoke-RestMethod -Uri "https://api.telegram.org/bot$($tg_token)/sendMessage?chat_id=$($tg_chat_id)&text=$($Message)&parse_mode=html"
Если в вашей сети доступ в интернет выполняется через прокси сервер, вы можете указать есть с помощью параметра
-Proxy
командлета Invoke-WebRequest. Для аутентификации на прокси можно использовать аргумент
-ProxyCredential
.
$Response = Invoke-RestMethod -Uri "https://api.telegram.org/bot$($Telegramtoken)/sendMessage?chat_id=$($Telegramchatid)&text=$($Message)" –Proxy "http://192.168.31.55:3128"
В PowerShell 7.x командлет Invoke-WebRequest использует настройки прокси, заданные в переменных окружения. Подробнее об использовании прокси в PowerShell.
Скрипт отправки сообщения в телеграм можно оформить в функцию и добавить ее в файл профиля PowerShell в Windows:
function Send-Telegram { [CmdletBinding()] param( [Parameter()] [string] $Message ) $tg_token="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" $tg_chat_id="987654321" [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 $Response = Invoke-RestMethod -Uri "https://api.telegram.org/bot$($tg_token)/sendMessage?chat_id=$($tg_chat_id)&text=$($Message)&parse_mode=html" return $Response }
notepad $PSHOME\Profile.ps1
Теперь вы можете использовать функцию отправки сообщения в канал Telegram из любого скрипта PowerShell. Достаточно выполнить команду:
Send-Telegram "My test message"
Небольшое уточнение:
$currend_data = (Get-Date).ToString()
Из статьи непонятно про $tg_chat_id
Мне удалось получить chat id из запроса:
https://api.telegram.org/bot1234567890:XXX-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/getupdates
Там нашлась строка:
«chat»:{«id»:1234567890
@my_id_bot ===> /start
В статье об этом сказано! )
В статье сказано, но на практике не работает. В этом и проблема. Поэтому я и написал. Если бы работало, то я писать бы не стал.
Все верно, с каналами так не работает.
Нужно:
1) Добавить бота в админы чата/канала
2) Запустить бот @RawDataBot и переслать ему любое сообщение из чата или канала
3) Он вернет JSON код сообщения и в нем нужно скопировать ID чата из
"forward_from_chat": {
"id": -1xxxxxxxxxx,
Чат ID всегда отрицательный
Годно , годно, но как по мне на питоне сделать проще, особенно если какие ни будь переменные пихать. Кстати, еще вроде в винде нужно включать выполнение скриптов, например из планировщика задач скрипт *.ps1 не сработает.
Верно, нужно настроить PowerShell Execution policy (https://winitpro.ru/index.php/2020/06/03/powershell-execution-policy-zapusk-scriptov/)
Или запускать скрипт с параметром -ExecutionPolicy Bypass:
%windir%\System32\WindowsPowerShell\v1.0\powershell.exe -Noninteractive -ExecutionPolicy Bypass –Noprofile -file c:\path\PSScript.ps1
Как можно добавить исполнение ps скрипта в план бекапов mssql?
1) Создать в Management Studio новый SQL job типа «PowerShell job step» указать путь к скрипту или запустить функцию прямо отсюда.
2) Сделать в плане бэкапа последнее задание «Execute SQL Server Agent Job Task» и выбрать ваше задание.
Скрипты выполнняются от SQL Server Agent