Как отправить сообщение в Telegram из powershell

image

По мотивам статьи Телеграмм-бот для системного администратора (статья не моя, я только прочитал) захотел поделиться опытом создания Telegram-бота на PowerShell для управления серверами приложений. Будет текст, код и немножко картинок. Конструктивная критика приветствуется ( главное чтобы не звучало «зачем на PowerShell? Надо было на perl» ).

Думаю что статья больше подойдет «новичкам» в PowerShell, но и опытные администраторы могут что-то полезное здесь увидеть.

Саму статью старался построить по частям – от простого к сложному. Возможно, встретится плагиат, будьте бдительны!

Итак, у нас есть необходимость осуществлять управление сервисами или приложениями на нескольких серверах (останавливать, запускать), перезагружать сервера, смотреть логи и еще какую-то информацию при необходимости. Всё это хочется делать (на самом деле нет), находясь в метро, в магазине или даже лёжа на диване, без VPN и ноутбуков. Из требований (которые были написаны, конечно, на коленке).

Сообщения из Avito в Telegram бесплатно

  • Простота добавления/изменения задач в Telegram-бот
  • Многозадачность или параллелизация
  • «Понятный» интерфейс управления
  • Хоть какая-то безопасность

Часть 1: простой телеграм-бот

BotFather

Пишем /newbot
Далее, нужно придумать имя боту (в моем случае я назвал Haaaabr специально для статьи) и username, который должен заканчиваться на «bot» (Haaaabr_bot)

После этого BotFather выдаст токен, который мы и будем использовать:

image

Дальше можно загрузить для бота картинку, поставить Description, создать список команд, но мне было лень.

Делаем простого бота, который будет принимать сообщения и отвечать на них.

Я буду писать код PS частями и периодически вставлять full-код для референса.

Для справки нам понадобятся описания вызовов API Telegram Bot API

Нам будет нужно 2 метода:

getUpdates – получение ботом(скриптом) сообщений
sendMessage – отправка сообщений ботом(скриптом) пользователю

Там же, видим, что:

Making requests
All queries to the Telegram Bot API must be served over HTTPS and need to be presented in this form: api.telegram.org/bot/METHOD_NAME

Шаг 1 – прием сообщений
Переменные

# Token $token = «***********************» # Telegram URLs $URL_get = «https://api.telegram.org/bot$token/getUpdates» $URL_set = «https://api.telegram.org/bot$token/sendMessage»

Теперь будем проверять, что отдает вызов $URL_get

Invoke-RestMethod -Uri $URL_get

Нот бэд. Напишем что-нибудь боту:

Hello

PoshGram — a PowerShell module for sending Telegram messages


# Token $token = «***********************» # Telegram URLs $URL_get = «https://api.telegram.org/bot$token/getUpdates» $URL_set = «https://api.telegram.org/bot$token/sendMessage» Invoke-RestMethod -Uri $URL_get

Очевидно, что нам нужен result. Сразу скажу, что нас интересует только последнее сообщение от пользователя, поэтому так:

# Token $token = «***********************» # Telegram URLs $URL_get = «https://api.telegram.org/bot$token/getUpdates» $URL_set = «https://api.telegram.org/bot$token/sendMessage» $json = Invoke-RestMethod -Uri $URL_get $data = $json.result | Select-Object -Last 1 $data.update_id $data.message.chat.id $data.message.text $data.message.chat.first_name $data.message.chat.last_name $data.message.chat.type $data.message.chat.username

Теперь нужно сделать confirm, что мы получили сообщение. Делается это все также, через метод getUpdates с параметром offset:

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

Invoke-RestMethod «$($URL_get)?offset=$($($data.update_id)+1)» -Method Get | Out-Null

И кидаем это все в цикл c таймаутом в 1 секунду:

# Token $token = «***********************» # Telegram URLs $URL_get = «https://api.telegram.org/bot$token/getUpdates» $URL_set = «https://api.telegram.org/bot$token/sendMessage» # timeout sec $timeout = 1 while($true) # вечный цикл

Теперь сделаем из этого функцию чтения сообщений. Т.к. нам нужно возвращать несколько значений из функции – решили использовать HashTable (именованный/ассоциативный массив)

Скрипт получения сообщений

Шаг 2 – отправка данных
Для отправки сообщения нам нужен метод sendMessage и поля chat_id и text (остальные опционально https://core.telegram.org/bots/api#sendmessage).

Сразу запилим функцию

sendMessage $URL_set «Тест123»

получим сообщение в телеге.

Шаг 3 – собираем все вместе

Ниже весь код для отправки-получения сообщений

Показать код

Дальнейшую логику можно строить на основе $return.text и, например, оператора switch:

switch -Wildcard ($return[«text»]) < «*привет*» < sendMessage $URL_set $return.chat_id «Привет, $($return[«f_name»])» >»*как дела?*» < sendMessage $URL_set $return.chat_id «Хорошо» >default >

Get-Random

в командлете Get-Random используются emoji, в код в статье у меня их встроить не получилось, но PS понимает их нативно

Часть 2: нужны кнопки

Icon

В телеграм боте есть опция задания списка команд (открывается вот по этому значку )
Первоначально мы так и сделали – был набор команд, в качестве параметров передавали туда имена серверов или сервисов. Потом решили, что нужно двигаться дальше в сторону User Friendly интерфейсов и подключили функционал кнопок.

Используется вызвов sendMessage c параметром reply_markup

Для нашего функционала мы использовали тип InlineKeyboardMarkup
https://core.telegram.org/bots/api#inlinekeyboardmarkup .

Из описания следует, что поле inline_keyboard– это массив из массива кнопок

(Array of Array of InlineKeyboardButton )

Пробуем сделать тестовую отправку кнопок

Проверяем что содержит переменная $json

< «reply_markup»: < «inline_keyboard»: [ «System.Collections.Hashtable System.Collections.Hashtable» ] >, «chat_id»: **********, «text»: «Test Text», «parse_mode»: «Markdown» >

Видимо как-то не очень передавать объект HashTable («System.Collections.Hashtable System.Collections.Hashtable») для api телеграма. Немного гугла и итог – при конвертации в Json ставим глубину конвертации

Buttons

Делаем функцию по отправке кнопок, на вход будем подавать массив кнопок

Собираем все воедино, немного поменяв блок switch

Теперь на «привет» бот будет отправлять нам пару кнопок. Осталось понять, какую кнопку нажал пользователь. В текущей ps-функции getUpdates есть проверка на

Еще по теме:  Телеграмм бесплатное приложение или нет

if($text).

При нажатии на кнопку никакой текст не возвращается, соответственно, нужно модифицировать функцию. Нажимаем на кнопку

PushTheButton

И запускаем кусок кода для проверки содержимого $data

# Token $token = «***********************» # Telegram URLs $URL_get = «https://api.telegram.org/bot$token/getUpdates» $URL_set = «https://api.telegram.org/bot$token/sendMessage» # timeout sec $timeout = 1 function getUpdates($URL) < $json = Invoke-RestMethod -Uri $URL $data = $json.result | Select-Object -Last 1 $data $ht[«chat_id»] = $chat_id $ht[«text»] = $text $ht[«f_name»] = $f_name $ht[«l_name»] = $l_name $ht[«username»] = $username return $ht > #> > getUpdates $URL_get

Никакой message больше не прилетает. Вместо него теперь callback_query. Правим функцию

Теперь функция возвращает text, если есть сообщение, или callback_data, если было нажатие на кнопку. На этапе тестов словили ошибку при вызове:

sendMessage $URL_set $($return.chat_id) $($return.callback_data)

Так как parse_mode выставлен в Markdown, а отправляемый текст

$return.callback_data = “Project1_CD”

нужно перед отправкой форматировать сообщение, подробнее тут:
https://core.telegram.org/bots/api#formatting-options
или убрать нижнее подчеркивание «_»

Итоговый скрипт

Часть 3: делаем конфиг

Настало время всё вынести в конфиг. Тут все просто – делаем xml:

Описываем задачи (tasks) и для каждой задачи указываем скрипт или команду.
Проверяем:

[xml]$xmlConfig = Get-Content -Path («c:TempHabrtelegram_bot.xml») $token = $xmlConfig.config.system.token $timeout = $xmlConfig.config.system.timeout.’#text’ foreach($task in $xmlConfig.config.tasks.task)
Собираем в основной скрипт

Теперь, если написать «привет» — бот вернет список кнопок, который соответствует задачам, описанным в xml-файлы. В callback_data будет команда или скрипт.

Если делать косметические изменения – то желательно, чтобы кнопок было 3-4 на строку, иначе они отображаются не полностью:

KeyBoard

Будем делать по 3 кнопки в линию (максимально).

Схематично массив keyboard должен выглядеть так:

Keyboard

Таким образом:
Button[i] — массив (ассоциативный) вида

Line[1-3] — это массивы (из кнопок), которые хранят в себе массивы кнопок (это важно)
Keyboard – массив из Line’ов.

Модифицируем функцию sendKeyboard

Keyboard_Telegram

Итоговый скрипт

Часть 4: задачность и многозадачность

Настало время по кнопке делать дела.

Для многозадачности будем использовать механизм Job’ов. Проверяем такой кусок кода:

$script = «ipconfig» $script_block = < Param($script) ; Invoke-Expression $script >$job_name = «TestJob» Start-Job -ScriptBlock $script_block -ArgumentList $script -Name $job_name | Out-Null

И через 5 секунд выполняем:
foreach($job in (Get-Job | Where ))

$output должен возвращать ipconfig с localhost

Добавляем это в основной скрипт, в блок callback_data

# если было нажатие на кнопку elseif($return.callback_data) < $script = $($return.callback_data) $job_name = $($return.chat_id) $script_block = < Param($script) ; Invoke-Expression $script >#запускаем Job Start-Job -ScriptBlock $script_block -ArgumentList $script -Name $job_name | Out-Null >
# смотрим, какие job’ы уже выполнились foreach($job in (Get-Job | Where ))

Проверяем, ловим error
Invoke-RestMethod:

На просторах интернета находим информацию, что длина сообщения не может превышать 4096 символов. Оукей…

$output.Length

говорит что длина 39
Долго думаем что не так, в результате пробуем такой кусок кода:

$text = $null foreach($string in $output) < $text = «$text`n$string» >sendMessage $URL_set $job.Name $text
Пробуем всё вместе

Output

Теперь прикрутим «немного безопасности»

Добавляем в xml конфиг новую строку, назовем ее users и укажем там chat_id тех, кому можно общаться с ботом:

********************************* 1 111111111, 222222222

В скрипте будем получать массив users

$users = (($xmlConfig.config.system.users).Split(«,»)).Trim()
if($users -contains $return.chat_id)
Скрипт целиком

Часть 5: в заключение

Проверяем функционал бота – добавим туда скриптов, которые будут делать что-то полезное
Для операций на удаленных серверах мы используем Invoke-Command с последующим Write-Output

$hostname = «hostname» $service = «MSSQLSERVER» $output = Invoke-Command -ComputerName $hostname -ScriptBlock -ArgumentList $service write-output $output.Value

В этом случае, учетная запись, из-под которой будет работать скрипт телеграм-бота должна иметь соответствующие привилегии на удаленной машине.

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

Наверняка у кого-то будет проблема с отправкой сообщения > 4096 символов, но это решаемо Substring и циклом отправки.

И напоследок – удаленное управление из любой точки мира (почти из любой) это хорошо, но всегда есть риск, что что-то пойдет не так (управление ботом вдруг может получить кто-то нехороший). На этот случай мы просто добавили Exit из скрипта по определенному слову


У меня всё.

  • powershell
  • telegram bots

Источник: habr.com

Пишем бота для Telegram на PowerShell.

telegrambotfather

Идея создания помощника системного администратора в виде бота для мессенджера давно не давала покоя, и вот руки дошли до написания кода на PS. Бот умеет получать сообщения в виде команд, производить с командами определённые действия и возвращать результат в ту группу, где он прочитал команду. В целях безопасности реализована фильтрация по группам Telegram, чтобы ботом не могли воспользоваться посторонние.

Описание работы и код разбираются далее

$token = «:» $uri = «https://api.telegram.org/bot$token/sendMessage»

На просторах Интернета я нашёл готовые функции для PowerShell, которые позволят принимать команды из telegram, записывать их в переменную, публиковать сообщения в определённые группы:

#Смена кодировки function ConvertTo-Encoding ([string]$From, [string]$To) < Begin< $encFrom = [System.Text.Encoding]::GetEncoding($from) $encTo = [System.Text.Encoding]::GetEncoding($to) >Process < $bytes = $encTo.GetBytes($_) $bytes = [System.Text.Encoding]::Convert($encFrom, $encTo, $bytes) $encTo.GetString($bytes) >>
#Флаг завершения работы, при начале работы сброшен $token = «56622550:Najsh9869xh9uzyHhd097» $exit = $false; #Получим последнее доступное сообщение и запомним его номер и канал $msg = GetMessage; $LastId = $msg.Message_ID; $LastChat = $msg.chat_id; #Прочтем наш текстовый файл с командами $commandlist = gc ‘c:scriptsbot_commands.txt’ #И цикл пока не поднимется флаг $exit Do

В секцию Do <> мы будем вписывать наши конструкции обработки сообщений в группе Telegram.

switch ($msg.text) < #Если получена команда /stop — поднимем флаг $exit и работа бота завершится ‘/stop’ < #Но только если команду давал админ if (IsAdmin $msg.sender_ID $msg.chat_id) < $exit = $true;SendMessage «Понял, отключаюсь» $msg.chat_id >else >

Еще по теме:  Беседа слив девочек подростков ТГ

Пишем первую команду:

Далее нам понадобится определить ID чатов (групп), в которых будет проходить обработка команд. Нужно отправить команду боту в этой группе. После чего нужно открыть ссылку https://api.telegram.org/bot $token /getUpdates, и найти в выводе ID нужной группы. Теперь можно фильтровать группы, в которых бот будет отвечать на команды конструкцией ($msg.chat_id -eq «»).

Используем эту конструкцию для запуска утилиты whois, если получена команда /whois :

Можно применять расширенные фильтры для введённой команды. Например, мы можем требовать ввода минимальной длины команды. В следующем блоке мы выполняем поиск в Active Directory всех учётных записей, похожих на введённый параметр команды /getaduser:

А теперь из разряда высшего пилотажа, получаем графики из Zabbix по нужному объекту мониторинга.

Вводим начальные переменные:

Получаем все объекты мониторинга из Zabbix и сравниваем с введённой командой:

Если переданный вместе с командой хост/узел найден в результатах запроса к Zabbix, то делаем запрос по нужному URL к Zabbix’у, фильтруем графики по ключевым словам «Memory»,»CPU lo»,»ICMP». В URL указываем параметры графиков — за последние сутки (86 400 сек.). Затем сохраняем графики в папке «C:Scriptszabbix_graphs» в виде файлов .PNG и передаём в группу Telegram с помощью утилиты CURL.

Источник: embersfireonweb.wordpress.com

Telegram-бот для управления инфраструктурой

Telegram-бот для управления инфраструктурой

2020-01-12 в 19:46, admin , рубрики: powershell, telegram bots, системное администрирование

image

По мотивам статьи Телеграмм-бот для системного администратора (статья не моя, я только прочитал) захотел поделиться опытом создания Telegram-бота на PowerShell для управления серверами приложений. Будет текст, код и немножко картинок. Конструктивная критика приветствуется ( главное чтобы не звучало «зачем на PowerShell? Надо было на perl» ).

Думаю что статья больше подойдет «новичкам» в PowerShell, но и опытные администраторы могут что-то полезное здесь увидеть.

Саму статью старался построить по частям – от простого к сложному. Возможно, встретится плагиат, будьте бдительны!

Итак, у нас есть необходимость осуществлять управление сервисами или приложениями на нескольких серверах (останавливать, запускать), перезагружать сервера, смотреть логи и еще какую-то информацию при необходимости. Всё это хочется делать (на самом деле нет), находясь в метро, в магазине или даже лёжа на диване, без VPN и ноутбуков. Из требований (которые были написаны, конечно, на коленке).

  • Простота добавления/изменения задач в Telegram-бот
  • Многозадачность или параллелизация
  • «Понятный» интерфейс управления
  • Хоть какая-то безопасность

В какой то момент было решено выносить конфиг в отдельный файл – в нашем случае xml (тут кто-то может сказать, что давайте всё в json, но мы сделали в xml и были довольны)
Начнем с начала:

Часть 1: простой телеграм-бот

BotFather

Пишем /newbot
Далее, нужно придумать имя боту (в моем случае я назвал Haaaabr специально для статьи) и username, который должен заканчиваться на «bot» (Haaaabr_bot)

После этого BotFather выдаст токен, который мы и будем использовать:

image

Дальше можно загрузить для бота картинку, поставить Description, создать список команд, но мне было лень.

Делаем простого бота, который будет принимать сообщения и отвечать на них.

Я буду писать код PS частями и периодически вставлять full-код для референса.

Для справки нам понадобятся описания вызовов API Telegram Bot API

Нам будет нужно 2 метода:

getUpdates – получение ботом(скриптом) сообщений
sendMessage – отправка сообщений ботом(скриптом) пользователю

Там же, видим, что:

Making requests
All queries to the Telegram Bot API must be served over HTTPS and need to be presented in this form: api.telegram.org/bot/METHOD_NAME

Шаг 1 – прием сообщений
Переменные

# Token $token = «***********************» # Telegram URLs $URL_get = «https://api.telegram.org/bot$token/getUpdates» $URL_set = «https://api.telegram.org/bot$token/sendMessage»

Теперь будем проверять, что отдает вызов $URL_get

Invoke-RestMethod -Uri $URL_get

Нот бэд. Напишем что-нибудь боту:

Hello

# Token $token = «***********************» # Telegram URLs $URL_get = «https://api.telegram.org/bot$token/getUpdates» $URL_set = «https://api.telegram.org/bot$token/sendMessage» Invoke-RestMethod -Uri $URL_get

Очевидно, что нам нужен result. Сразу скажу, что нас интересует только последнее сообщение от пользователя, поэтому так:

# Token $token = «***********************» # Telegram URLs $URL_get = «https://api.telegram.org/bot$token/getUpdates» $URL_set = «https://api.telegram.org/bot$token/sendMessage» $json = Invoke-RestMethod -Uri $URL_get $data = $json.result | Select-Object -Last 1 $data.update_id $data.message.chat.id $data.message.text $data.message.chat.first_name $data.message.chat.last_name $data.message.chat.type $data.message.chat.username

Теперь нужно сделать confirm, что мы получили сообщение. Делается это все также, через метод getUpdates с параметром offset:

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

Invoke-RestMethod «$($URL_get)?offset=$($($data.update_id)+1)» -Method Get | Out-Null

И кидаем это все в цикл c таймаутом в 1 секунду:

# Token $token = «***********************» # Telegram URLs $URL_get = «https://api.telegram.org/bot$token/getUpdates» $URL_set = «https://api.telegram.org/bot$token/sendMessage» # timeout sec $timeout = 1 while($true) # вечный цикл

Теперь сделаем из этого функцию чтения сообщений. Т.к. нам нужно возвращать несколько значений из функции – решили использовать HashTable (именованный/ассоциативный массив)

Скрипт получения сообщений

Шаг 2 – отправка данных
Для отправки сообщения нам нужен метод sendMessage и поля chat_id и text (остальные опционально https://core.telegram.org/bots/api#sendmessage).

Сразу запилим функцию

sendMessage $URL_set «Тест123»

получим сообщение в телеге.

Шаг 3 – собираем все вместе

Ниже весь код для отправки-получения сообщений

Показать код

Дальнейшую логику можно строить на основе $return.text и, например, оператора switch:

switch -Wildcard ($return[«text»]) < «*привет*» < sendMessage $URL_set $return.chat_id «Привет, $($return[«f_name»])» >»*как дела?*» < sendMessage $URL_set $return.chat_id «Хорошо» >default >

Еще по теме:  Как в Телеграмме убрать заблокированные контакты

Get-Random

в командлете Get-Random используются emoji, в код в статье у меня их встроить не получилось, но PS понимает их нативно

Часть 2: нужны кнопки

Icon

В телеграм боте есть опция задания списка команд (открывается вот по этому значку )
Первоначально мы так и сделали – был набор команд, в качестве параметров передавали туда имена серверов или сервисов. Потом решили, что нужно двигаться дальше в сторону User Friendly интерфейсов и подключили функционал кнопок.

Используется вызвов sendMessage c параметром reply_markup

Для нашего функционала мы использовали тип InlineKeyboardMarkup
https://core.telegram.org/bots/api#inlinekeyboardmarkup .

Из описания следует, что поле inline_keyboard– это массив из массива кнопок

(Array of Array of InlineKeyboardButton )

Пробуем сделать тестовую отправку кнопок

Проверяем что содержит переменная $json

< «reply_markup»: < «inline_keyboard»: [ «System.Collections.Hashtable System.Collections.Hashtable» ] >, «chat_id»: **********, «text»: «Test Text», «parse_mode»: «Markdown» >

Видимо как-то не очень передавать объект HashTable («System.Collections.Hashtable System.Collections.Hashtable») для api телеграма. Немного гугла и итог – при конвертации в Json ставим глубину конвертации

Buttons

Делаем функцию по отправке кнопок, на вход будем подавать массив кнопок

Собираем все воедино, немного поменяв блок switch

Теперь на «привет» бот будет отправлять нам пару кнопок. Осталось понять, какую кнопку нажал пользователь. В текущей ps-функции getUpdates есть проверка на

if($text).

При нажатии на кнопку никакой текст не возвращается, соответственно, нужно модифицировать функцию. Нажимаем на кнопку

PushTheButton

И запускаем кусок кода для проверки содержимого $data

# Token $token = «***********************» # Telegram URLs $URL_get = «https://api.telegram.org/bot$token/getUpdates» $URL_set = «https://api.telegram.org/bot$token/sendMessage» # timeout sec $timeout = 1 function getUpdates($URL) < $json = Invoke-RestMethod -Uri $URL $data = $json.result | Select-Object -Last 1 $data $ht[«chat_id»] = $chat_id $ht[«text»] = $text $ht[«f_name»] = $f_name $ht[«l_name»] = $l_name $ht[«username»] = $username return $ht > #> > getUpdates $URL_get

Никакой message больше не прилетает. Вместо него теперь callback_query. Правим функцию

Теперь функция возвращает text, если есть сообщение, или callback_data, если было нажатие на кнопку. На этапе тестов словили ошибку при вызове:

sendMessage $URL_set $($return.chat_id) $($return.callback_data)

Так как parse_mode выставлен в Markdown, а отправляемый текст

$return.callback_data = “Project1_CD”

нужно перед отправкой форматировать сообщение, подробнее тут:
https://core.telegram.org/bots/api#formatting-options
или убрать нижнее подчеркивание «_»

Итоговый скрипт

Часть 3: делаем конфиг

Настало время всё вынести в конфиг. Тут все просто – делаем xml:

Описываем задачи (tasks) и для каждой задачи указываем скрипт или команду.
Проверяем:

[xml]$xmlConfig = Get-Content -Path («c:TempHabrtelegram_bot.xml») $token = $xmlConfig.config.system.token $timeout = $xmlConfig.config.system.timeout.’#text’ foreach($task in $xmlConfig.config.tasks.task)
Собираем в основной скрипт

Теперь, если написать «привет» — бот вернет список кнопок, который соответствует задачам, описанным в xml-файлы. В callback_data будет команда или скрипт.

Если делать косметические изменения – то желательно, чтобы кнопок было 3-4 на строку, иначе они отображаются не полностью:

KeyBoard

Будем делать по 3 кнопки в линию (максимально).

Схематично массив keyboard должен выглядеть так:

Keyboard

Таким образом:
Button[i] — массив (ассоциативный) вида

Line[1-3] — это массивы (из кнопок), которые хранят в себе массивы кнопок (это важно)
Keyboard – массив из Line’ов.

Модифицируем функцию sendKeyboard

Keyboard_Telegram

Итоговый скрипт

Часть 4: задачность и многозадачность

Настало время по кнопке делать дела.

Для многозадачности будем использовать механизм Job’ов. Проверяем такой кусок кода:

$script = «ipconfig» $script_block = < Param($script) ; Invoke-Expression $script >$job_name = «TestJob» Start-Job -ScriptBlock $script_block -ArgumentList $script -Name $job_name | Out-Null

И через 5 секунд выполняем:

foreach($job in (Get-Job | Where ))

$output должен возвращать ipconfig с localhost

Добавляем это в основной скрипт, в блок callback_data

# если было нажатие на кнопку elseif($return.callback_data) < $script = $($return.callback_data) $job_name = $($return.chat_id) $script_block = < Param($script) ; Invoke-Expression $script >#запускаем Job Start-Job -ScriptBlock $script_block -ArgumentList $script -Name $job_name | Out-Null >
# смотрим, какие job’ы уже выполнились foreach($job in (Get-Job | Where ))

Проверяем, ловим error
Invoke-RestMethod:

На просторах интернета находим информацию, что длина сообщения не может превышать 4096 символов. Оукей…

$output.Length

говорит что длина 39
Долго думаем что не так, в результате пробуем такой кусок кода:

$text = $null foreach($string in $output) < $text = «$text`n$string» >sendMessage $URL_set $job.Name $text
Пробуем всё вместе

Output

Теперь прикрутим «немного безопасности»

Добавляем в xml конфиг новую строку, назовем ее users и укажем там chat_id тех, кому можно общаться с ботом:

610373243:AAF7Z0HnruKYsPwtkuupi01XqVOV-PtXgFM 1 111111111, 222222222

В скрипте будем получать массив users

$users = (($xmlConfig.config.system.users).Split(«,»)).Trim()
if($users -contains $return.chat_id)
Скрипт целиком

Часть 5: в заключение

Проверяем функционал бота – добавим туда скриптов, которые будут делать что-то полезное
Для операций на удаленных серверах мы используем Invoke-Command с последующим Write-Output

$hostname = «hostname» $service = «MSSQLSERVER» $output = Invoke-Command -ComputerName $hostname -ScriptBlock -ArgumentList $service write-output $output.Value

В этом случае, учетная запись, из-под которой будет работать скрипт телеграм-бота должна иметь соответствующие привилегии на удаленной машине.

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

Наверняка у кого-то будет проблема с оправкой сообщения > 4096 символов, но это решаемо Substring и циклом отправки.

И напоследок – удаленное управление из любой точки мира (почти из любой) это хорошо, но всегда есть риск, что что-то пойдет не так (управление ботом вдруг может получить кто-то нехороший). На этот случай мы просто добавили Exit из скрипта по определенному слову

Источник: www.pvsm.ru

Рейтинг
( Пока оценок нет )
Загрузка ...